程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME游戲開發實例講解03

J2ME游戲開發實例講解03

編輯:J2ME
 六.編碼

  整個項目共有五個類,有四個類的代碼前面已經介紹過了,而且是在其他項目中使用過的相對成熟的代碼.現在只需全力去實現Displayable1類.Displayable1類的代碼如下:

  package huarongroad;
import Javax.microedition.lcdui.*;
public class Displayable1 extends Canvas implements CommandListener {
private int[] loc = new int[2]; <A href="file://光">file://光</A>標的當前位置,0是水平位置,1是豎直位置
private int[] SelectArea = new int[4];//被選定的區域,即要移動的區域
private int[] MoveArea = new int[4];//要移動到的區域
private Map MyMap = new Map();//地圖類
private boolean selected;//是否已經選中要移動區域的標志
private int level;//但前的關面
public Displayable1() {//構造函數
try {
jbInit();//JBuilder定義的初始化函數
}catch (Exception e) {
e.printStackTrace();
}
}
private void Init_game(){
//初始化游戲,讀取地圖,設置選擇區域,清空要移動到的區域
this.loc = MyMap.read_map(this.level);//讀取地圖文件,並返回光標的初始位置
//0為水平位置,1為豎直位置
this.SelectArea[0] = this.loc[0];//初始化選中的區域
this.SelectArea[1] = this.loc[1];
this.SelectArea[2] = 1;
this.SelectArea[3] = 1;
this.MoveArea[0] = -1;//初始化要移動到的區域
this.MoveArea[1] = -1;
this.MoveArea[2] = 0;
this.MoveArea[3] = 0;
}
private void jbInit() throws Exception {//JBuilder定義的初始化函數
<A href="file://初">file://初</A>始化實例變量
this.selected = false;//設置沒有被選中的要移動區域
this.level = 1;
Images.init();//初始化圖片常量
Init_game();//初始化游戲,讀取地圖,設置選擇區域,清空要移動到的區域
setCommandListener(this);//添加命令監聽,這是Displayable的實例方法
addCommand(new Command("Exit", Command.EXIT, 1));//添加“退出”按鈕
}
public void commandAction(Command command, Displayable displayable) {
//命令處理函數
if (command.getCommandType() == Command.EXIT) {//處理“退出”
MIDlet1.quitApp();
}
}
protected void paint(Graphics g) {
//畫圖函數,用於繪制用戶畫面,即顯示圖片,勾畫選中區域和要移動到的區域
try {
g.drawImage(Images.image_Frame, 0, 0,
Graphics.TOP | Graphics.LEFT);//畫背景
MyMap.draw_map(g);//按照地圖內容畫圖
if ( this.selected )
g.setColor(0,255,0);//如果被選中,改用綠色畫出被選中的區域
g.drawRect(this.SelectArea[0] * Images.UNIT + Images.LEFT,
this.SelectArea[1] * Images.UNIT + Images.TOP,
this.SelectArea[2] * Images.UNIT,
this.SelectArea[3] * Images.UNIT);//畫出選擇區域,
<A href="file://如">file://如</A>果被選中,就用綠色
<A href="file://否">file://否</A>則,使用黑色
g.setColor(255,255,255);//恢復畫筆顏色
if (this.selected) {//已經選中了要移動的區域
g.setColor(255, 0, 255);//改用紅色
g.drawRect(this.MoveArea[0] * Images.UNIT + Images.LEFT,
this.MoveArea[1] * Images.UNIT + Images.TOP,
this.MoveArea[2] * Images.UNIT,
this.MoveArea[3] * Images.UNIT);//畫出要移動到的區域
g.setColor(255, 255, 255);//恢復畫筆顏色
}
}catch (Exception ex) {
}
System.out.println(Runtime.getRuntime().freeMemory());
System.out.println(Runtime.getRuntime().totalMemory());
}
private void setRange() {
//設置移動後能夠選中的區域
//調整當前光標位置到地圖的主位置,即記錄人物信息的位置
if (this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DLEFT) {
this.loc[0] -= 1;//向左調
}else if (this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DUP) {
this.loc[1] -= 1;//向上調
}else if (this.MyMap.Grid[this.loc[1]][this.loc[0]] == Images.DLEFTUP) {
this.loc[0] -= 1;//向左調
this.loc[1] -= 1;//向上調
}
this.SelectArea[0] = this.loc[0];//設置光標的水平位置
this.SelectArea[1] = this.loc[1];//設置光標的豎直位置
//設置光標的寬度
if (this.loc[0] + 1 < Images.WIDTH) {
this.SelectArea[2] = this.MyMap.Grid[this.loc[1]][this.loc[0] + 1] != (byte) ´1´ ?
1 : 2;
}else {
this.SelectArea[2] = 1;
}
//設置光標的高度
if (this.loc[1] + 1 < Images.HEIGHT) {
this.SelectArea[3] = this.MyMap.Grid[this.loc[1] + 1][this.loc[0]] != (byte) ´2´ ?
1 : 2;
}else {
this.SelectArea[3] = 1;
}
}
private boolean setMoveRange() {
//設置要移動到的區域,能夠移動返回true,否則返回false
for (int i = 0; i < this.SelectArea[2]; i++) {
for (int j = 0; j < this.SelectArea[3]; j++) {
if (this.loc[1] + j >= Images.HEIGHT ||
this.loc[0] + i >= Images.WIDTH ||
(!isInRange(this.loc[0] + i, this.loc[1] + j) &&
this.MyMap.Grid[this.loc[1] + j][this.loc[0] + i] !=
Images.BLANK)) {
return false;
}
}
}
this.MoveArea[0] = this.loc[0];
this.MoveArea[1] = this.loc[1];
this.MoveArea[2] = this.SelectArea[2];
this.MoveArea[3] = this.SelectArea[3];
return true;
}
private boolean isInRange(int x, int y) {
//判斷給定的(x,y)點是否在選定區域之內,x是水平坐標,y是豎直坐標
if (x >= this.SelectArea[0] &&
x < this.SelectArea[0] + this.SelectArea[2] &&
y >= this.SelectArea[1] &&
y < this.SelectArea[1] + this.SelectArea[3]) {
return true;
}else {
return false;
}
}
private boolean isInRange2(int x, int y) {
//判斷給定的(x,y)點是否在要移動到的區域之內,x是水平坐標,y是豎直坐標
if (x >= this.MoveArea[0] &&
x < this.MoveArea[0] + this.MoveArea[2] &&
y >= this.MoveArea[1] &&
y < this.MoveArea[1] + this.MoveArea[3]) {
return true;
}else {
return false;
}
}
protected void keyPressed(int keyCode) {
//處理按下鍵盤的事件,這是Canvas的實例方法
switch (getGameAction(keyCode)) {//將按鍵的值轉化成方向常量
case Canvas.UP://向上
if (!this.selected) {//還沒有選定要移動的區域
if (this.loc[1] - 1 >= 0) {//向上還有移動空間
this.loc[1]--;//向上移動一下
setRange();//設置光標移動的區域,該函數能將光標移動到地圖主位置
repaint();//重新繪圖
}
}else {//已經選定了要移動的區域
if (this.loc[1] - 1 >= 0) {//向上還有移動空間
this.loc[1]--;//向上移動一下
if (setMoveRange()) {//能夠移動,該函數能夠設置要移動到的區域
repaint();//重新繪圖
}else {//不能移動
this.loc[1]++;//退回來
}
}
}
break;
case Canvas.DOWN://向下
if (!this.selected) {//還沒有選定要移動的區域
if (this.loc[1] + 1 < Images.HEIGHT) {//向下還有移動空間
if (this.MyMap.Grid[this.loc[1] + 1][this.loc[0]] ==
Images.DUP){//該圖片有兩個格高
this.loc[1]++;//向下移動一下
if (this.loc[1] + 1 < Images.HEIGHT) {//向下還有
<A href="file://移">file://移</A>動空間
this.loc[1]++;//向下移動一下
setRange();//設置光標移動的區域,
<A href="file://該">file://該</A>函數能將光標移動到地圖主位置
repaint();//重新繪圖
}else {//向下沒有移動空間
this.loc[1]--;//退回來
}
}else {//該圖片只有一個格高
this.loc[1]++;//向下移動一下
setRange();//設置光標移動的區域,
<A href="file://該">file://該</A>函數能將光標移動到地圖主位置
repaint();//重新繪圖
}
}else {
}
}else {//已經選定了要移動的區域
if (this.loc[1] + 1 < Images.HEIGHT) {//向下還有移動空間
this.loc[1]++;//向下移動一下
if (setMoveRange()) {//能夠移動,該函數能夠設置要移動到的區域
repaint();//重新繪圖
}else {//不能移動
this.loc[1]--;//退回來
}
}
}
break;
case Canvas.LEFT://向左
if (!this.selected) {//還沒有選定要移動的區域
if (this.loc[0] - 1 >= 0) {//向左還有移動空間
this.loc[0]--;//向左移動一下
setRange();//設置光標移動的區域,該函數能將光標移動到地圖主位置
repaint();//重新繪圖
}
}else {//已經選定了要移動的區域
if (this.loc[0] - 1 >= 0) {//向左還有移動空間
this.loc[0]--;//向左移動一下
if (setMoveRange()) {//能夠移動,該函數能夠設置要移動到的區域
repaint();//重新繪圖
}else {//不能移動
this.loc[0]++;//退回來
}
}
}
break;
case Canvas.RIGHT://向右
if (!this.selected) {//還沒有選定要移動的區域
if (this.loc[0] + 1 < Images.WIDTH) {//向右還有移動空間
if (this.MyMap.Grid[this.loc[1]][this.loc[0] + 1] ==
Images.DLEFT) {//該圖片有兩個格寬
this.loc[0]++;//向右移動一下
if (this.loc[0] + 1 < Images.WIDTH) {//向右還有
<A href="file://移">file://移</A>動空間
this.loc[0]++;//向右移動一下
setRange();//設置光標移動的區域,
<A href="file://該">file://該</A>函數能將光標移動到地圖主位置
repaint();//重新繪圖
}else {//向右沒有移動空間
this.loc[0]--;//退回來
}
}else {//該圖片只有一個格寬
this.loc[0]++;//向右移動一下
setRange();//設置光標移動的區域,
<A href="file://該">file://該</A>函數能將光標移動到地圖主位置
repaint();//重新繪圖
}
}else {
}
}else {//已經選定了要移動的區域
if (this.loc[0] + 1 < Images.WIDTH) {//向右還有移動空間
this.loc[0]++;//向右移動一下
if (setMoveRange()) {//能夠移動,該函數能夠設置要移動到的區域
repaint();//重新繪圖
}else {//不能移動
this.loc[0]--;//退回來
}
}
}
break;
case Canvas.FIRE:
if (this.selected) {//已經選定了要移動的區域
Move();//將要移動的區域移動到剛選中的區域
repaint();//重新繪圖
this.selected = false;//清除已選定要移動區域的標志
if ( win()) {
System.out.println("win");
}
}else {//還沒有選定要移動的區域
if (this.MyMap.Grid[this.loc[1]][this.loc[0]] ==
Images.BLANK) {//要移到的位置是一個空白
}else {//要移到的位置不是空白
this.selected = true;//設置已選定要移動區域的標志
}
repaint();//重新繪圖
}
break;
}
}
private boolean win(){
<A href="file://判">file://判</A>斷是否已經救出了曹操
if ( this.MyMap.Grid[Images.HEIGHT - 2 ][Images.WIDTH - 3 ] == Images.CAOCAO )
return true;
else
return false;
}
private void PrintGrid(String a) {
<A href="file://打">file://打</A>印當前地圖的內容,用於調試
System.out.println(a);
for (int i = 0; i < Images.HEIGHT; i++) {
for (int j = 0; j < Images.WIDTH; j++) {
System.out.print( (char)this.MyMap.Grid[i][j]);
}
System.out.println("");
}
}
private void Move() {
<A href="file://將">file://將</A>要移動的區域移動到剛選中的區域
if (this.MoveArea[0] == -1 || this.MoveArea[1] == -1 ||
this.SelectArea[0] == -1 || this.SelectArea[1] == -1) {//沒有選中區域
}else {//已經選中了要移動的區域和要移動到的區域
byte[][] temp = new byte[this.SelectArea[3]][this.SelectArea[2]];
<A href="file://復">file://復</A>制要移動的區域,因為這塊區域可能會被覆蓋掉
for (int i = 0; i < this.SelectArea[2]; i++) {
for (int j = 0; j < this.SelectArea[3]; j++) {
temp[j][i] =
this.MyMap.Grid[this.SelectArea[1] +j]
[this.SelectArea[0] + i];
}
}
<A href="file://PrintGrid">file://PrintGrid</A>("1"); // 調試信息
<A href="file://將">file://將</A>要移動的區域移動到剛選中的區域(即要移動到的區域)
for (int i = 0; i < this.SelectArea[2]; i++) {
for (int j = 0; j < this.SelectArea[3]; j++) {
this.MyMap.Grid[this.MoveArea[1] + j]
[this.MoveArea[0] + i] = temp[j][i];
}
}
<A href="file://PrintGrid">file://PrintGrid</A>("2");// 調試信息
<A href="file://將">file://將</A>要移動的區域中無用內容置成空白
for (int i = 0; i < this.SelectArea[3]; i++) {
for (int j = 0; j < this.SelectArea[2]; j++) {
if (!isInRange2(this.SelectArea[0] + j,
this.SelectArea[1] + i)) {//該點是不在要移動到
<A href="file://的">file://的</A>區域之內,需置空
this.MyMap.Grid[this.SelectArea[1] + i]
[this.SelectArea[0] + j] = Images.BLANK;
}else {
}
}
}
<A href="file://PrintGrid">file://PrintGrid</A>("3");// 調試信息
this.SelectArea[0] = this.MoveArea[0];//重置選中位置的水平坐標
this.SelectArea[1] = this.MoveArea[1];//重置選中位置的豎直坐標
this.MoveArea[0] = -1;//清空要移動到的位置
this.MoveArea[1] = -1;//清空要移動到的位置
this.MoveArea[2] = 0;//清空要移動到的位置
this.MoveArea[3] = 0;//清空要移動到的位置
}
}
}

  代碼的相關分析,在詳細設計階段已經講過,代碼中有比較相近的注釋,請讀者自行研讀分析.將全部的代碼寫好,用wtk2.0自帶的Ktoolbar工具建立一個工程,接下來把去不源文件放到正確位置下,然後點擊build,再點run,就完成了程序的編寫.當然如果有錯誤還要修改和調試.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved