飞机大战代码及思路
飞机大战
score:0
<script> var bg=document.getelementsbyclassname("bgimage"); bg[0].style.top="-700px"; bg[1].style.top="0px"; setinterval(function(){ for(var i=0;i
思路分析
1.画地图,完成游戏背景,让背景图片无缝滚动。
2.创建用户飞机的类,类里包括
用户飞机的属性(width,height,src,x,y,_user(存储用户飞机对象))
创建用户飞机的方法createuser()
用户飞机随着鼠标移动的方法usermove(x,y)
3.实例化一个用户飞机,调用创建用户飞机的方法。
4.给地图添加鼠标移动事件,调用用户飞机移动方法,同时将鼠标的坐标传给usermove(x,y);
5.创建子弹的类,类里包括
子弹的属性(width,height,src,x,y,_shouter(存储子弹对象))
创建子弹的方法 creategun(user);传参是因为要通过用户飞机的位置定义子弹产生的位置。
子弹向上移动的方法 gunmove(index,arry);传参是因为当子弹超出地图时,要删除子弹这个实例。
6.通过定时器每200ms实例化一个子弹,调用创造子弹的方法创造子弹;每5ms让所有子弹都调用子弹移动方法向上移动一次。
注:因为要遍历子弹,所以要统计子弹的数量。方法:定义一个空数组的全局变量,每实例化一个子弹,给这个数组追加一个子弹对象元素。
7.创建敌机的类,类里包括
敌机的属性(width,height,src,blood,score,x,y,_enemy(存储敌机对象));
创建敌机的方法;
敌机移动的方法;
注:由于敌机的种类不同,他们的宽,高,图片路径,血量不一样,所以应给敌机的类设置形参,属性width,height,src,blood,score的值应为参数的值,如果不传递参数的话定义这些属性为默认值(小飞机)。eg:this.width=w||40;this.height=h||30;....
8.用定时器每1000ms实例化一个敌机,调用创造敌机的方法创建一个敌机对象。每10ms让所有敌机调用敌机移动方法向下移动一次。
注:这里和子弹一样,要定义一个空数组,每创建一个敌机,给这个数组用push方法追加一个敌机元素。方便遍历敌机,控制所有敌机向下移动。
创建敌机时,敌机分为大敌机和小敌机。利用判断一个随机数的大小是否小于0.7,设置百分之七十的概率产生小飞机,百分之三十的概率产生大飞机,大飞机需要设置参数,小飞机不传参则使用默认参数。
9.判断子弹打到敌机,给子弹类添加判断子弹打到敌机的方法,打到敌机时,此子弹删除,此敌机掉血,血量为零时删除此敌机并计分。
注:子弹和敌机删除时,不仅要删除dom元素,还要删除实例化对象。
在判断子弹打到敌机时,一开始的判断方法存在bug。当用户飞机在敌机的后面时,子弹位置也满足删除条件,也可打掉敌机。处理方法:控制子弹的y必须在敌机height的范围内。
10.判断用户飞机撞击敌机,如果用户飞机飞到敌机范围内,则弹出游戏结束。清除所有定时器。此时发现用户飞机还能移动,清除地图的鼠标移动事件。
注:一开始是在用户飞机移动方法中判断的。此处存在bug,即在用户飞机未移动的情况下,是不会撞死的。原因是在鼠标移动时,才调用用户飞机移动的方法,而鼠标不动时,不会调用飞机移动方法,因此也不会撞死。
解决方法:在敌机移动中去判断用户飞机是否撞击敌机。
11.添加背景音乐。
12. 测试出bug:当飞机飞到最高处时,会报错。原因:在调用判断子弹撞击敌机方法时,子弹已超出地图,子弹被删除,因此数组长度为0,s_gun[i]为未定义。会报错。
解决方法:在调用判断子弹撞击敌机方法时,再判断一次。如果s_gun[i]为未定义,直接return;不进行判断。
0.7){>上一篇: 我是不是应该高兴呢
下一篇: MYSQL如何通过一张表更新另外一张表?