多线程与打砖块游戏总结
当我们打游戏的时候,游戏画面人物能在一个屏幕里面到处各种乱动,其中就是用到了线程。如果把时间放大,那么我们就可以清楚的看到,在某个时间段里面其实也就只有一个人物在运动,然而只是因为这段时间太短了,我们人眼感觉不出来,错觉的认为是同时执行的。多线程,其实就是用到内存共享,在短时间内切换来达到似乎是同时运行的效果。
实现多线程的方法:
继承thread 类
使用runnable接口
两种方法,都要通过重写父类的run()方法,然后在实例化了的对象中,调用start()方法开始线程。
线程的几种状态:
创建
此时刚实例化,新生的线程对象就处于新建状态(此时它已经有了内存空间和其他资源)。
运行
线程此时已经具备了运行的各种条件了,等到下一次时间空闲转换的时候,优先等级高的线程就先占有cpu进行运行。而优先等级低的则还在队伍中排着队。
挂起
当线程占着cpu不放,则会导致cpu一直在运行该线程,而其他就进行不了。这是不合理的,所以就可以用sleep方法,进行休眠,等到过了指定的时间后,才继续安排线程排队。
死亡
当run()方法里面的语句执行完,或者对线程进行关闭。则线程就会释放对内存的使用。
用线程实现闹钟功能
闹钟总体思路
1 获取现在的时间
// 取得现在的时间date
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date);
2 然后输入时间,设置间隔几分钟的时间
3 获取输入的时间,进行现在的时间还有之后的时间进行对比
// 任务执行,时间设定间隔为一分钟
Timer timer = new Timer();
String i = jtf2.getText();//获取到输入框里面的时间
long k = Integer.parseInt(i);
timer.schedule(al, nowtime - date.getTime(), k * 1000 * 60);
//对当前时间和设定的时间进行对比,设定多久之后响
然后触发文本监听器。
public class AlarmListner extends TimerTask{
public void run() {
System.out.println("hahahahahahha");
}
}
打砖块游戏简介:
步骤
小球的运动
小球的运动是通过线程的休眠,然后每次启动线程后x坐标与y坐标的改变配合上时间,就可以看成是有着速度的小球在游戏画面里面动来动去的了。
小球的x坐标与y坐标的改变量不是一成不变的,在碰到窗体之后,位移改变量就往另一个方向。
/**
* 小球碰到右壁的的运动方法
*/
private void play_right(){
if(now_X>=500-Ball_size){
speed_X=-speed_X;
}
}
其他方向类似该方法,只是坐标有点变化
挡板的运动
挡板类通过继承mouseadapter类,重写了里面的mousemoved方法,可以得到鼠标移动时坐标的值。和小球一样,每当线程因睡眠过后,x坐标值改变,在新的x坐标值的地方重新画一个挡板,并把之前的挡板给覆盖掉。
挡板的运动只是x坐标改变,对于y坐标则是不变的。而且挡板也不能超出游戏界面,必须进行判断,当鼠标移出了界面时,挡板还是在游戏界面里面
//开始画挡板,颜色为界面背景颜色
g.setColor(jpanel.getBackground());
g.fillRoundRect(tx-Dangban_length/2,
Dangban_Y-5,Dangban_length,Dangban_height+10, 15, 15);
//获取鼠标移动时的横坐标
DangbanX=e.getX();
//实例化一个图像对象
BufferedImage image=ImageIO.read(new File("images/border.jpg"));
g.drawImage(image,DangbanX-Dangban_length/2,
Dangban_Y,Dangban_length,Dangban_height,null);
砖块的实现
砖块重新定一个类,使用队列把砖块的对象装进来,之后在游戏的画面上,如果打到了砖块,则在队列中移除该砖块,经过睡眠之后就没有在画布上画出来了。
/**
* 第一关地图的方法
* @return一个队列
*/
public DuiLie getMap1(){
DuiLie duilie=new DuiLie();
//实例化第一排砖块,并添加到队列中
for(int i=0,j=0;i<5;i++){
Brick brick=new Brick(i*(100+1),j,g);
duilie.add(brick);
}
//实例化第二排砖块,并添加到队列中
for(int i=0,j=51;i<5;i++){
Brick brick=new Brick(i*(100+1),j,g);
duilie.add(brick);
}
//实例化第三排砖块,并添加到队列中
for(int i=0,j=102;i<5;i++){
Brick brick=new Brick(i*(100+1),j,g);
duilie.add(brick);
}
return duilie;
}
小球击中砖块,挡板,窗体的实现方法
上面已经介绍了小球击中窗体右方的方法
当小球击中砖块时,就在装着砖块的队列里面把该砖块给移除,然后小球根据击中砖块四个方向中的哪一个方向,进行相应的位移改变,可能是x坐标相反,或y坐标相反,也可能同时都反方向。同时也得考虑画小球的起始坐标和挡板的坐标之间的差值
小球击中挡板与小球集中砖块的方法类似,也是判断小球与挡板的坐标,判断出小球此时击中挡板的哪个方向。
小球击中砖块时播放声音
public void music(){
File f=new File("musics/shake.wav");//获取音乐文件
try {
URL url=f.toURL();
AudioClip ac=Applet.newAudioClip(url);
ac.play();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
如此一来,小球就可以在游戏画面里运动了,并且可以碰到挡板反弹。而且可以在队列里面分类,通过砖块的坐标不同来进行不同关卡的设置。
分享到:
相关推荐
总结,VB.NET创建打砖块游戏是一个很好的实践项目,它涵盖了面向对象编程、图形界面设计、事件处理、碰撞检测等基础编程概念。通过这个项目,开发者不仅能熟悉VB.NET的语法和.NET Framework的功能,还能锻炼解决问题...
《打砖块小游戏带音效》是一款基于Java编程语言开发的趣味休闲游戏,它结合了经典的游戏机制与音频效果,为玩家提供了丰富的娱乐体验。在本文中,我们将深入探讨这款小游戏的设计原理、Java编程基础、音效处理以及...
总结来说,"java打砖块源码加注释"是一个极好的学习资源,涵盖了Java GUI编程、事件处理、图形绘制、面向对象设计和多线程等多个Java编程的关键知识点。通过研究这个项目,开发者可以提升自己的Java编程技能,并对...
总结来说,"同时玩30个球的打砖块游戏"利用了特定的碰撞检测策略、并发处理、物理模拟以及资源管理等技术,实现了高效且富有挑战性的游戏体验。这样的设计不仅考验了开发者的编程技巧,也为玩家提供了独特的游戏乐趣...
- **碰撞检测**:通过检查球与挡板及砖块的位置关系,实现碰撞后的方向改变。 - **游戏结束条件**:当球落到屏幕底部时,游戏结束。 ### 5. 运行环境与调试 - **开发工具**:Eclipse IDE。 - **编译与运行**:确保...
五、多线程与异步处理 为了保证游戏运行的流畅性,避免主线程阻塞,游戏的动画和逻辑计算可能在单独的线程或AsyncTask中执行。这使得用户界面能够及时响应用户的操作,同时保证游戏的实时性。 六、状态管理与游戏...
总结起来,JavaBrickBreaker项目提供了一个学习和练习Java编程的实战场景,涵盖了GUI编程、事件处理、对象建模、碰撞检测、多线程、状态管理等多个方面,对于提高Java编程技能和理解游戏开发流程具有极大的帮助。
实验三:打砖块游戏设计 1. **碰撞检测**:学习如何检测游戏中不同物体(如小球、砖块和挡板)之间的碰撞,这是游戏物理效果的关键。 2. **游戏难度**:增加生命值和增加消除砖块的难度,以及分数系统的设计,增加了...
总结起来,"java代码-楼梯电梯代码"涵盖了动态规划、递归、多线程模拟等编程概念,这些都是Java开发者必备的知识点。通过理解和实践这类问题,能提高编程技巧,对解决复杂问题的能力有很大帮助。
- **多线程**:使用`Thread.sleep`控制游戏循环的速度。 - **随机数生成**:使用`Random`类为鱼生成随机的初始位置。 - **事件驱动**:通过不断重绘界面来实现动态效果。 - **面向对象设计**:通过类和对象的方式...