发现Java有很多实用的方法如鼠标操作,可以通过获得鼠标反馈实现功能
可以通过重写paint方法来为游戏添加各种元素,paint是每次打印方框都会自动执行,
面对对象编程,思考游戏内所有东西归类如照片素材类,游戏元素类,然后可以创造一个共同的父类
问题:为什么不能在if里面写循环重绘
飞机大战的爆炸很有意思,在生成新的爆炸地点的时候,不直接赋予图片而是在方法里赋予,然后通过一张一张的小图片循环播放
飞机大战中各元素的生成其实是事先先在各个位置生成应有的元素,再在打印的时候去一个一个打印
问 为什么可以直接访问
答 因为在方法里面才能直接调用
飞机大战整体思路:
先创建一个窗口类,初始化所有属性,巧妙之处:弄一个死循环:然后每循环一次都打印一次画面:有助与状态的更新,因为如果在打印内进行状态转换很难,然后因为每次都要调用一次打印函数,相当于循环就在主程序·内弄一个循环,每次都判断游戏状态;然后把游戏内的所用到的全部对象都创建一个类,其中窗口并不是必须的,然后图片也可以在其中赋值,如爆炸类中,初始化时并不需要直接赋值图片,而是在生成爆炸图像的时候,弄一个数组装入需要产生的图片,然后每一个爆炸对象被遍历到时,每次打印都打印其中一张图片,然后下次打印继续打印
super内容就是原函数的内容,如如果把super放在爆炸循环之外,那么爆炸不会消失,而是会打印在那一个区域,因为他的图片只会是最后一张,而结束爆炸的原理就是当if不成立的时候,则super不会执行,那么就不打印了,
子弹产生的原理就是创造子弹数组,然后让子弹的坐标等于要产生子弹的目标的坐标然后根据需要,进行坐标的变化
其中坐标变化的原因是paint函数的不断执行,导致打印函数的执行,然后坐标变化、
然后碰撞检测就是通过目标的坐标以及宽高根据Java的提供的函数intersect函数进行检测
public boolean intersects(Rectangle r) {
int tw = this.width;
int th = this.height;
int rw = r.width;
int rh = r.height;
if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
return false;
}
int tx = this.x;
int ty = this.y;
int rx = r.x;
int ry = r.y;
rw += rx;
rh += ry;
tw += tx;
th += ty;
// overflow || intersect
return ((rw < rx || rw > tx) &&
(rh < ry || rh > ty) &&
(tw < tx || tw > rx) &&
(th < ty || th > ry));
}
最后游戏状态的转换就是根据飞机自身的血量和boss血量,其中不要在弄循环,因为无论当前状态是什么,下一次都会进行状态检测,不要弄循环了
飞机大战结束、