且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-01-11 03:15:03




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


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

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

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

   人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[6]——走马观花
 
由于代码量已开始增加,由本回开始仅给出部分代码实现,详细请进行下载:
 
在本例中,本人采取的位图偏移算法如下:
人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[6]——走马观花
 
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 + CSy * CS + 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;
                           }
                       }
            }


本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/130235
    }