J2ME高速游戏地图绘制经验

在缓冲区绘制地图时,如果基于tile变换地图速度太快,FPS不好控制,可以先绘制比屏幕大小高和宽一个相素,缓冲区反转屏幕时,屏幕由相素坐标控制地图显示,其实就是多出那个一个tile的相素变换,由屏幕外逐渐绘制到屏幕内,可以在屏幕绘制时采取记数器,但是记数器的边界一定要设置正确,否则地图会斗(犯过这样的毛病,特别注意),等技术器到达边界再更新缓冲区
因为缓冲区不必每真都绘制,它里面是根据tile绘制的,可以每次更新一行,也可以每次更新几行。也可以先把地图整个绘制在缓冲区,然后屏幕绘制操作相素,但是这样比较浪费内存,不过只绘制一次缓冲区 看情况使用
  public void drawMap(Graphics g) {

        if (!isInit) {
            initMap(tileFileName);
        }

        Index = startmapIndex;
        if (pixCount == 0) { //查看缓冲区是否需要更新
            for (int j = 0; j < 9; j++) { //行
                for (int i = 0; i < 8; i++) { //列
                    bg.setClip(mCx, mCy, tileW, tileH); //设置绘制tile区域
                    getDispMentFromTileset(mapIndex[Index]); //通过地图索引取得tileModX,tileModY
                    System.out.println("mapIndex[" + Index + "]=" +
                                       mapIndex[Index]);
                    bg.drawImage(tileImage, mCx - tileModX, mCy - tileModY,
                                 bg.TOP | bg.LEFT);

                    mCx += tileW;
                    if (mCx == Def.SCREEN_HEIGHT) { //边界判定
                        mCx = 0;
                    }
                    if (Index < startmapIndex + 71) {
                        Index++;
                    } else {
                        Index = 0;
                    }
                }
                mCy += tileH;
                if (mCy == Def.SCREEN_HEIGHT + tileH) { //边界判定
                    mCy = 0;
                }
            }

            if (startmapIndex <= 0) { //判定地图边界,地图象下移动
                startmapIndex = 56;
                //           startmapIndex = 9;
            } else {
                startmapIndex -= 8;
            }

        }
        System.out.println("startmapIndex=" + startmapIndex);
        bg.setClip(0, 0, Def.SCREEN_WIDTH, Def.SCREEN_HEIGHT); //恢复全屏设置区域

        filpMapBuff(g, screenBuf);

    }

    /*****************************************************************************
     *@todo filp内存地图
     */
    int pixCount = 0; //进行几次相素移动
    int sx = 0;
    int sy = -16;
    public void filpMapBuff(Graphics g, Image buff) {

        if (buff == null) {
            return;
        }
        g.drawImage(buff, sx, sy, g.TOP | g.LEFT);
        sy += 2;
        if (sy == 0) {
            sy = -tileH;
        }
        if (pixCount < 7) {
            pixCount++;
        } else {
            pixCount = 0;
        }
    }
 这段代码是我做一个STG商业代码中截取出来的,比较典型的tile缓冲处理方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值