📄 wargame.java
字号:
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.GameCanvas;
import java.io.IOException;
public class WarGame extends GameCanvas implements Runnable
{
private MainSelect mainSelect = null;
//循环控制器
private boolean stop = false;
//主角生死标志
private boolean actorDead = false;
//主角
private Sprite actorSprite = null;
//主角方向状态——上(0)下(1)左(2)右(3)
private int currentDirectStatus = 0;
private int lastDirectStatus = 0;
//主角现在坐标
private int currentX = 0, currentY = 0;
//主角现在的帧
private int currentFrame = 0;
//按下的方向键
private boolean isClicked = false;
//wall管理
private WallManager wallManager = null;
//敌人管理
private EnemyManager enemyManager = null;
//子弹管理
private BulletManager bulletManager = null;
//动画管理器
private FlashManager flashManager = null;
public WarGame(MainSelect ms, WallManager tempWallManager)
{
super(true);
mainSelect = ms;
setFullScreenMode(true);
//精灵管理器
wallManager = tempWallManager;
//System.out.println("FlashManager:");
flashManager = new FlashManager();
//System.out.println("FlashManager……");
enemyManager = new EnemyManager(tempWallManager, flashManager);
//System.out.println("EnemyManager……");
bulletManager = new BulletManager(tempWallManager, enemyManager);
//System.out.println("BulletManager……");
initActorSprite();
new Thread(this).start();
//System.out.println("WarGame初始化完毕");
}
private void initActorSprite()
{
try
{
Image actorImage = Image.createImage("/actor.png");
actorSprite = new Sprite(actorImage, War.ACTOR_WIDTH, War.ACTOR_HEIGHT);
//以下两种坐标的转换要求ACTOR_WIDTH是STEP_WIDTH的整数倍,ACTOR_HEIGHT是STEP_HEIGHT的整数倍
int tempActorX = wallManager.getActorX();
int tempActorY = wallManager.getActorY();
currentX = tempActorX * War.ACTOR_WIDTH / War.STEP_WIDTH;
currentY = tempActorY * War.ACTOR_HEIGHT / War.STEP_HEIGHT;;
//System.out.println("主角的默认坐标是:" + tempActorX + ":" + tempActorY);
actorSprite.setPosition(War.WAR_FIELD_LEFT + currentX * War.STEP_WIDTH, War.WAR_FIELD_TOP + currentY * War.STEP_HEIGHT);
actorSprite.setFrame(War.DEFAULT_FRAME);
//System.out.println("主角此时的坐标是:" + actorSprite.getX() + ":" + actorSprite.getY());
}
catch (IOException ie)
{
}
}
public void run()
{
Graphics g = getGraphics();
while(!stop && !actorDead)
{
input();
drawScreen(g);
try
{
Thread.sleep(War.DISPLAY_TIME);
}
catch (InterruptedException ie)
{
}
flushGraphics();
}
//战争结束,开始绘制结束动画
int R = 255, G = 255, B = 255;
while (actorDead && !stop)
{
g.setColor(0, 0, 0);
g.fillRect(0, 0, War.WIDTH, War.HEIGHT);
g.setColor(R, G, B);
g.fillRect(War.WAR_FIELD_LEFT, War.WAR_FIELD_TOP, War.WAR_FIELD_WIDTH, War.WAR_FIELD_HEIGHT);
G -= War.ACTOR_DEAD_COLOR;
B -= War.ACTOR_DEAD_COLOR;
actorSprite.move(0, War.ACTOR_DEAD_RATE);
actorSprite.paint(g);
try
{
Thread.sleep(War.DISPLAY_TIME);
}
catch (InterruptedException ie)
{
}
flushGraphics();
if (G < 0 || B < 0 || actorSprite.getY() > War.WAR_FIELD_HEIGHT + War.WAR_FIELD_TOP)
{
stop = true;
}
}
WarMidlet.dis.setCurrent(mainSelect);
}
private void input()
{
int keyState=getKeyStates();
lastDirectStatus = currentDirectStatus;
//UP
if((keyState&GameCanvas.UP_PRESSED)!=0)
{
currentDirectStatus = 0;
isClicked = true;
}
//DOWN
if((keyState&GameCanvas.DOWN_PRESSED)!=0)
{
currentDirectStatus = 1;
isClicked = true;
}
//LEFT
if((keyState&GameCanvas.LEFT_PRESSED)!=0)
{
currentDirectStatus = 2;
isClicked = true;
}
//RIGHT
if((keyState&GameCanvas.RIGHT_PRESSED)!=0)
{
currentDirectStatus = 3;
isClicked = true;
}
if((keyState&GameCanvas.FIRE_PRESSED)!=0)
{
//System.out.println("主角的坐标原点是" + actorSprite.getRefPixelX() + ":" + actorSprite.getRefPixelY());
bulletManager.addBullet(currentDirectStatus, War.WAR_FIELD_LEFT + currentX * War.STEP_WIDTH, War.WAR_FIELD_TOP + currentY * War.STEP_HEIGHT);
//enemyManager.addEnemy();
//可以单独开一个线程用来控制产生敌人
}
}
private void drawScreen(Graphics g)
{
//绘制背景
g.setColor(0,0,0);
g.fillRect(0,0,War.WIDTH,War.HEIGHT);
//绘制战争区域
g.setColor(0,255,0);
g.fillRect(War.WAR_FIELD_LEFT, War.WAR_FIELD_TOP, War.WAR_FIELD_WIDTH, War.WAR_FIELD_HEIGHT);
//绘制墙
wallManager.updateWall(g);
//绘制敌人产生地
g.setColor(255,0,0);
g.fillRect(War.WAR_FIELD_LEFT, War.WAR_FIELD_TOP, War.ENEMY_WIDTH, War.ENEMY_HEIGHT);
//绘制主角
drawActor(g);
//绘制子弹
bulletManager.updateBullet(g);
//绘制敌人
enemyManager.updateEnemy(g);
//绘制动画
flashManager.updateFlash(g);
}
private void drawActor(Graphics g)
{
//System.out.println("主角此时的坐标是:" + actorSprite.getX() + ":" + actorSprite.getY());
if (isClicked)
{
//System.out.println("有击键事件出现");
if (currentDirectStatus == 0)
{//上
if (currentDirectStatus != lastDirectStatus)
{
currentFrame = 1;
}
else
{
currentFrame = (currentFrame+1)%3;
if (currentY != 0)
{
currentY--;
actorSprite.move(0, -War.STEP_HEIGHT);
if (isLimited())
{
currentY++;
}
}
}
}
else if (currentDirectStatus == 1)
{//下
if (currentDirectStatus != lastDirectStatus)
{
currentFrame = 7;
}
else
{
currentFrame = 6 + (currentFrame - 6 + 1)%3;
if (currentY != (War.V_NUMBER - 1) * War.ACTOR_HEIGHT)
{
currentY++;
actorSprite.move(0, War.STEP_HEIGHT);
if (isLimited())
{
currentY--;
}
}
}
}
else if (currentDirectStatus == 2)
{//左
if (currentDirectStatus != lastDirectStatus)
{
currentFrame = 10;
}
else
{
currentFrame = 9 + (currentFrame - 9 + 1)%3;
if (currentX != 0)
{
currentX--;
actorSprite.move(-War.STEP_WIDTH, 0);
if (isLimited())
{
currentX++;
}
}
}
}
else
{//右
if (currentDirectStatus != lastDirectStatus)
{
currentFrame = 4;
}
else
{
currentFrame = 3 + (currentFrame - 3 + 1)%3;
if (currentX != (War.H_NUMBER - 1) * War.ACTOR_WIDTH)
{
currentX++;
actorSprite.move(War.STEP_WIDTH, 0);
if (isLimited())
{
currentX--;
}
}
}
}
actorSprite.setPosition(War.WAR_FIELD_LEFT + currentX * War.STEP_WIDTH, War.WAR_FIELD_TOP + currentY * War.STEP_HEIGHT);
actorSprite.setFrame(currentFrame);
isClicked = false;
}
//System.out.println("主角此时的坐标是:" + actorSprite.getX() + ":" + actorSprite.getY());
if (enemyManager.collidesWith(actorSprite))
{
actorDead = true;
return;
}
actorSprite.paint(g);
}
private boolean isLimited()
{
//墙阻挡
if (wallManager.collidesWith(actorSprite))
{
return true;
}
//边界阻挡
if (actorSprite.getX() < War.WAR_FIELD_LEFT || actorSprite.getX() > War.WAR_FIELD_LEFT + War.WAR_FIELD_WIDTH - War.ACTOR_WIDTH || actorSprite.getY() < War.WAR_FIELD_TOP || actorSprite.getY() > War.WAR_FIELD_TOP + War.WAR_FIELD_HEIGHT - War.ACTOR_HEIGHT)
{
return true;
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -