📄 maincanvas.java
字号:
package demo;
import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
public class MainCanvas extends GameCanvas implements Runnable{
public static final int GAME_UI = 0; //进入用户界面
public static final int GAME_GAMING = 1; //进行游戏
public static final int GAME_END = 2; //游戏结束
public static final int GAME_STATE_NUM = 3; //状态总数
private int m_nState = GAME_UI; //存储当前的游戏状态
private boolean m_bRunning; //控制线程运行
private MyUI m_UI; //界面对象
private MyBack m_Back; //背景对象
private String m_aQuestion[] = //问题数组
{ "May I __ you?",
"Thank you very __!",
"Not __ all!",
"Of __!" };
private String m_aResult[][] = //答案数组,包括正确与不正确
{ {"can","help","do"},
{"right","yellow","mach"},
{"at","on","up"},
{"cause","right","no"} };
private int m_nResultIndex[] = { 1, 2, 0, 0 }; //答案中正确的索引
private int m_nQIndex = 0; //当前题目的索引
private Fisher m_Fisher; //钓鱼者对象
private FishSprite m_aFish[]; //鱼对象数组
private Random m_Random; //随机数对象
private Sprite m_TextSprite; //文字对象
public MainCanvas(){
super(true);
m_UI = new MyUI();
m_Back = new MyBack();
m_Random = new Random();
try{
//创建掉鱼者
m_Fisher = new Fisher();
m_Fisher.setInitPosition(10, getHeight()/2 - 50);
//创建鱼
Image img = Image.createImage("/demo/fish.png");
m_aFish = new FishSprite[3];
for( int n = 0; n < m_aFish.length; n ++ ){
m_aFish[n] = new FishSprite( img, 25, 17 );
}
//创建文字
Image imgText = Image.createImage("/demo/text.png");
m_TextSprite = new Sprite(imgText, 81, 20);
m_TextSprite.setPosition(getWidth()/2-40, getHeight()/2-10);
}
catch (Exception ex){}
ResetFish(); //根据题目,设置小鱼
Start(); //启动线程
}
private void ResetFish(){ //根据题目,设置小鱼
//设置小鱼的位置,和携带的答案
m_nQIndex = Math.abs( m_Random.nextInt() %
m_aQuestion.length );
int y = getHeight() / 2 - 10;
for( int n = 0; n < m_aFish.length; n ++ ){
m_aFish[n].StartMove(m_aResult[m_nQIndex][n], getWidth(), y);
y = y + 30;
}
}
public void Start(){
m_bRunning = true;
Thread thread = new Thread(this); //分配新线程
thread.start(); //线程启动
}
public void run() { //新线程自动调用此方法
//获取系统当前时间,并将时间换算成以毫秒为单位的数
long T1 = System.currentTimeMillis();
long T2 = T1;
while(m_bRunning){
T2 = System.currentTimeMillis();
if( T2 - T1 > 100 ){ //间隔100毫秒
T1 = T2;
Input();
Logic();
Paint();
}
}
}
public void Stop(){ //终止游戏
m_bRunning = false;
}
public void Input(){
int keyStates = getKeyStates();
switch( m_nState ){
case GAME_UI:
m_UI.Input( keyStates );
if( m_UI.getState() == MyUI.UI_HIDE )
m_nState = GAME_GAMING;
break;
case GAME_GAMING:
m_Fisher.Input(keyStates, getWidth());
break;
case GAME_END:
if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 ){
m_nState = GAME_GAMING;
ResetFish();
}
break;
}
}
public void Logic(){
switch( m_nState ){
case GAME_UI:
break;
case GAME_GAMING:
for( int n = 0; n < m_aFish.length; n ++ ){
m_aFish[n].Logic();
if( m_aFish[n].collidesWith(m_Fisher.getHook(),true) )
{//如果钓到鱼了
m_nState = GAME_END;
if( n == m_nResultIndex[m_nQIndex] )
m_TextSprite.setFrame(0);
else
m_TextSprite.setFrame(1);
break;
}
if( m_aFish[n].getRefPixelX() < - 10 )
{//如果有鱼跑道屏幕最左侧
m_nState = GAME_END;
m_TextSprite.setFrame(1);
break;
}
}
break;
}
}
public void Paint(){
Graphics g = getGraphics();
//用黑色清屏
g.setColor(0);
g.fillRect( 0, 0, getWidth(), getHeight() );
switch( m_nState ){
case GAME_UI: //进入界面
m_UI.Paint(g, getWidth(), getHeight());
break;
case GAME_GAMING: //进入游戏
m_Back.Paint(g, getWidth(), getHeight());
g.drawString(m_aQuestion[m_nQIndex], 10, 10, 0);
for( int n = 0; n < m_aFish.length; n ++ ){
m_aFish[n].PaintWithText(g);
}
m_Fisher.Paint(g);
break;
case GAME_END: //本次结束
m_Back.Paint(g, getWidth(), getHeight());
m_TextSprite.paint(g);
break;
}
flushGraphics();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -