多线程与打砖块总结

多线程与打砖块游戏总结
当我们打游戏的时候,游戏画面人物能在一个屏幕里面到处各种乱动,其中就是用到了线程。如果把时间放大,那么我们就可以清楚的看到,在某个时间段里面其实也就只有一个人物在运动,然而只是因为这段时间太短了,我们人眼感觉不出来,错觉的认为是同时执行的。多线程,其实就是用到内存共享,在短时间内切换来达到似乎是同时运行的效果。
实现多线程的方法:
继承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();
}
}
如此一来,小球就可以在游戏画面里运动了,并且可以碰到挡板反弹。而且可以在队列里面分类,通过砖块的坐标不同来进行不同关卡的设置。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值