TriyHoo

做好一件事需要的是专注和持之以恒

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

  最近想通过做几个小游戏来巩固一下j2se的基础知识,在做的过程中感觉还是有新的收获,分别作了一个太阳系的模型和飞机躲子弹的游戏,记录一下自己在写程序过程中的收获。

  虽然感觉游戏项目很小,但是很重要的面向对象的知识几乎都会用到(如果不做网络版游戏IO和网络编程可能涉及不多),首先就是封装,在面向对象思维里,一定要把有独立属性的对象封装成类,在类中加入属性和行为,以类的方式组织代码,以对象的方式封装数据。比如在游戏项目中,分别有主类,飞机类,子弹类,爆炸类,常量类,接口类常量类封装了游戏项目所用到的常量类型,比如说游戏窗口的大小,飞机出现的位置等,封装在常量类里方便以后修改。接口类里封装了游戏的图片加载方法,游戏声音加载方法等通用方法,一般需要定义为static类型。

  1)虽然java不擅长做桌面项目,但是拿来练手还是可以的,有几个常见的注意事项,第一就是双缓冲消除闪烁,虽然swing中默认双缓冲,但是awt中需要自己实现。

Image offScreenImage = null;
public void update(Graphics g) {
    if(offScreenImage == null) {
          offScreenImage = this.createImage(Const.GAME_WIDTH,Const.GAME_HEIGTH);
  gOffScreen = offScreenImage.getGraphics();
  gOffScreen.fillRect(0,0,Const.GAME_WIDTH,Const.GAME_HEIGHT);  
  paint(gOffScreen);
  g.drawImage(offScreenImage,0,0,null);
 }
}

 

这段代码就是实现了双缓冲解决闪烁问题。

  2)接口中图片加载的常用定义方式为:

public class GameApi {
    public static Image imageLoader(String path) {
        URL u = GameApi.class.getClassLoader().getResource(path);
        BufferedImage img = null;
        try {
            img = ImageIO.read(u);
        } catch (IOException e) {
            e.printStackTrace();
        }    
        return img;
    }
}

  3)在项目中boolean类型变量的使用非常重要,尤其在逻辑控制模块实现中,在需要的类中加入控制生死的boolean变量,通过get,set方式可以解决很多循环无法解决的问题。我遇到的一个问题就是,在判断子弹和飞机碰撞问题上,如果在判断碰撞之前加上判断飞机是否存活的判断条件,那么在碰撞产生后的爆炸类只能加载一次draw方法;但若去掉飞机存活的判定条件,那么在计算游戏用时时就会出现飞机死去但还会计时的bug。所以通过加入判断爆炸生死的boolean变量,在碰撞产生后,将爆炸的boolean置为true,在下面加上如果爆炸产生,也就是为true 的时候才开始循环画爆炸的图片,从而解决问题。

 

posted on 2014-12-10 17:51  TriyHoo  阅读(120)  评论(0)    收藏  举报