将场景和障碍物结合起来
在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) {
}
}
运行效果如图所示: