教你如何一步一步用Java实现飞机大战(三)

飞机大战第三天

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;
      }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值