飞机大战第三天
1,画分数和画命的实现步骤:
(1)hero---getLife()获取生命值:
/** 获取英雄机的命 */
public int getLife(){
return life; //返回命数
}
2)ShootGame---paint(g){
......
paintScore(g); //画分和命
}
/** 重写paint() g:画笔*/
public void paint(Graphics g){
g.drawImage(background,0,0,null); //画背景图
paintHero(g); //画英雄机对象
paintFlyingObjects(g); //画敌人(敌机+小蜜蜂)对象
paintBullets(g); //画子弹对象
paintScoreAndLife(g); //画分和画命
paintState(g); //画状态
}
3)ShootGame----paintScoreAndLife(g){
设置颜色g.setColor(...)
设置字体g.setFont(...)
画分g.drawString(...);
画命g.drawString(...);
}
/** 画分和画命 */
public void paintScoreAndLife(Graphics g){
g.setColor(new Color(0xFF0000)); //设置颜色(纯红)
g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,24)); //设置字体样式(字体:SANS_SERIF 样式:BOLD加粗 字号:24)
g.drawString("SCORE: "+score,10,25);
g.drawString("LIFE: "+hero.getLife(),10,45);
}
2.英雄机与敌人碰撞的实现步骤:
1)Hero---boolean hit(FlyingObject other);
/** 英雄机与敌人的碰撞算法 this:英雄机 other:敌人 */
public boolean hit(FlyingObject other){
int x1 = other.x-this.width/2; //x1:敌人的x-1/2英雄机的宽
int x2 = other.x+other.width+this.width/2; //x2:敌人的x+敌人的宽+1/2英雄机的宽
int y1 = other.y-this.height/2; //y1:敌人的y-1/2英雄机的高
int y2 = other.y+other.height+this.height/2; //y2:敌人的y+敌人的高+1/2英雄机的高
int x = this.x+this.width/2; //x:英雄机的x+1/2英雄机的宽
int y = this.y+this.height/2; //y:英雄机的y+1/2英雄机的高
return x>=x1 && x<=x2
&&
y>=y1 && y<=y2; //x在x1与x2之间,并且,y在y1与y2之间,即为撞上了
}
2)Hero---substractLife()
clearDoubleFire();
/** 英雄机减命 */
public void subtractLife(){
life--; //命数减1
}
/** 英雄机增火力 */
public void addDoubleFire(){
doubleFire+=40; //火力值增40
}
/** 清空英雄机的火力值 */
public void clearDoubleFire(){
doubleFire = 0; //火力值归零
}
3)ShootGame----action(){
重写run(){
...
hitAction(); //检测英雄机与敌人撞
repaint();
}
}
public void run(){ //定时干的那个事--10毫秒走一次
if(state==RUNNING){ //运行状态时执行
enterAction(); //敌人(敌机+小蜜蜂)入场
stepAction(); //飞行物(敌机+小蜜蜂+子弹+英雄机)走一步
shootAction(); //子弹入场(英雄机发射子弹)
outOfBoundsAction(); //删除越界的飞行物(敌机+小蜜蜂+子弹)
bangAction(); //子弹与敌人(敌机+小蜜蜂)的碰撞
hitAction(); //英雄机与敌人(敌机+小蜜蜂)的碰撞
checkGameOverAction(); //判断游戏结束
}
repaint(); //重画(调用paint()方法)
}
4)hitAction(){
遍历所有敌人,获取每一个敌人f
判断hero.hit(f){
减命
火力值清零
删除被撞的敌人(交换,缩容)
}
}
5)action(){
重写run(){
...
checkGameOverAction(); //检测游戏结束
repaint();
}
}
6)checkGameOverAction(){
if(hero.getLife()<=0){ //游戏结束了
}
}
/** 英雄机与敌人(敌机+小蜜蜂)的碰撞 */
public void hitAction(){//10毫秒走一次
for(int i=0;i<flyings.length;i++){ //遍历所有敌人
FlyingObject f = flyings[i]; //获取每一个敌人
if(hero.hit(f)){ //撞上了
hero.subtractLife(); //英雄机减命
hero.clearDoubleFire(); //英雄机清空火力值
//交换被撞的敌人与数组中的最后一个元素
FlyingObject t = flyings[i];
flyings[i] = flyings[flyings.length-1];
flyings[flyings.length-1] = t;
//缩容(去掉最后一个元素,即被撞的敌人对象)
flyings = Arrays.copyOf(flyings,flyings.length-1);
}
}
}
/** 判断游戏结束 */
public void checkGameOverAction(){ //10毫秒走一次
if(hero.getLife()<=0){ //游戏结束了
state=GAME_OVER; //修改当前状态为游戏结束状态
}
}
3.画状态的实现步骤:
1)START,RUNNING,PAUSE,GAME_OVER
state=START;(存储当前状态)
2)paint(){
...
paintState(g);
}
3)paintState(g){
START状态--贴start图
PAUSE状态--贴pause图
GAME_OVER状态--贴gameover图
}
4)run(){
if(state==RUNNING){
一堆action();
}
repaint();
}
5)mouseMoved(){
if(state==RUNNING){
获取x,y,调英雄机移动方法
}
}
6)重写mouseClicked(){
若为启动状态,则改为运行状态
若为游戏结束状态,则:
清理现场(hero,flyings,bullets,score)
改为启动状态
}
7)checkGameOverAction(){
if(hero.getLife()<=0){
state=GAME_OVER;
}
}
8)重写mouseExited(){
if(state == RUNNING){
state = PAUSE;
}
}
9)重写mouseEntered(){
if(state == PAUSE){
state = RUNNING;
}
}