【转】人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[6]——走马观花

来源: http://blog.csdn.net/cping1982/article/details/1748385

在游戏中通常不可能允许一幅场景贯穿始终,这就提出了场景变更的要求,基于这一要求的实现,我们将进行如下效果的Java代码实现。


下载地址http://www.3adisk.com/?onlinezero[文件名:RpgChair0to6.rar]

或另存以下X(gif)文件为rar


   

 

由于代码量已开始增加,由本回开始仅给出部分代码实现,详细请进行下载:

 

在本例中,本人采取的位图偏移算法如下:

 

MyPanle中实现如下:

 

 

        // X偏移位置

        int offsetX = MyPanel.WIDTH / 2 - role.getX() * CS;

        //计算X偏移量

        offsetX = Math.min(offsetX, 0);

        offsetX = Math.max(offsetX, MyPanel.WIDTH - GameMap.WIDTH);

      

        // Y偏移位置

        int offsetY = MyPanel.HEIGHT / 2 - role.getY() * CS;

        //计算Y偏移量

        offsetY = Math.min(offsetY, 0);

        offsetY = Math.max(offsetY, MyPanel.HEIGHT - GameMap.HEIGHT);

        //System.out.print(role.getX()+":"+role.getY());

        //绘制可偏移位置的地图

        map.draw(g, offsetX, offsetY);

 

        //绘制可偏移位置的角色

        role.draw(g, offsetX, offsetY);

 

 

 

GameHandleGameMap中,均需注入offsetXoffsetY值,以生成对应图像。

GameHandle实现:

//Example6开始,为了实现背景的移动,所有算法都要加入偏移值

    public void draw(Graphics g, int offsetX, int offsetY) {

   //count作为图像的偏移数值,并于Example4中添加direction以获取所处图像块位置

        g.drawImage(imagex * CS + offsetX, y * CS + offsetY, x * CS + offsetX + CSyCS + offsetY + CS,

            count * CSdirection * CSCS + count * CSdirection * CS + CSpanel);

}

 

GameMap实现:

    //修正Example6中绘制方式,引入地图坐标偏移计算

    public void draw(Graphics g, int offsetX, int offsetY) {

   

        int firstTileX = pixelsToTiles(-offsetX);

        //变更X坐标

        int lastTileX = firstTileX + pixelsToTiles(MyPanel.WIDTH) + 1;

       

        //返回最小X偏移值

        lastTileX = Math.min(lastTileX, COL);

       

        

        int firstTileY = pixelsToTiles(-offsetY);

        //变更Y坐标

        int lastTileY = firstTileY + pixelsToTiles(MyPanel.HEIGHT) + 1;

       

        //返回最小Y偏移值

        lastTileY = Math.min(lastTileY, ROW);

    //Java或任何游戏开发中,算法都是最重要的一步,本例尽使用

    //简单的双层for循环进行地图描绘,

                 for (int i = firstTileY; i < lastTileY; i++) {

                       for (int j = firstTileX; j < lastTileX; j++) {

                          // switch作为java中的转换器,用于执行和()中数值相等

                       // case操作。请注意,在case操作中如果不以break退出

                       // 执行;switch函数将持续运算到最后一个case为止。

                           switch (map[i][j]) {

                               case 0 : // 地板

                                   g.drawImage(floorImagetilesToPixels(j) + offsetX,tilesToPixels(i) + offsetY, panel);

                                   break;

                               case 1 : // 墙壁

                                   g.drawImage(wallImagetilesToPixels(j) + offsetX,tilesToPixels(i) + offsetY, panel);

                                   break;

                           }

                       }

            }

    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值