J2ME游戏开发
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 }