?? rpgcanvas.java
字號:
import javax.microedition.lcdui.*;
/**
* RPG游戲示例代碼 實現了按鍵的連續移動
*/
public class RPGCanvas extends Canvas implements Runnable {
/** 游戲狀態 */
private int status;
// 游戲狀態設定
/** 村莊1 */
private final static int SCREEN_1 = 0;
/** 武器店 */
private final static int WEAPON_SHOP = 10;
/** 對話狀態1 */
private final static int DIALOAG_1 = 100;
// 場景1地圖數組
int backmap0[][] = { { 1, 11, 12, 1, 76, 1, 1, 1, 78, 1, 1, 1 },
{ 19, 20, 21, 22, 73, 80, 81, 1, 77, 68, 1, 1 },
{ 28, 29, 30, 31, 32, 1, 1, 1, 1, 1, 1, 1 },
{ 37, 38, 39, 31, 41, 1, 1, 1, 1, 1, 54, 1 },
{ 46, 47, 48, 49, 50, 1, 1, 1, 1, 1, 1, 1 },
{ 55, 74, 57, 58, 59, 1, 1, 1, 1, 1, 1, 1 },
{ 79, 75, 66, 67, 1, 1, 1, 3, 4, 5, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 2, 13, 14, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 54, 27, 24, 24, 23, 83, 24, 24, 24, 24, 26, 54 },
{ 15, 43, 9, 9, 23, 83, 9, 9, 9, 9, 25, 15 },
{ 54, 42, 33, 33, 23, 83, 33, 33, 33, 33, 34, 54 },
{ 1, 1, 1, 1, 84, 84, 1, 1, 1, 1, 1, 1 } };
// 圖塊常量
/** 每個圖塊的寬度 */
private final static int TILE_WIDTH = 16;
/** 每個圖塊的高度 */
private final static int TILE_HEIGHT = 16;
/** 場景1圖片 */
Image screen_1 = null;
/** 地圖原始圖片 */
Image map0Img = null;
/** 人物原始圖片 */
Image roleImg = null;
/** 人物的x坐標 */
int roleX = 100;
/** 任務的y坐標 */
int roleY = 100;
/** 人物寬度 */
private final static int ROLE_WIDTH = 16;
/** 人物高度 */
private final static int ROLE_HEIGHT = 32;
/** 人物方向 */
int direction;
/** 人物當前顯示圖片的序號 */
int currIndex = 0;
/** 人物連續移動的控制變量,-1代表不移動,其他方向和人物方向常量的規定相同 */
int roleMoveControl = -1;
/** 移動速度,每次2個像素 */
int speed = 4;
/** 不移動 */
private final static int NOT_MOVE = -1;
/** 人物方向常量 */
private final static int DIRE_LEFT = 9;
private final static int DIRE_RIGHT = 6;
private final static int DIRE_UP = 3;
private final static int DIRE_DOWN = 0;
/** 屏幕寬度 */
int width;
/** 屏幕高度 */
int height;
/** 可行走區域地圖塊序號 */
private int[] canMoveTile = { 1, 2, 3, 4, 5, 13, 14, 23, 32, 41, 50, 59,
66, 67, 83 };
/**武器名稱*/
private String[] weaponName = {
"軒轅劍",
"浪宇刀",
"匕首"
};
/**武器價格*/
private int[] weaponPrice = {
1000,
2000,
100
};
public RPGCanvas() {
try {
map0Img = Image.createImage("/map.png");
roleImg = Image.createImage("/player.png");
} catch (Exception e) {
}
//全屏
this.setFullScreenMode(true);
width = this.getWidth();
height = this.getHeight();
// 啟動線程
Thread th = new Thread(this);
th.start();
}
protected void paint(Graphics g) {
// 根據游戲狀態實現繪制
switch (status) {
case SCREEN_1:
// 繪制場景
paintSCREEN_1(g);
// 繪制人物
paintRole(g);
break;
case WEAPON_SHOP:
paintWEAPON_SHOP(g);
break;
case DIALOAG_1:
paintDIALOAG_1(g);
break;
}
}
/**
* 繪制場景1的方法
*
* @param g
* 畫筆
*/
private void paintSCREEN_1(Graphics g) {
// 構造地圖圖片
if (screen_1 == null) {
screen_1 = createScreen_1();
}
g.drawImage(screen_1, 0, 0, Graphics.LEFT | Graphics.TOP);
}
/**
* 繪制人物
*
* @param g
* 畫筆
*/
private void paintRole(Graphics g) {
g.setClip(roleX, roleY, ROLE_WIDTH, ROLE_HEIGHT);
g.drawImage(roleImg, roleX - currIndex * ROLE_WIDTH, roleY,
Graphics.LEFT | Graphics.TOP);
// 恢復默認剪切區域
g.setClip(0, 0, width, height);
}
String weaponShopName = "武器店";
String left = "離開";
/**
* 繪制武器店界面
*
* @param g
* 畫筆
*/
private void paintWEAPON_SHOP(Graphics g) {
//繪制背景
g.setColor(0);
g.fillRect(0, 0, width, height);
g.setColor(0xffffff);
//繪制標題
g.drawString(weaponShopName,90,10,Graphics.TOP | Graphics.LEFT);
//循環繪制
for(int i = 0; i < weaponName.length;i++){
//繪制武器名稱
g.drawString(weaponName[i], 30,
50 + 30 * i, Graphics.TOP | Graphics.LEFT);
//繪制武器價格
g.drawString("" + weaponPrice[i], 150, 50 + 30 * i, Graphics.TOP | Graphics.LEFT);
}
//繪制按鈕
g.drawString(left, 0, height, Graphics.BOTTOM | Graphics.LEFT);
}
/**
* 繪制對話
*
* @param g
* 畫筆
*/
private void paintDIALOAG_1(Graphics g) {
}
private Image createScreen_1() {
// 創建和地圖大小一樣的圖片
Image tempImg = Image.createImage(backmap0[0].length * TILE_WIDTH,
backmap0.length * TILE_HEIGHT);
// 繪制地圖
Graphics g1 = tempImg.getGraphics();
// 循環繪制
for (int i = 0; i < backmap0.length; i++) { // 行
for (int j = 0; j < backmap0[i].length; j++) {
// 設置剪切區域
g1.setClip(j * TILE_WIDTH, i * TILE_HEIGHT, TILE_WIDTH,
TILE_HEIGHT);
// 計算圖片坐標
int dx = (backmap0[i][j] - 1) % 9 * TILE_WIDTH;
int dy = (backmap0[i][j] - 1) / 9 * TILE_HEIGHT;
// 繪制圖片
g1.drawImage(map0Img, j * TILE_WIDTH - dx,
i * TILE_HEIGHT - dy, Graphics.LEFT | Graphics.TOP);
}
}
return tempImg;
}
public void keyPressed(int keyCode) {
//System.out.println(keyCode);
// 根據游戲狀態實現按鍵處理
switch (status) {
case SCREEN_1:
SCREEN_1_KeyPress(keyCode);
break;
case WEAPON_SHOP:
weapon_Shop_KeyPress(keyCode);
break;
case DIALOAG_1:
break;
}
}
/**
* 武器店事件處理
* @param keyCode
*/
private void weapon_Shop_KeyPress(int keyCode){
if(keyCode == -6){ //左軟鍵
status = SCREEN_1; //切換到村莊
//處理坐標
roleX = 38;
roleY = 100;
//人物方向
direction = DIRE_DOWN;
//人物靜止
roleMoveControl = NOT_MOVE;
}
}
public void keyReleased(int keyCode) {
// 根據游戲狀態實現按鍵處理
switch (status) {
case SCREEN_1:
SCREEN_1_KeyRelease(keyCode);
break;
case WEAPON_SHOP:
break;
case DIALOAG_1:
break;
}
}
private void SCREEN_1_KeyPress(int keyCode) {
// 轉換為游戲動作
int action = this.getGameAction(keyCode);
switch (action) {
case UP:
// 改變方向
direction = DIRE_UP;
// 控制移動
roleMoveControl = DIRE_UP;
break;
case DOWN:
// 改變方向
direction = DIRE_DOWN;
// 控制移動
roleMoveControl = DIRE_DOWN;
break;
case LEFT:
// 改變方向
direction = DIRE_LEFT;
// 控制移動
roleMoveControl = DIRE_LEFT;
break;
case RIGHT:
// 改變方向
direction = DIRE_RIGHT;
// 控制移動
roleMoveControl = DIRE_RIGHT;
break;
case FIRE:
break;
}
}
private void SCREEN_1_KeyRelease(int keyCode) {
// 轉換為游戲動作
int action = this.getGameAction(keyCode);
switch (action) {
case UP:
case DOWN:
case LEFT:
case RIGHT:
roleMoveControl = NOT_MOVE;
}
}
Runtime rt = Runtime.getRuntime();
public void run() {
try {
while (true) {
// 延時
Thread.sleep(100);
// 邏輯處理方法
tick();
//判斷
if(rt.freeMemory() < 100000){
System.gc();
}
// 重新繪制
repaint();
}
} catch (Exception e) {
}
}
/**
* 邏輯處理方法
*/
public void tick() {
// 根據游戲狀態實現繪制
switch (status) {
case SCREEN_1:
roleMove();
break;
case WEAPON_SHOP:
break;
case DIALOAG_1:
break;
}
}
/**
* 人物移動處理方法
*/
private void roleMove() {
if (roleMoveControl != NOT_MOVE) { // 人物移動
//是否進入武器店
if(isDisplayWeaponShop()){
status = WEAPON_SHOP;
}
// 根據方向移動
switch (direction) {
case DIRE_LEFT:
// 向左移動
// 左邊界檢測
if (roleX - speed >= 0) {
roleX -= speed;
// 如果發生碰撞,則退回
if (collis()) {
roleX += speed;
}
}
break;
case DIRE_RIGHT:
// 向右移動
// 右邊界檢測
if (roleX + ROLE_WIDTH + speed <= width) {
roleX += speed;
// 如果發生碰撞,則退回
if (collis()) {
roleX -= speed;
}
}
break;
case DIRE_UP:
// 向上移動
// 上邊界檢測
if (roleY - speed >= 0) {
roleY -= speed;
// 如果發生碰撞,則退回
if (collis()) {
roleY += speed;
}
}
break;
case DIRE_DOWN:
// 向下移動
// 下邊界檢測
if (roleY + ROLE_HEIGHT + speed <= height) {
roleY += speed;
// 如果發生碰撞,則退回
if (collis()) {
roleY -= speed;
}
}
break;
}
// 動畫
if (currIndex == direction + 1) {
currIndex = direction + 2;
} else {
currIndex = direction + 1;
}
} else { // 人物靜止
currIndex = direction;
}
}
/**
* 碰撞檢測
* 原理:以人物16X32區域的下半部12X12和地圖坐標判斷,
* 只有地圖塊 為可移動地圖塊數組的才能夠行走
*
* @return true代表發生碰撞,false代表未碰撞
*/
private boolean collis() {
// 獲得12X12區域的坐標,左上角
int leftX = roleX + 2;
int topY = roleY + 18;
// 計算左上角所在的地圖圖塊的序號
int col = leftX / TILE_WIDTH;
int row = topY / TILE_HEIGHT;
if (!canMove(row, col)) {
return true;
}
// 右上角所在的地圖圖塊的序號
col = (leftX + 12) / TILE_WIDTH;
if (!canMove(row, col)) {
return true;
}
// 左下角所在的地圖圖塊的序號
col = leftX / TILE_WIDTH;
row = (topY + 12) / TILE_WIDTH;
if (!canMove(row, col)) {
return true;
}
// 右下角
col = (leftX + 12) / TILE_WIDTH;
if (!canMove(row, col)) {
return true;
}
// 如果都不滿足,則返回false
return false;
}
/**
* 第row行第col列圖塊是否可行走
*
* @param row
* 行號,從0開始
* @param col
* 列號,從0開始
* @return true代表可以行走,false代表不能行走
*/
private boolean canMove(int row, int col) {
boolean b = false;
for (int i = 0; i < canMoveTile.length; i++) {
if (backmap0[row][col] == canMoveTile[i]) {
b = true;
break;
}
}
return b;
}
/**
* 是否進入武器店
* @return true代表進入
*/
private boolean isDisplayWeaponShop(){
// 獲得16X16區域的坐標,左上角
int leftX = roleX;
int topY = roleY + 16;
// 計算左上角所在的地圖圖塊的序號
int col = leftX / TILE_WIDTH;
int row = topY / TILE_HEIGHT;
//是否和門發生碰撞
if(backmap0[row][col] == 66){ //門
//status = WEAPON_SHOP;
return true;
}
// 右上角所在的地圖圖塊的序號
col = (leftX + 12) / TILE_WIDTH;
//是否和門發生碰撞
if(backmap0[row][col] == 66){ //門
//status = WEAPON_SHOP;
return true;
}
return false;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -