📄 maincanvas.java
字号:
package demo;
import PlaneMidlet;
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.LayerManager;
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 Scene m_Scene; //场景对象
private PlayerPlane m_Plane; //玩家飞机对象
private EnemyPlane m_aEnemy[]; //敌方飞机对象
private ExplosionSprite m_aExplosion[]; //爆炸对象
private LayerManager m_LayerManager; //层管理器对象
private int m_nScore = 0; //游戏的得分
private Random m_Random; //随机数对象
public MainCanvas( ){
super(true);
try{
//创建用户界面,并设置界面中的按钮
MyButton button = new MyButton();
m_UI = new MyUI(button);
}
catch(Exception exception){}
setState(GAME_UI);
Start();
}
//重新开局
private void Reset(){
//创建随机数
if( m_Random == null )
m_Random = new Random();
//创建层管理器
if( m_LayerManager == null )
m_LayerManager = new LayerManager();
//创建玩家飞机
if( m_Plane == null ){
try{
Image img = Image.createImage("/demo/plane.png");
m_Plane = new PlayerPlane( img, 21, 21 );
//将玩家飞机及其控制的导弹添入层管理器
m_LayerManager.append( m_Plane );
m_LayerManager.append( m_Plane.m_Missile );
m_Plane.setVisible(true);
}
catch (Exception e){}
}
int nX = getWidth() / 2;
int nY = getHeight() - 30;
//设置玩家飞机的初始位置
m_Plane.setRefPixelPosition( nX, nY );
//创建敌方飞机
if( m_aEnemy == null ){
try{
Image img = Image.createImage("/demo/enemy.png");
m_aEnemy = new EnemyPlane[6];
for( int n = 0; n < m_aEnemy.length; n ++ ){
m_aEnemy[n] = new EnemyPlane( img, 15, 15 );
//将敌方飞机及其控制的导弹添入层管理器
m_LayerManager.append( m_aEnemy[n] );
m_LayerManager.append( m_aEnemy[n].m_Missile );
}
}
catch (Exception e){}
}
//创建爆炸
if( m_aExplosion == null ){
try{
Image img = Image.createImage("/demo/explosion.png");
m_aExplosion = new ExplosionSprite[5];
for( int n = 0; n < m_aExplosion.length; n ++ ){
m_aExplosion[n] = new ExplosionSprite( img, 21, 17 );
//将爆炸对象添入到层管理器
m_LayerManager.append( m_aExplosion[n] );
}
}
catch (Exception e){}
}
//创建场景
if( m_Scene == null ){
m_Scene = new Scene(m_Random, getWidth(), getHeight());
m_Scene.LoadMap();
//将场景图像添入层管理器
m_LayerManager.append(m_Scene.m_TLayer);
}
//设置可视区域
m_LayerManager.setViewWindow(0, 0, getWidth(), getHeight());
}
private void setState( int state ){ //设置游戏状态
if( state < 0 || state >= GAME_STATE_NUM )
return;
m_nState = state;
switch( m_nState ){
case GAME_UI: //进入用户界面
m_UI.setState(MyUI.UI_TITLE); //显示标题界面
break;
case GAME_GAMING: //正在游戏
m_UI.setState(MyUI.UI_HIDE);
break;
}
}
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 > 50 ){ //间隔50毫秒
T1 = T2;
Input();
Logic();
Paint();
}
}
}
public void Stop(){
m_bRunning = false;
}
public void Input(){
int keyStates = getKeyStates();
switch( m_nState ){
case GAME_UI:
{
switch( m_UI.Input( keyStates ) ){
case MyButton.BUTTON_START: //按下开始键
Reset();
setState(GAME_GAMING);
break;
case MyButton.BUTTON_EXIT: //按下退出键
PlaneMidlet.midlet.notifyDestroyed();
break;
}
}
break;
case GAME_GAMING: //游戏中
m_Plane.Input( keyStates );
break;
}
}
public void Logic(){
switch( m_nState ){
case GAME_GAMING: //游戏中
m_Scene.Logic(getWidth(), getHeight()); //场景逻辑
m_Plane.Logic(getWidth(), getHeight()); //自机逻辑
for( int n = 0; n < m_aEnemy.length; n ++ ) //敌机逻辑
m_aEnemy[n].Logic(getWidth(), getHeight());
for( int n = 0; n < m_aExplosion.length; n++ ) //爆炸逻辑
m_aExplosion[n].Logic();
CreateEnemy(); //产生新的敌机
CheckCollisions(); //碰撞检测
break;
}
}
public void Paint(){
Graphics g = getGraphics();
//用黑色清屏
g.setColor(0);
g.fillRect( 0, 0, getWidth(), getHeight() );
g.setColor(0xFFFF0000);
switch( m_nState ){
case GAME_UI: //显示用户界面
m_UI.Paint(g, getWidth(), getHeight());
break;
case GAME_GAMING: //显示游戏画面
m_LayerManager.paint( g, 0, 0 );
break;
case GAME_END: //游戏结束
m_LayerManager.paint( g, 0, 0 );
StringBuffer buff = new StringBuffer();
buff.append("本次得分:");
buff.append(m_nScore);
g.drawString(buff.toString(), 50, 50, 0);
break;
}
flushGraphics();
}
private void CreateEnemy(){ //产生新的敌机
//同一时刻,屏幕上最多有m_aEnemy.length架敌机
for( int n = 0; n < m_aEnemy.length; n ++ ){
if( m_aEnemy[n].isVisible() )
continue;
int nX = m_Random.nextInt();
nX = Math.abs( nX % ( getWidth() - 10 ) ) + 5;
int nSpeedX = m_Random.nextInt() % 2;
int nSpeedY = Math.abs( m_Random.nextInt() % 2 ) + 1;
m_aEnemy[n].SetSpeed( nSpeedX, nSpeedY );
m_aEnemy[n].setRefPixelPosition( nX, 0 );
m_aEnemy[n].setVisible(true);
return;
}
}
private void CheckCollisions(){ //碰状检测
for( int n = 0; n < m_aEnemy.length; n ++ ){
//自机与敌方炮弹碰撞
if( m_Plane.collidesWith( m_aEnemy[n].m_Missile, true ) ){
CreateExplosion( m_Plane.getRefPixelX(),
m_Plane.getRefPixelY() );
m_aEnemy[n].m_Missile.setVisible(false);
setState(GAME_END);
return;
}
//我方炮弹与敌机碰撞
if( m_Plane.m_Missile.collidesWith( m_aEnemy[n], true ) ){
CreateExplosion( m_aEnemy[n].getRefPixelX(),
m_aEnemy[n].getRefPixelY() );
m_nScore ++;
m_aEnemy[n].setVisible(false);
m_Plane.m_Missile.setVisible(false);
}
}
}
private void CreateExplosion( int nX, int nY ){ //产生爆炸动画
for( int n = 0; n < m_aExplosion.length; n ++ ){
if( m_aExplosion[n].isVisible() )
continue;
m_aExplosion[n].setRefPixelPosition( nX, nY );
m_aExplosion[n].setFrame(0);
m_aExplosion[n].setVisible(true);
return;
}
m_aExplosion[0].setRefPixelPosition( nX, nY );
m_aExplosion[0].setFrame(0);
m_aExplosion[0].setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -