训练三-卡马克算法(郑鸿)

 今天仿照郑鸿的代码把这个算法搞懂了,他真是个高手。算法描述如下:  当屏幕在背景中移动时,实际上所涉及的 Tile 根本没有变化,或者只有一小部分发生了改变。所以我们可以创建一个背景图像缓冲(buffer),保存当前屏幕的背景图像,减少每帧得画图次数,可以大大提高速度。当我们创建的图像缓冲和黄色区域大小相同时,如果背景涉及的Tile没有变化,我们只需将缓冲图像画到屏幕的适当位置上。如果背
摘要由CSDN通过智能技术生成

 今天仿照郑鸿的代码把这个算法搞懂了,他真是个高手。算法描述如下: 

当屏幕在背景中移动时,实际上所涉及的 Tile 根本没有变化,或者只有一小部分发生了改变。所以我们可以创建一个背景图像缓冲(buffer),保存当前屏幕的背景图像,减少每帧得画图次数,可以大大提高速度。

当我们创建的图像缓冲和黄色区域大小相同时,如果背景涉及的Tile没有变化,我们只需将缓冲图像画到屏幕的适当位置上。如果背景涉及的 Tile 发生了变化,如变为绿色区域我们只需更新变化的部分Tile到背景缓冲,再将缓冲画到屏幕上即可。

0,0                       X

 

 

 

 

 

 

 

 

Y

为了保留缓冲图像中已有部分,我们采用滚动更新的方法。假设,当屏幕向右下移动时,缓冲中最上和最左的Tile已无用(IIIIII),我们便将新的最下的Tile 保存在最上(III区),将新的最右的Tile保存在最左(IIII区),得到新的缓冲图像。最后,我们将新的背景缓冲分4区,按照实际位置画到屏幕上即可,对应关系如图。

当然,按照屏幕在背景中的位置,我们的缓冲分区会出现四种情况。

l        1个区,刚好背景没有被缓冲切开

l        2个区,背景只在X轴方向被缓冲切开

l        2个区,背景只在Y轴方向被缓冲切开

l        4个区,背景在XY轴方向都被缓冲切开(如例子)

代码要求:

I                    II

 

 

 

 

III                 IV

 

 

 

                     IV                         III

 

 

 

 

 

                     II                            I

背景缓冲

实际背景

1.每帧生成一个随机数,基于随机数让地图随机的上、下、左、右移动。
2.程序一开始应该有菜单选项让用户选择地图随机移动的步长,1 pixel,2pixel,4 pixel,8 pixel
3.程序运行1000帧以后,计算出平均每帧占用的毫秒数(只包括update缓冲区和repaint的时间,不包括调用生成随机数的函数的时间)并显示在屏幕上。
4.可以通过按某个键进行地图移动方式得切换(随机移动和手动移动地图)
5.生成的jad以及jar里面的manifest文件的如下两个字段统一规定如下
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-2.0
6.由于程序要上传到手机上的,而手机的键盘值不同于标准模拟器
键盘值应按如下进行更改
    public static final int DEVKEY_UP    = -1; (方向盘上键)
    public static final int DEVKEY_DOWN = -6; (方向盘下键)
    public static final int DEVKEY_LEFT = -2; (方向盘左键)
    public static final int DEVKEY_RIGTH = -5; (方向盘右键)
    public static final int DEVKEY_LSOFT = -21;(左软键)
    public static final int DEVKEY_RSOFT = -22;(右软键)
public static final int DEVKEY_MSOFT = -20;(中软键)
7. 统一把Canvas设置为全屏模式
 
import  javax.microedition.midlet.MIDlet;
import  javax.microedition.lcdui. * ;
import  java.io. * ;
import  javax.microedition.lcdui.game.Sprite;
import  java.util. * ;

public   class  FastMap  extends  MIDlet  {
    
private TGame m_tGame    = null;
    
private Display m_display    = null;
    
    
public FastMap() {
        
super();
        m_tGame 
= new TGame();
        m_display 
= Display.getDisplay(this);
    }


    
protected void startApp() {
        System.out.println(
"Vendor :" + getAppProperty("MIDlet-Vendor"));
        System.out.println(
"Description :" + getAppProperty("MIDlet-Description"));
        System.out.println(
"JadFile Version :" + getAppProperty("MIDlet-Version"));
        System.out.println(
"MIDlet-Data-Size :" + getAppProperty("MIDlet-Data-Size"));
        m_display.setCurrent(m_tGame);
        
//m_tGame.repaint ();
    }


    
protected void pauseApp() {
        
// TODO Auto-generated method stub
        System.out.println("train pause the app");
    }


    
protected void destroyApp(boolean arg0)  {
        
// TODO Auto-generated method stub
        System.out.println("train destory the app");
    }

}
    

class  TGame  extends  Canvas  implements  Runnable  {
    
public static final int DEVKEY_UP    = -1;     //???????
    public static final int DEVKEY_DOWN  = -6;     //???????
    public static final int DEVKEY_LEFT  = -2;     //???????
    public static final int DEVKEY_RIGTH = -5;     //???????
    public static final int DEVKEY_LSOFT = -21//?????
    public static final int DEVKEY_RSOFT = -22//?????
    public static final int DEVKEY_MSOFT = -20;    //?????

    
private final static long REFRESH_TIME_MS    = 100;
    
private final static int HORZ_FLIP    = 0x4000;
    
//private final static int VERT_FLIP= 0x8000;
    private final static int IND_TILE    = 0x00ff;
    
private boolean m_exitApp    = false;
    
private boolean m_initialize= false;
    
private Thread    m_thread    = null;

    
private class TilePos { //用类表示位置,聪明
        public short x = 0;
        
public short y = 0;
    }

    
    
private Image        m_buffer    = null;
    
private Image        m_buffer2    = null;    // for changed part.
    private Image        m_backImage    = null;
    
private Graphics    m_bufferG    = null
    
private Graphics    m_bufferG2    = null;
    
private TilePos[]    m_imageBuf    = null;
    
    
private short[][] m_mapBuf    = null;
    
    
private short    m_mapRow    = 0;
    
private short    m_mapCol    = 0;
    
private short    m_tileWidth    = 0;
    
private short
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值