以前做画图板和五子棋敲代码一点思路都没有,在老师的引导下,最近在做弹球碰撞界
时,一步一步从简单到复杂来做,渐渐理出了思绪,真正理解了程序和代码之间的区别,就像胡总说的,代码不会,方法不会这都不要紧,关键是要有自己的思路,自己的想法,如果自己有好的想法,这样就可以跟着自己的思路去寻找自己需要的方法。。。
对于一个初学者来说,怎样做一个界面,首先列一个步骤,从1,2,3到。。。,一步一步完成,这样就会思路清晰很多
对于这次弹球碰撞界面:
步骤如下:
第一:画一个窗体界面,里面有按钮、中间面板、中间边框及画布
第二:能够画不留痕迹的多个小球,注意这里用到了动作监听器,及创建线程小球类及在动作监听器里面创建线程小球类对象
第三:能够随机小球出现时的位置和颜色
第四:边界碰撞和小球之间碰撞的方法的问题,注意
无论是边界碰撞,还是小球之间的碰撞,尽量不要用数字,
在解决小球之间碰撞时,要知道每时每刻每个小球的运动状态即位置
怎没解决呢 ,可以通过创建一个队列,将所有小球都加进去(因为每个小球对 象都是通过创建监听器方法
获得的,所以可以在此方法中添加,判断小球之间的碰撞时,将小球遍历出来就行了 )
第五:改变窗体大小时可以实现重绘,即得到每个小球的位置及颜色,解决方法是遍历小球,通过super.paint(g);通过g来调用画椭圆设置颜色的方法
注意,总共有3个画布,一个是中间面板获取得画布,一个是在线程小球类里面构造函数方法时传入的画布,一个就是重绘时执行paint(Graphics g)和super.paint(g)时
用途:中间面板获取的画布在BallFrame实现Runnable时,重写run()方法时有center.repaint()不停的调用重回方法时需要画布
小球线程类里面传入画布 是因为在BallFrame 里面定义了一个画布,有BallThread ball=new BallThread(g);目的其实是将BallFrame里面的画布传到类里面,可以绘出小球线程的运动
重绘时执行paint(Graphics g)的画布是为了保存改变窗体大小时,所设置的颜色方法和画的椭圆
第六: 双缓冲问题:因为每点击一次按钮就会出现一个小球,而且每间歇一次,多个小球调用,没走一次都调用屏幕(g.setColor()||g.fillOval());这样就会出现闪屏
解决方法是:我们可以创建一个可以获得画布的图片Image img=this.createImage(this.getPreferredSize().width,this.getPreferredSize().height);该图片可以获得画布
即:Graphics g=img.getGraphics(); 给画布设置图片背景:ImageIcon icon=new ImageIcon("MM.png");
g.drawImage(icon.getImage(), 1, 1,398,398,null);
双缓冲是在重绘的时候用到,即先把每个小球线程的位置先放到图片获取的画布上
然后将图片绘制在屏幕上
public void paint(Graphics g1)让g1.drawImage(img,0,0)
//重绘的方法
class Mypanel extends JPanel{
public void paint(Graphics g){
//为了解决闪屏问题,使用双缓冲:将center上的数据先保存到一张图片上,在保存到g上,目的减少对画布的调用
//创建一幅用于双缓冲的、可在屏幕外绘制的图像。
Image img=this.createImage(this.getPreferredSize().width,this.getPreferredSize().height);
//从图片上获取画布
Graphics2D g2 = (Graphics2D)img.getGraphics();
//直接调用父类中的方法,要在创建图标之前,否则会覆盖
super.paint(g2);
//创建图表对象
ImageIcon icon=new ImageIcon("MM.png");
//绘制背景
g2.drawImage(icon.getImage(), 1, 1,398,398,null);
//要把所有的小球的位置颜色重新绘制在窗体上当每次改变窗体大小的时候
//所以要把小球遍历出来
for(BallThread ball:BallThread.balls){
//而画布的子类画椭圆的方法是double型
Ellipse2D.Double oval=new Ellipse2D.Double(ball.x,ball.y,ball.ballsize,ball.ballsize);
g2.setColor(ball.color);
g2.fill(oval);
//g2.fillOval((int)ball.x, (int)ball.y,ball.ballsize,ball.ballsize);
}
//将图片绘制在屏幕上
g.drawImage(img, 0, 0, null);
}
}
分享到:
相关推荐
在本项目"swift-PZXDynamicAnimatorView-重力弹球界面以及滑动弹球的封装"中,我们主要探讨的是如何利用Swift来实现一个具有动态效果的重力弹球界面,以及对滑动弹球的封装技术。 `PZXDynamicAnimatorView`是这个...
"弹球自由落体碰撞反弹"是一个典型的物理模拟游戏,让我们深入探讨一下这个项目中涉及的技术点。 首先,标题中的"弹球自由落体碰撞反弹"表明这个游戏的核心机制是基于物理学中的自由落体运动和碰撞反弹。在计算机...
当弹球碰撞检测到墙壁时,线程会更新弹球的方向,使其反弹,这需要线程间的同步来避免数据竞争。Java提供了多种线程同步机制,如synchronized关键字、wait/notify机制、ReentrantLock等。在这个程序中,开发者可能会...
这款游戏的核心在于利用JAVA语言的特性来实现弹球的物理运动模拟,包括碰撞检测、速度控制和得分计算等多个方面。 首先,JAVA语言是这款弹球游戏的基石,它是一种跨平台的编程语言,具有丰富的类库和强大的面向对象...
2. Timer1_Tick事件:这是游戏的主要循环,每次触发更新弹球位置,检测碰撞,并更新界面。 3. Form_KeyDown和Form_KeyUp事件:响应用户键盘输入,控制挡板上下移动。 4. 弹球与挡板/边界碰撞的判断:通过坐标比较,...
弹球游戏是计算机科学中的经典案例,它可以帮助初学者理解游戏开发的基本概念,如物理模拟、碰撞检测和图形用户界面(GUI)设计。 首先,我们要搭建开发环境。对于C#开发,我们可以使用Microsoft的Visual Studio ...
当发生碰撞时,根据碰撞点和碰撞角度改变弹球的运动方向。 3. 控制逻辑: - 挡板控制:监听键盘事件,根据按键方向调整挡板的位置。 - 游戏规则:设定弹球触底即为游戏结束,同时记录弹球与挡板的碰撞次数作为...
2. **碰撞检测**:游戏中的关键部分是弹球与不同物体之间的碰撞检测。这通常涉及到几何学和物理原理,例如判断两个圆形是否相交,或者判断一个矩形是否与另一个矩形或线段碰撞。在HTML5游戏中,通常会使用精确的算法...
同时,为了增加游戏体验,可以添加音效,如弹球碰撞的声音,这需要集成音频库如DirectX或SDL。 最后,为了使程序更加完善,我们还需要处理错误和异常,提供用户友好的界面提示,以及可能的退出和重置游戏功能。 在...
`AudioControl`类则负责处理游戏的声音效果,包括弹球碰撞、得分等音效。 `run.bat`文件是一个批处理脚本,用于启动游戏。在Windows系统中,双击运行这个文件可以启动Java应用程序。而`.class`文件是Java编译后的...
弹球碰撞、得分等事件可以配合音效增强游戏体验。可以使用开源的音频库,如OpenAL或SFML,加载和播放预设的音频文件。 六、异常处理与错误调试 任何程序都可能出现错误,因此编写良好的错误处理代码至关重要。通过...
2. 撞击检测:检测弹球与挡板或边界之间的碰撞,以改变弹球的运动方向。 3. 游戏逻辑:根据时间更新弹球的位置,当弹球落下边界时结束游戏。 4. 用户交互:提供开始、暂停、重置等控制功能。 5. 绘图:在JPanel或...
【弹球小游戏源码】是一款基于Java编程语言开发的小型游戏项目,主要涵盖了游戏逻辑、图形界面和事件处理等核心知识点。在这个项目中,开发者利用Java的Swing库或者JavaFX库来创建用户界面,通过Java的面向对象编程...
在iOS开发中,创建一个弹球游戏是一种常见的实践,它能帮助开发者熟悉Objective-C(简称OC)编程语言以及苹果的UIKit框架。在这个场景下,"ios中的弹球游戏"和"oc中的弹球游戏"指的是使用Objective-C来构建一个基于...
3. **碰撞检测**:游戏的核心部分是判断弹球与挡板或边界之间的碰撞。这需要计算弹球的当前位置和下一帧位置,然后比较它们与挡板或边界的关系。C#提供了数学运算库,帮助我们进行几何计算,判断是否发生碰撞,并...
这个程序可能包含了一些基本的图形用户界面(GUI)元素,如窗口、图像和动画效果,以及一些基本的物理模拟,如弹球的碰撞检测和运动轨迹计算。 首先,我们来详细了解一下C语言。C语言是一种强大的、底层的编程语言...
5. **声音效果**:弹球游戏通常会包含弹球碰撞、得分等音效,这需要集成音频库来播放和管理声音资源。 6. **对象和状态管理**:弹球、挡板、得分等都是游戏中的对象,它们有自己的属性和状态。游戏逻辑需要维护这些...
1. **图形用户界面(GUI)设计**:游戏可能使用Windows Forms或WPF(Windows Presentation Foundation)库来创建用户界面,包括游戏窗口、控件(如弹球和挡板)以及动画效果。 2. **事件处理**:C#中的事件处理机制...
7. **碰撞检测**:为了模拟真实世界的物理行为,弹球游戏需要实现碰撞检测算法,判断弹球与边界、障碍物之间的碰撞,并根据碰撞规则改变弹球的运动方向。 综上所述,“弹球游戏(Java程序)”是一个集成了Java编程...
碰撞检测包括弹球与挡板、弹球与屏幕边缘以及弹球与砖块之间的碰撞,通常需要使用条件语句和几何知识。 5. **物理模拟**:简单的物理规则,如重力和弹性碰撞,可以被引入到游戏中增加真实性。例如,设置一个常量...