GameCanvas.java
1 package MyJava3;
2 import com.nokia.mid.ui.FullCanvas;
3 import javax.microedition.lcdui.Display;
4 import javax.microedition.lcdui.Graphics;
5 import javax.microedition.lcdui.Image;
6 import javax.microedition.midlet.MIDlet;
7
8 public class GameCanvas extends FullCanvas implements Runnable
9 {
10 //#------------------------------游戲主要部分------------------------------
11 //#------------------------------公共變量------------------------------
12 private boolean threadRunAble = true;//線程運行條件
13 private Thread mainThread; //線程
14 private int key_state = 0;//當前鍵值
15 private boolean key_lock = false;//按鍵執行狀態 ture 執行時候其他邏輯繪制代碼不執行
16 private int main_state; //1級狀態變量
17 private int countTime;//時間控制
18 public final static int DC_KEY_SOFT_LEFT = -6; //左軟件(此鍵值為NOKIA鍵值)
19 public final static int DC_KEY_SOFT_RIGHT = -7; //右軟件
20 public final static int DC_KEY_SOFT_MID = -5;//中間鍵
21 public final static byte ONE_MAIN_MIGLOGO = 0;//米格閃屏
22 public final static byte ONE_MAIN_MENU = 3;//主菜單
23
24 //&------------------------------公共變量------------------------------
25 /**
26 * 構造函數
27 * 啟動游戲主線程,初始化
28 * @param midlet HeroMidlet
29 */
30 public GameCanvas(MIDlet midlet)
31 {
32 init_MainMiglogo();//一開始進入為LOGO狀態
33 Display.getDisplay(midlet).setCurrent(this);
34 mainThread = new Thread(this);
35 mainThread.start();//啟動主線程
36 }
37
38 /**
39 * 游戲主線程
40 */
41 public void run()//游戲主線程,不停的循環執行
42 {
43 while(threadRunAble)
44 {
45 if(!key_lock)
46 {
47 process_All();//邏輯處理
48 repaint(); //繪制
49 serviceRepaints();
50 }
51 }
52 }
53
54 /**
55 * 游戲繪制部分
56 * 根據主狀態處理不同的繪制
57 * @param Graphics
58 */
59 public void paint(Graphics g)
60 {
61 switch(main_state)//根據當前狀態處理當前狀態的繪制
62 {
63 case ONE_MAIN_MIGLOGO:
64 draw_MainMiglogo(g);//如果是LOGO狀態處理LOGO的繪制
65 break;
66 case ONE_MAIN_MENU:
67 draw_MainMenu(g);//如果是MENU狀態處理MENU的繪制
68 break;
69 }
70 }
71
72 /**
73 * 游戲邏輯控制部分
74 * 根據主狀態處理不同的邏輯
75 */
76 protected void process_All()
77 {
78 switch(main_state)
79 {
80 case ONE_MAIN_MIGLOGO:
81 process_MainMiglogo(key_state);//如果是LOGO狀態處理LOGO的邏輯
82 break;
83 case ONE_MAIN_MENU:
84 process_MainMenu(key_state);//如果是MENU狀態處理MENU的邏輯
85 break;
86 }
87 }
88
89 /**
90 * 游戲邏輯控制部分2,按鍵處理
91 * 根據主狀態處理不同的邏輯
92 * @param keyCode
93 */
94 protected void keyPressed(int keyCode)//當按鍵按下去執行一次
95 {
96 key_lock = true;
97 key_state = keyCode;
98 switch(main_state)
99 {
100 case ONE_MAIN_MIGLOGO:
101 key_MainMiglogo(key_state);//如果是LOGO狀態處理LOGO的按鍵處理
102 break;
103 case ONE_MAIN_MENU:
104 key_MainMenu(key_state);//如果是MENU狀態處理MENU的按鍵處理
105 break;
106 }
107 key_lock = false;
108 }
109
110 /**
111 * 釋放按鍵處理
112 * @param keyCode int
113 */
114 protected void keyReleased(int keyCode)//當按鍵松開執行一次
115 {
116 key_state = 0;
117 }
118
119 //&------------------------------游戲主要部分------------------------------
120 //***********************1***********************
121 protected void init_MainMiglogo()//LOGO狀態初始化
122 {
123 countTime = 0;
124 main_state = ONE_MAIN_MIGLOGO;
125 }
126
127 Image logoImg;
128
129 public final static Image loadImg(String pictureName)
130 {
131 Image img = null;
132 try
133 {
134 img = Image.createImage("/bin/"+pictureName+".png");
135 }
136 catch(Exception e)
137 {
138 e.printStackTrace();
139 }
140 return img;
141 }
142 protected void draw_MainMiglogo(Graphics g)//LOGO狀態繪制
143 {
144 g.setClip(0, 0, 240, 320);
145 g.setColor(0x000000);
146 g.fillRect(0, 0, 240, 320);//清屏
147 g.setColor(0xffffff);
148 logoImg = loadImg("logo");
149 //g.drawImage(logoImg,240>>1,320>>1,Graphics.HCENTER | Graphics.VCENTER);
150 g.drawString("是否開啟音樂?", 73, 120, 0);
151 g.drawString("是", 5, 300, 0);
152 g.drawString("否", 220, 300, 0);
153
154 }
155
156 protected void process_MainMiglogo(int keyCode)//LOGO狀態邏輯處理
157 {
158 countTime++;
159 if(countTime > 50)//20次循環后轉入菜單狀態
160 {
161 out_MainMiglogo();
162 init_MainMenu();
163 }
164 }
165
166 protected void key_MainMiglogo(int keyCode) //LOGO狀態邏輯處理
167 {
168
169 }
170
171 protected void out_MainMiglogo() //退出LOGO狀態
172 {
173
174 }
175
176 //***********************2***********************
177 protected void init_MainMenu()//MENU狀態初始化
178 {
179 countTime = 0;
180 main_state = ONE_MAIN_MENU;
181 }
182
183 protected void draw_MainMenu(Graphics g)//MENU狀態繪制
184 {
185 g.setClip(0, 0, 240, 320);
186 g.setColor(0x000000);
187 g.fillRect(0, 0, 240,320);//清屏
188 g.setColor(0xffffff);
189 g.drawString("this Menu", 0, 0, 0);
190 g.drawString(""+key_state, 0, 20, 0);
191 }
192
193 protected void process_MainMenu(int keyCode) //MENU狀態邏輯
194 {
195
196 }
197
198 protected void key_MainMenu(int keyCode)//MENU狀態退出
199 {
200 switch(key_state)
201 {
202 case DC_KEY_SOFT_LEFT:
203 threadRunAble = false;//關閉線程
204 myMIDlet.quitApp();//關閉程序
205 break;
206 }
207 }
208 }
209
210
2 import com.nokia.mid.ui.FullCanvas;
3 import javax.microedition.lcdui.Display;
4 import javax.microedition.lcdui.Graphics;
5 import javax.microedition.lcdui.Image;
6 import javax.microedition.midlet.MIDlet;
7
8 public class GameCanvas extends FullCanvas implements Runnable
9 {
10 //#------------------------------游戲主要部分------------------------------
11 //#------------------------------公共變量------------------------------
12 private boolean threadRunAble = true;//線程運行條件
13 private Thread mainThread; //線程
14 private int key_state = 0;//當前鍵值
15 private boolean key_lock = false;//按鍵執行狀態 ture 執行時候其他邏輯繪制代碼不執行
16 private int main_state; //1級狀態變量
17 private int countTime;//時間控制
18 public final static int DC_KEY_SOFT_LEFT = -6; //左軟件(此鍵值為NOKIA鍵值)
19 public final static int DC_KEY_SOFT_RIGHT = -7; //右軟件
20 public final static int DC_KEY_SOFT_MID = -5;//中間鍵
21 public final static byte ONE_MAIN_MIGLOGO = 0;//米格閃屏
22 public final static byte ONE_MAIN_MENU = 3;//主菜單
23
24 //&------------------------------公共變量------------------------------
25 /**
26 * 構造函數
27 * 啟動游戲主線程,初始化
28 * @param midlet HeroMidlet
29 */
30 public GameCanvas(MIDlet midlet)
31 {
32 init_MainMiglogo();//一開始進入為LOGO狀態
33 Display.getDisplay(midlet).setCurrent(this);
34 mainThread = new Thread(this);
35 mainThread.start();//啟動主線程
36 }
37
38 /**
39 * 游戲主線程
40 */
41 public void run()//游戲主線程,不停的循環執行
42 {
43 while(threadRunAble)
44 {
45 if(!key_lock)
46 {
47 process_All();//邏輯處理
48 repaint(); //繪制
49 serviceRepaints();
50 }
51 }
52 }
53
54 /**
55 * 游戲繪制部分
56 * 根據主狀態處理不同的繪制
57 * @param Graphics
58 */
59 public void paint(Graphics g)
60 {
61 switch(main_state)//根據當前狀態處理當前狀態的繪制
62 {
63 case ONE_MAIN_MIGLOGO:
64 draw_MainMiglogo(g);//如果是LOGO狀態處理LOGO的繪制
65 break;
66 case ONE_MAIN_MENU:
67 draw_MainMenu(g);//如果是MENU狀態處理MENU的繪制
68 break;
69 }
70 }
71
72 /**
73 * 游戲邏輯控制部分
74 * 根據主狀態處理不同的邏輯
75 */
76 protected void process_All()
77 {
78 switch(main_state)
79 {
80 case ONE_MAIN_MIGLOGO:
81 process_MainMiglogo(key_state);//如果是LOGO狀態處理LOGO的邏輯
82 break;
83 case ONE_MAIN_MENU:
84 process_MainMenu(key_state);//如果是MENU狀態處理MENU的邏輯
85 break;
86 }
87 }
88
89 /**
90 * 游戲邏輯控制部分2,按鍵處理
91 * 根據主狀態處理不同的邏輯
92 * @param keyCode
93 */
94 protected void keyPressed(int keyCode)//當按鍵按下去執行一次
95 {
96 key_lock = true;
97 key_state = keyCode;
98 switch(main_state)
99 {
100 case ONE_MAIN_MIGLOGO:
101 key_MainMiglogo(key_state);//如果是LOGO狀態處理LOGO的按鍵處理
102 break;
103 case ONE_MAIN_MENU:
104 key_MainMenu(key_state);//如果是MENU狀態處理MENU的按鍵處理
105 break;
106 }
107 key_lock = false;
108 }
109
110 /**
111 * 釋放按鍵處理
112 * @param keyCode int
113 */
114 protected void keyReleased(int keyCode)//當按鍵松開執行一次
115 {
116 key_state = 0;
117 }
118
119 //&------------------------------游戲主要部分------------------------------
120 //***********************1***********************
121 protected void init_MainMiglogo()//LOGO狀態初始化
122 {
123 countTime = 0;
124 main_state = ONE_MAIN_MIGLOGO;
125 }
126
127 Image logoImg;
128
129 public final static Image loadImg(String pictureName)
130 {
131 Image img = null;
132 try
133 {
134 img = Image.createImage("/bin/"+pictureName+".png");
135 }
136 catch(Exception e)
137 {
138 e.printStackTrace();
139 }
140 return img;
141 }
142 protected void draw_MainMiglogo(Graphics g)//LOGO狀態繪制
143 {
144 g.setClip(0, 0, 240, 320);
145 g.setColor(0x000000);
146 g.fillRect(0, 0, 240, 320);//清屏
147 g.setColor(0xffffff);
148 logoImg = loadImg("logo");
149 //g.drawImage(logoImg,240>>1,320>>1,Graphics.HCENTER | Graphics.VCENTER);
150 g.drawString("是否開啟音樂?", 73, 120, 0);
151 g.drawString("是", 5, 300, 0);
152 g.drawString("否", 220, 300, 0);
153
154 }
155
156 protected void process_MainMiglogo(int keyCode)//LOGO狀態邏輯處理
157 {
158 countTime++;
159 if(countTime > 50)//20次循環后轉入菜單狀態
160 {
161 out_MainMiglogo();
162 init_MainMenu();
163 }
164 }
165
166 protected void key_MainMiglogo(int keyCode) //LOGO狀態邏輯處理
167 {
168
169 }
170
171 protected void out_MainMiglogo() //退出LOGO狀態
172 {
173
174 }
175
176 //***********************2***********************
177 protected void init_MainMenu()//MENU狀態初始化
178 {
179 countTime = 0;
180 main_state = ONE_MAIN_MENU;
181 }
182
183 protected void draw_MainMenu(Graphics g)//MENU狀態繪制
184 {
185 g.setClip(0, 0, 240, 320);
186 g.setColor(0x000000);
187 g.fillRect(0, 0, 240,320);//清屏
188 g.setColor(0xffffff);
189 g.drawString("this Menu", 0, 0, 0);
190 g.drawString(""+key_state, 0, 20, 0);
191 }
192
193 protected void process_MainMenu(int keyCode) //MENU狀態邏輯
194 {
195
196 }
197
198 protected void key_MainMenu(int keyCode)//MENU狀態退出
199 {
200 switch(key_state)
201 {
202 case DC_KEY_SOFT_LEFT:
203 threadRunAble = false;//關閉線程
204 myMIDlet.quitApp();//關閉程序
205 break;
206 }
207 }
208 }
209
210
myMIDlet.java
1 package MyJava3;
2 import javax.microedition.midlet.*;
3
4 public class myMIDlet extends MIDlet
5 {
6 static myMIDlet instance;//生成一個靜態的myMIDlet的實例
7 GameCanvas displayable;//創建一個myCanvas實例
8
9 public myMIDlet()
10 {
11 instance = this;
12 }
13
14 public void startApp()//啟動(該方法必須存在)
15 {
16 displayable = new GameCanvas(this);
17 }
18
19 public void pauseApp()//暫停(該方法必須存在)
20 {
21
22 }
23
24 public void destroyApp(boolean unconditional)//銷毀(該方法必須存在)
25 {
26
27 }
28
29 public static void quitApp()//退出,此方法為JBuilder自動為我們生成,但不是必須的,你可以自定義其名稱和內容以完成退出功能
30 {
31 instance.destroyApp(true);
32 instance.notifyDestroyed();
33 instance = null;
34 }
35 }
2 import javax.microedition.midlet.*;
3
4 public class myMIDlet extends MIDlet
5 {
6 static myMIDlet instance;//生成一個靜態的myMIDlet的實例
7 GameCanvas displayable;//創建一個myCanvas實例
8
9 public myMIDlet()
10 {
11 instance = this;
12 }
13
14 public void startApp()//啟動(該方法必須存在)
15 {
16 displayable = new GameCanvas(this);
17 }
18
19 public void pauseApp()//暫停(該方法必須存在)
20 {
21
22 }
23
24 public void destroyApp(boolean unconditional)//銷毀(該方法必須存在)
25 {
26
27 }
28
29 public static void quitApp()//退出,此方法為JBuilder自動為我們生成,但不是必須的,你可以自定義其名稱和內容以完成退出功能
30 {
31 instance.destroyApp(true);
32 instance.notifyDestroyed();
33 instance = null;
34 }
35 }

