?? gamemap.java
字號:
package org.loon.chair.example6;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
/**
*
* @author chenpeng
* @email ceponline@yahoo.com.cn
*
* Loon Framework in Game
*
* 在Example6中開始引入布局的概念
*/
public class GameMap implements Common{
//設定背景方格默認行數
private static final int ROW = 15;
//設定背景方格默認列數
private static final int COL = 30;
//自動計算地圖大小
public static final int WIDTH = COL * CS;
public static final int HEIGHT = ROW * CS;
//設定地圖,通常在rpg類型游戲開發中,以[二維數組]對象為
//基礎進行地圖處理,用以描繪出X坐標和Y坐標。實際上,即令
//再華麗的RPG類游戲,都是從這些簡單的X,Y坐標開始的。
//PS:所謂[數組],大家可以簡單的理解為即數據的集合,一維數組
//僅包含X軸,而二維是由X,Y兩個軸組成的,X與Y的交織點,即為
//一條數據。
//于Example6中擴充地圖如下
private int[][] map = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1},
{1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1},
{1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1},
{1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1},
{1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
//設定顯示圖像對象
private Image floorImage;
private Image wallImage;
// 游戲所使用面板
private MyPanel panel;
public GameMap(MyPanel panel) {
// 初始化圖像
loadImage();
}
//換算當前image像素到布局
public static int pixelsToTiles(double pixels) {
return (int)Math.floor(pixels / CS);
}
//換算當前布局到image像素
public static int tilesToPixels(int tiles) {
return tiles * CS;
}
//修正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;
}
}
}
}
/**
* 用于判定是否允許移動的發生,被move()函數調用,在Example5開始變更為公有
* @param x
* @param y
* @return
*/
public boolean isAllow(int x, int y) {
// 以(x,y)交點進行數據判定,我們都知道,
// 在本例中我僅以0作為地板的參數,1作為
// 墻的參數,由于我們的主角是[人類],而
// 不是[幽靈],所以當他要[撞墻]時,我們
// 當然不會允許,至少,是我講到劇情的觸發
// 以前……
if (map[y][x] == 1) {
// 不允許移動時,返回[假]
return false;
}
// 允許移動時時,返回[真]
return true;
}
private void loadImage() {
ImageIcon icon = new ImageIcon(getClass().getResource("image/floor.gif"));
floorImage = icon.getImage();
icon = new ImageIcon(getClass().getResource("image/wall.gif"));
wallImage = icon.getImage();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -