Mario开发流程(五)

将场景和障碍物结合起来

在BackGround的构造方法中构造第1个场景,主要是在场景中定位障碍物的位置

public class BackGround {
	private BufferedImage bgImage=null;//当前场景的显示图片
	public BufferedImage getBgImage() {
		return bgImage;
	}

	private int sort;//保存当前场景的顺序
	private boolean flag;//当前是否为最后一个场景
	private List allEnemy=new ArrayList();//全部的敌人
	private List<Obstruction> allObstruction=new ArrayList<Obstruction>();//全部的障碍物
	private List removedEnemy=new ArrayList();//被消灭的敌人
	private List removedObstruction=new ArrayList();//被移除的障碍物
	public List<Obstruction> getAllObstruction() {
		return allObstruction;
	}

	public BackGround(int sort, boolean flag) {
		super();
		this.sort = sort;
		this.flag = flag;
		if(flag){//如果是最后一个场景
			bgImage=StaticValue.endImage;
		}else{
			bgImage=StaticValue.bgImage;
		}
		/*********************************/
		//第1个场景
		if(sort==1){
			//创建地面
			for(int i=0;i<15;i++){
				allObstruction.add(new Obstruction(i*60, 540, 9));
			}
			
			//绘制砖块和?
			this.allObstruction.add(new Obstruction(120, 360, 4));
			this.allObstruction.add(new Obstruction(300, 360, 0));
			this.allObstruction.add(new Obstruction(360, 360, 4));
			this.allObstruction.add(new Obstruction(420, 360, 0));
			this.allObstruction.add(new Obstruction(480, 360, 4));
			this.allObstruction.add(new Obstruction(540, 360, 0));
			this.allObstruction.add(new Obstruction(420, 180, 4));
			
			//绘制水管
			this.allObstruction.add(new Obstruction(660, 540, 6));
			this.allObstruction.add(new Obstruction(720, 540, 5));
			this.allObstruction.add(new Obstruction(660, 480, 8));
			this.allObstruction.add(new Obstruction(720, 480, 7));		
			
		}
	}
	
	//重置方法,将所有障碍物和敌人返回到原有坐标,并将其状态也修改 
	public void reset(){
		
	}	
}


修改MainFrame类

public class MainFrame extends JFrame implements KeyListener {
	private List<BackGround> allBg = new ArrayList<BackGround>();
	private BackGround nowBg = null;

	public static void main(String[] args) {
		new MainFrame();
	}

	public MainFrame() {
		this.setTitle("超级马里奥");
		this.setSize(900, 600);// 宽度和高度是60的倍数,因为每张小的图片都调成了60*60的
		// 取得当前屏幕的大小
		int width = Toolkit.getDefaultToolkit().getScreenSize().width;
		int height = Toolkit.getDefaultToolkit().getScreenSize().height;
		// 初始显示在屏幕正中央
		this.setLocation((width - 900) / 2, (height - 600) / 2);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 设置窗体大小不可改变
		this.setResizable(false);

		//载入全部图片
		StaticValue.init();

		// 创建全部的场景
		for (int i = 1; i <= 3; i++) {
			this.allBg.add(new BackGround(i, i == 3 ? true : false));
		}

		// 将第1个场景设置为当前场景
		this.nowBg = this.allBg.get(0);
		repaint();

		// 绑定监听器
		this.addKeyListener(this);
		this.setVisible(true);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		// 绘制图片,双缓冲技术,为了防止屏幕的闪烁
		BufferedImage image = new BufferedImage(900, 600,
				BufferedImage.TYPE_3BYTE_BGR);
		Graphics g2 = image.getGraphics();

		// 绘制背景
		g2.drawImage(this.nowBg.getBgImage(), 0, 0, this);
		// 绘制障碍物
		Iterator<Obstruction> iter = this.nowBg.getAllObstruction().iterator();
		while (iter.hasNext()) {
			Obstruction ob = iter.next();
			g2.drawImage(ob.getShowImage(), ob.getX(), ob.getY(), this);
		}

		// 把缓冲图片绘制到窗体中
		g.drawImage(image, 0, 0, this);
	}

	/**
	 * 当通过键盘输入一些信息时
	 */
	@Override
	public void keyTyped(KeyEvent e) {

	}

	/**
	 * 当点击键盘上某一个键的时候调用的方法
	 */
	@Override
	public void keyPressed(KeyEvent e) {
		System.out.println(e.getKeyCode());// 通过输出可以知道左箭头,右箭头,空格所对应的编码

	}

	/**
	 * 当抬起键盘上某一个键的时候调用的方法
	 */
	@Override
	public void keyReleased(KeyEvent e) {

	}

}

运行效果如图所示:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值