www.pudn.com > TWPlaneGame.rar > PlaneGameCanvas.java
package twplanegame;
import javax.microedition.lcdui.*;
import java.util.*;
/*
public class PlaneGameCanvas extends Canvas {
public PlaneGameCanvas() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
/**Component initialization*/
// private void jbInit() throws Exception {
// Set up this Displayable to listen to command events
// setCommandListener(new PlaneGameCanvas_CommandAdapter(this));
// add the Exit command
// addCommand(new Command("Exit", Command.EXIT, 1));
// }
/**Handle command events*/
// public void this_commandPerformed(Command command, Displayable displayable) {
/** @todo Add command handling code */
// if (command.getCommandType() == Command.EXIT) {
// stop the MIDlet
// PlaneGameMIDlet.quitApp();
// }
// }
/** Required paint implementation */
// protected void paint(Graphics g) {
/** @todo Add paint codes */
// }
//}
/*
class PlaneGameCanvas_CommandAdapter implements CommandListener {
private PlaneGameCanvas instance;
public PlaneGameCanvas_CommandAdapter(PlaneGameCanvas instance) {
this.instance = instance;
}
public void commandAction(Command command, Displayable displayable) {
instance.this_commandPerformed(command, displayable);
}
}
*/
class PlaneGameCanvas
extends Canvas
implements CommandListener, KeyRepeater, ActionListener
{
// save some calculated values for speed
private int m_maxX = getWidth() - 1;
private int m_maxY = getHeight() - 1;
private int m_imageWidth;
private int m_imageHeight;
// values we need for movement
private int m_x = m_maxX / 2;
private int m_y = m_maxY / 2;
// objects necessary for app
private AppExiter m_appExiter;
private KeyRepeat m_repeat = new KeyRepeat(this);
// private Constant cons = new Constant(); //in order to use self-defined constants
//actionUpDater,draw the screen every interval time
private static final ActionUpdater m_updater = new ActionUpdater(0, 10);
//Back ground mover
private final ImageScroller m_scroller;
boolean painting = false;
//*****MY PLANE******//
private MyPlane myplane;
private Image myplaneRed;
private Image myplaneExp;
//*****MY BULLET*****//
private Bullet[] mybullet = new Bullet[10];
private final BulletScroller b_scroller;
private boolean SendBulletTag;
//****ENEMY PLANES****//
private EnemyPlane[] ePlane = new EnemyPlane[5];
private final ePlaneScroller p_scroller;
//******ENEMY PLANE BULLET*****//
private Bullet[] eBullet = new Bullet[10];
//******ENEMY BOSS*******//
private EnemyBoss eBoss;
//******BOSS BULLET******//
private Bullet[] bossBullet = new Bullet[15];
private Image tempImage;
/**
* The constructor assigns the AppExiter, load the image, and initialies
* all the constants. It also adds the EXIT Command, and registers itself
* as a command listener.
*/
public PlaneGameCanvas(AppExiter exiter)
{
m_appExiter = exiter;
//**intiate my plane
myplane = new MyPlane(10, m_y);
try {
myplaneRed = Image.createImage("/myplane_red.PNG");
}
catch (Exception e) {
myplaneRed = null;
}
try {
myplaneExp = Image.createImage("/explosion.PNG");
}
catch (Exception e) {
myplaneExp = null;
}
//**intiate my plane's bullet array
for (int i = 0; i < mybullet.length; i++) {
mybullet[i] = new Bullet(0);
}
SendBulletTag = true;
//**initiate enemy plane array
for (int i = 0; i < ePlane.length; i++) {
ePlane[i] = new EnemyPlane();
}
//**initiate enemy boss
eBoss = new EnemyBoss(1, m_maxX, m_maxY / 2);
p_scroller = new ePlaneScroller(this, 50);
//**initiate enemy plane's bullet array
for (int i = 0; i < eBullet.length; i++) {
eBullet[i] = new Bullet(1);
}
//**initiat boss bullet array
for (int i = 0; i < bossBullet.length; i++) {
bossBullet[i] = new Bullet(2);
}
b_scroller = new BulletScroller(this, 50);
//** init back ground scroller
m_scroller = new ImageScroller(this, 200);
register(this);
//** add the EXIT command to the Canvas
addCommand(AppExiter.EXIT);
// register the Canavas as the listener for Commands, the action for
// the Commands will be handled in the commandAction() method
setCommandListener(this);
m_repeat.setSleepPeriod(20);
m_repeat.start();
}
protected void paint(Graphics g)
{
painting = true;
int x, y;
//*****clear the screen
g.setColor(0, 0, 0);
g.fillRect(0, 0, m_maxX + 1, m_maxY + 1);
//draw the background
m_scroller.paint(g);
//draw enemy planes
p_scroller.paint(g);
//draw bullets
b_scroller.paint(g);
// draw my plane
x = myplane.getXPos();
y = myplane.getYPos();
tempImage = myplane.getImage();
switch (myplane.getState()) {
case PlaneGameObject.ALIVE:
g.drawImage(tempImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
break;
case PlaneGameObject.HIT:
g.drawImage(myplaneRed, x, y,
Graphics.VCENTER | Graphics.HCENTER);
myplane.SetState(PlaneGameObject.ALIVE);
break;
case PlaneGameObject.BOMBING:
g.drawImage(myplaneExp, x, y,
Graphics.VCENTER | Graphics.HCENTER);
// Game Over
break;
}
painting = false;
}
protected void keyRepeated(int keyCode)
{
if (hasRepeatEvents()) {
moveMyPlane(getGameAction(keyCode));
m_repeat.stopRepeat(FIRE);
}
}
/**
* Called when a key is pressed.
*
* @param keyCode The key code of the key that was pressed.
*/
protected void keyPressed(int keyCode)
{
// if this MIDP implementation does not support repeated keys
// then start our own key repeatert
if (!hasRepeatEvents()) {
m_repeat.startRepeat(getGameAction(keyCode));
}
}
/**
* Called when a key is released.
*
* @param keyCode The key code of the key that was pressed.
*/
protected void keyReleased(int keyCode)
{
// if this MIDP implementation does not support repeated keys
// then stop our key repeater
if (!hasRepeatEvents()) {
m_repeat.stopRepeat(getGameAction(keyCode));
}
}
public boolean sendBullet(int a_x, int a_y, int tag)
{
int offset = myplane.getImageWidth() / 2;
switch (tag) {
case 0: //my plane Send bullet
for (int i = 0; i < mybullet.length; i++) { //find empty space
if (!mybullet[i].IsShow()) { //available space in array
mybullet[i].SetID(myplane.getBulletType()); //set id
mybullet[i].SetSpeed(10, 0);
mybullet[i].ShowTrue(); //take the space
mybullet[i].SetPos(a_x + offset, a_y);
return true; //!!break here if sent one bullet,very important
}
}
return false;
case 1: //enemy plane send bullet
for (int j = 0; j < eBullet.length; j++) {
if (!eBullet[j].IsShow()) {
eBullet[j].SetSpeed(3, 3);
eBullet[j].ShowTrue();
eBullet[j].SetPos(a_x, a_y);
return true;
}
} //for
return false;
case 2: //enemy boss send bullet
for (int i = 0; i < bossBullet.length; i++) {
if (!bossBullet[i].IsShow()) {
bossBullet[i].ShowTrue();
bossBullet[i].SetSpeed( -2, i / 3 - 2);
bossBullet[i].SetPos(a_x, a_y);
}
}
return true;
} //switch(tag)
return false;
} //sendBullet
public void moveMyPlane(int gameAction)
{
//change the data of my plane
int dx = 0, dy = 0;
int x_pos = myplane.getXPos();
int y_pos = myplane.getYPos();
int s = myplane.getSpeed();
switch (gameAction) {
case UP:
if (y_pos > 0) {
dy -= s;
}
if (SendBulletTag) {
if (sendBullet(x_pos, y_pos, 0)) {
SendBulletTag = false;
}
}
break;
case LEFT:
if (x_pos > 0) {
dx -= s;
}
break;
case DOWN:
if (y_pos < m_maxY) {
dy += s;
}
if (SendBulletTag) {
if (sendBullet(x_pos, y_pos, 0)) {
SendBulletTag = false;
}
}
break;
case RIGHT:
if (x_pos < m_maxX) {
dx += s;
}
break;
case FIRE:
if (SendBulletTag) {
if (sendBullet(x_pos, y_pos, 0)) {
SendBulletTag = false;
}
}
break;
}
myplane.ChangePos(dx, dy);
repaint();
}
//judge whether the two given objects collided
public boolean Collision(PlaneGameObject obj1, PlaneGameObject obj2)
{
int r1 = obj1.getRadius();
int r2 = obj2.getRadius();
int x1 = obj1.getXPos();
int x2 = obj2.getXPos();
int y1 = obj1.getYPos();
int y2 = obj2.getYPos();
int distance = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
if (distance < (r1 + r2) * (r1 + r2)) { //indicate that collided
return true; //return true
}
else {
return false;
}
} //Collision()
/**
* Called when a game action is to be performed.
*/
public void performAction()
{
repaint();
}
/**
* Register the DisplayObject with the action updater.
*
* @param obj The object to be registered.
*/
public static void register(ActionListener obj)
{
m_updater.register(obj);
}
public void commandAction(Command c, Displayable d)
{
if (c == AppExiter.EXIT) {
m_repeat.cancel();
m_repeat = null;
m_appExiter.exitApp();
}
}
//class BulletScroller controls the movement of my bullets by time
class BulletScroller
extends TimerTask
{
private final Timer m_updateTimer = new Timer();
private int ClockTag;
private final int m_screenWidth;
private final int m_screenHeight;
private int m_x;
private int m_y;
private Image myBulletImage;
private Image eBulletImage;
private Image bossBulletImage;
public BulletScroller(Canvas screen, int interval)
{
m_screenWidth = screen.getWidth();
m_screenHeight = screen.getHeight();
myBulletImage = mybullet[0].getImage();
eBulletImage = eBullet[0].getImage();
bossBulletImage = bossBullet[0].getImage();
m_updateTimer.schedule(this, 0, interval);
ClockTag = 0;
}
public void run()
{
ClockTag++;
if (ClockTag % 2 == 0) {
SendBulletTag = true;
ClockTag = 0;
}
//my bullets move
for (int i = 0; i < mybullet.length; i++) {
if (mybullet[i].IsShow()) {
mybullet[i].ChangePos(mybullet[i].GetXSpeed(), 0); //move
if (mybullet[i].getXPos() >= m_screenWidth) { //out of the screen
mybullet[i].ShowFalse();
}
}
} //for
//enemy plane bullets move and judge whether hit my plane
for (int i = 0; i < eBullet.length; i++) {
if (eBullet[i].IsShow()) {
eBullet[i].ChangePos( -eBullet[i].GetXSpeed(), 0); //move
if (eBullet[i].getXPos() <= 0) { //out of screen
eBullet[i].ShowFalse();
} //if
if (Collision(eBullet[i], myplane)) { //hit my plane?
eBullet[i].ShowFalse();
myplane.ChangeHP( -1);
myplane.SetState(PlaneGameObject.HIT);
if (myplane.getHP() <= 0) {
myplane.SetState(PlaneGameObject.BOMBING);
}
}
} //if
} //for
//enemy boss bullets move
for (int i = 0; i < bossBullet.length; i++) {
if (bossBullet[i].IsShow()) {
bossBullet[i].ChangePos(bossBullet[i].GetXSpeed(),
bossBullet[i].GetYSpeed());
if (bossBullet[i].getXPos() < 0 ||
bossBullet[i].getYPos() < 0 ||
bossBullet[i].getYPos() >= m_screenHeight) {
bossBullet[i].ShowFalse();
}
if (Collision(bossBullet[i], myplane)) { //hit my plane?
bossBullet[i].ShowFalse();
myplane.ChangeHP( -1);
myplane.SetState(PlaneGameObject.HIT);
if (myplane.getHP() <= 0) {
myplane.SetState(PlaneGameObject.BOMBING);
}
}
}
} //for
} //void run()
void paint(Graphics g)
{
int x, y;
//draw my bullets
for (int i = 0; i < mybullet.length; i++) {
if (mybullet[i].IsShow()) {
x = mybullet[i].getXPos();
y = mybullet[i].getYPos();
g.drawImage(myBulletImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
} //if
} //for
//draw enemy plane bullets
for (int i = 0; i < eBullet.length; i++) {
if (eBullet[i].IsShow()) {
x = eBullet[i].getXPos();
y = eBullet[i].getYPos();
g.drawImage(eBulletImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
} //if
} //for
//draw enmey boss bullets
for (int i = 0; i < bossBullet.length; i++) {
if (bossBullet[i].IsShow()) {
x = bossBullet[i].getXPos();
y = bossBullet[i].getYPos();
g.drawImage(bossBulletImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
} //if
} //for
} //void paint()
} //end of class BulletScroller
//class PlaneScroller controls the move of the enemy planes by time
class ePlaneScroller
extends TimerTask
{
private final Timer m_updateTimer = new Timer();
private int ClockTag = 0;
private Random generator = new Random();
private final int m_maxX; //最大的横坐标值
private final int m_maxY; //最大的纵坐标值
private int m_x;
private int m_y;
private Image ExpImage;
private Image BossExpImage;
private Image BossRedImage;
private Image tempImage;
public ePlaneScroller(Canvas screen, int interval)
{
m_maxX = screen.getWidth() - 1;
m_maxY = screen.getHeight() - 1;
m_updateTimer.schedule(this, 200, interval);
try {
ExpImage = Image.createImage("/explosion.png");
}
catch (Exception e) {
ExpImage = null;
}
try {
BossExpImage = Image.createImage("/bossexplosion.png");
}
catch (Exception e) {
BossExpImage = null;
}
try {
BossRedImage = Image.createImage("/Boss01_red.PNG");
}
catch (Exception e) {
BossRedImage = null;
}
}
public void run()
{
int temp;
int i, dx, dy;
ClockTag++;
//generate enemy planes
for (i = 0; i < ePlane.length; i++) {
if (!ePlane[i].IsShow()) { //generate a radom int
temp = (generator.nextInt() % (3 * m_maxY));
if (temp < m_maxY) { //generate a new enemy plane
ePlane[i].ShowTrue();
ePlane[i].SetPos(m_maxX, temp); //!SetPos not ChangePos
temp = (generator.nextInt() % 3 + 1);
ePlane[i].SetValue(temp); //decide plane type
}
}
}
// enemy plane flys(change position)
for (i = 0; i < ePlane.length; i++) {
if (ePlane[i].IsShow() &&
ePlane[i].getState() == PlaneGameObject.ALIVE) {
dx = ePlane[i].getXSpeed();
dy = ePlane[i].getYSpeed();
switch (ePlane[i].getFlyType()) {
case 1:
ePlane[i].ChangePos( -dx, 0);
break;
case 2:
ePlane[i].ChangePos( -2 * dx, -dy);
break;
case 3:
ePlane[i].ChangePos( -2 * dx, dy);
break;
default:
ePlane[i].ChangePos( -dx, 0);
}
if (ePlane[i].getXPos() <= 0 || ePlane[i].getYPos() <= 0 ||
ePlane[i].getYPos() >= m_maxY) { //dismiss it
ePlane[i].ShowFalse();
} //end if
}
} //end for
//enemy planes send bullets
for (i = 0; i < ePlane.length; i++) {
if (ePlane[i].IsShow() &&
ClockTag * (4 - ePlane[i].getID()) % 240 == 0) {
sendBullet(ePlane[i].getXPos(), ePlane[i].getYPos(), 1);
}
} //for
//judge ePlane whether hitten
for (i = 0; i < ePlane.length; i++) {
if (ePlane[i].IsShow()) {
//whether hitten by the bullets?
for (int j = 1; j < mybullet.length; j++) {
if (mybullet[i].IsShow() &&
Collision(ePlane[i], mybullet[j])) {
mybullet[j].ShowFalse();
ePlane[i].SetState(PlaneGameObject.BOMBING);
} //if
} //for j
//whether collaps with my plane
if (Collision(ePlane[i], myplane)) {
ePlane[i].SetState(PlaneGameObject.BOMBING);
myplane.ChangeHP( -1);
myplane.SetState(PlaneGameObject.HIT);
if (myplane.getHP() <= 0) {
myplane.SetState(PlaneGameObject.BOMBING);
}
}
} //if
} //for i
//enemy boss send bullets
if (eBoss.IsShow() && ClockTag % 100 == 0) {
sendBullet(eBoss.getXPos(), eBoss.getYPos(), 2);
}
//judge whether boss hitten
if (eBoss.IsShow()) {
for (i = 1; i < mybullet.length; i++) {
if (mybullet[i].IsShow() && Collision(eBoss, mybullet[i])) {
mybullet[i].ShowFalse();
eBoss.SetState(PlaneGameObject.HIT);
eBoss.ChangeHP( -1);
if (eBoss.getHP() == 0) {
eBoss.SetState(PlaneGameObject.BOMBING);
}
} //if
} //for
} //if
} //void run()
void paint(Graphics g)
{
int x, y;
//draw enmey boss
if (eBoss.IsShow()) {
x = eBoss.getXPos();
y = eBoss.getYPos();
tempImage = eBoss.getImage();
switch (eBoss.getState()) {
case PlaneGameObject.ALIVE:
g.drawImage(tempImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
break;
case PlaneGameObject.HIT:
g.drawImage(BossRedImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
if (eBoss.getHP() > 10) {
eBoss.SetState(PlaneGameObject.ALIVE);
}
break;
case PlaneGameObject.BOMBING:
g.drawImage(BossExpImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
eBoss.ShowFalse();
}
} //if
//draw enemy planes
for (int i = 0; i < ePlane.length; i++) {
if (ePlane[i].IsShow()) {
x = ePlane[i].getXPos();
y = ePlane[i].getYPos();
switch (ePlane[i].getState()) {
case PlaneGameObject.ALIVE:
tempImage = ePlane[i].getImage();
g.drawImage(tempImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
break;
case PlaneGameObject.BOMBING:
g.drawImage(ExpImage, x, y,
Graphics.VCENTER | Graphics.HCENTER);
ePlane[i].ShowFalse();
break;
} //switch
} //if
} //for
} //void paint()
} //class ePlaneScroller
class ImageScroller
extends TimerTask
{
private final Timer m_updateTimer = new Timer();
private Image m_image;
private final int m_screenWidth;
private final int m_screenHeight;
private final int m_imageWidth;
private final int m_imageHeight;
private final int m_leftOffset;
private final int m_topOffset;
private int m_x;
private int m_y;
private int ClockTag = 0;
// private BackGround bground = new BackGround(1);
public ImageScroller(Canvas screen, int interval)
{
//m_image = bground.getImage();
try {
m_image = Image.createImage("/BackGround01.png");
}
catch (Exception e) {
m_image = null;
}
// calculate all the necessary constants
m_screenWidth = screen.getWidth();
m_screenHeight = screen.getHeight();
m_imageWidth = m_image.getWidth();
m_imageHeight = m_image.getHeight();
m_leftOffset = (m_screenWidth - m_imageWidth) / 2;
m_topOffset = (m_screenHeight - m_imageHeight) / 2;
m_y = m_screenHeight - m_imageHeight;
m_x = m_screenWidth;
m_updateTimer.schedule(this, 0, interval);
}
/**
* For each iteration of the scheduler, it updates the vertical position.
*/
public void run()
{
// scroll
m_x--;
ClockTag++;
if (ClockTag == 100) {
eBoss.ShowTrue();
}
}
/**
* Draws the background on the Graphics object specified.
*
* @param g The Graphics object on which to draw the background.
*/
public void paint(Graphics g)
{
// if we have reached the screen height then move back to bottom
if (m_x <= 0) {
g.drawImage(m_image, m_screenWidth, m_topOffset,
Graphics.TOP | Graphics.RIGHT);
m_x = m_screenWidth;
}
else if (m_x <= m_imageWidth) {
g.drawImage(m_image, m_screenWidth + m_x, m_topOffset,
Graphics.TOP | Graphics.RIGHT);
}
g.drawImage(m_image, m_x, m_topOffset,
Graphics.TOP | Graphics.RIGHT);
}
} //end of class ImageScroller
} //end of class PlaneGameCanvas