在游戲中通常不可能允許一幅場景貫穿始終,這就提出了場景變更的要求,基于這一要求的實現,我們將進行如下效果的Java代碼實現。
或另存以下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(image, 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,
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;
}
}
}
}
浙公網安備 33010602011771號