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

下载地址[url]http://www.3adisk.com/?onlinezero[/url][文件名: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);
 
 
 
GameHandle GameMap 中,均需注入 offsetX offsetY 值,以生成对应图像。
GameHandle 实现:
// Example6 开始,为了实现背景的移动,所有算法都要加入偏移值
    public void draw(Graphics g, int offsetX, int offsetY) {
   // count 作为图像的偏移数值 , 并于 Example4 中添加 direction 以获取所处图像块位置
        g.drawImage( p_w_picpath , x * CS + offsetX, y * CS + offsetY, x * CS + offsetX + CS , y * CS + offsetY + CS ,
            count * CS , direction * CS , CS + count * CS , direction * CS + CS , panel );
}
 
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( floorImage , tilesToPixels(j) + offsetX, tilesToPixels(i) + offsetY, panel );
                                   break ;
                               case 1 : // 墙壁
                                   g.drawImage( wallImage , tilesToPixels(j) + offsetX, tilesToPixels(i) + offsetY, panel );
                                    break ;
                           }
                       }
            }
    }