TestMIDlet.java文件:
package temps;
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
/** * Title: * * Description: * * Copyright: Copyright (c) 2005 * * Company: * * @author not attributable * @version 1.0 */ public class TestMIDlet extends MIDlet { private Display display;
public void startApp() { try { display = Display.getDisplay(this); Displayable1 gameCanvas = new Displayable1(); gameCanvas.start(); display.setCurrent(gameCanvas); } catch (Exception ex) { System.out.println(ex); } }
public Display getDisplay() { return display; }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { exit(); }
public void exit() { System.gc(); destroyApp(false); notifyDestroyed(); } } Displayable1.java内容:
package temps;
import javax.microedition.lcdui.*; import java.util.Random; import javax.microedition.lcdui.game.*; /** * Title: * * Description: * * Copyright: Copyright (c) 2005 * * Company: * * @author not attributable * @version 1.0 */ public class Displayable1 extends GameCanvas implements Runnable { private boolean isPlay; // Game Loop runs when isPlay is true private long delay; // To give thread consistency private int currentX, currentY; // To hold current position of the 'X' private int width; // To hold screen width private int height; // To hold screen height private Random random=new Random(System.currentTimeMillis()); private final int[] sequence={0,1,2,1,0,1,2,1,0,1,2,1,1,1,1,1,1}; private int counter=0; private int enemyX,enemyY; private int enemyDirect=0; private boolean isdown=false;
private boolean isalive=true;
// Sprites to be used private Sprite playerSprite; private Sprite backgroundSprite; private Sprite enemySprite;
// Layer Manager private LayerManager layerManager;
// Constructor and initialization public Displayable1() throws Exception { super(true); width = getWidth(); height = getHeight();
currentX = width / 2; currentY = height / 2; enemyX=width/4; enemyY=height/4; delay = 100;
Image playerImage=null; Image backgroundImage=null; Image enemy=null; // Load Images to Sprites try { playerImage = Image.createImage("/transparent.png"); backgroundImage = Image.createImage("/background.png"); enemy=Image.createImage("/frames.png"); } catch(Exception e) { System.out.println("get Image error!"+e.getMessage()); }
playerSprite = new Sprite(playerImage, 32, 32); System.out.println(playerSprite.getRawFrameCount()); enemySprite=new Sprite(enemy,50,21); backgroundSprite = new Sprite(backgroundImage); layerManager = new LayerManager(); layerManager.append(playerSprite); layerManager.append(enemySprite); layerManager.append(backgroundSprite);
}
// Automatically start thread for game loop public void start() { isPlay = true; Thread t = new Thread(this); t.start(); }
public void stop() { isPlay = false; }
// Main Game Loop public void run() { Graphics g = getGraphics(); while (isPlay == true) { input(); drawScreen(g); try { Thread.sleep(delay); } catch (InterruptedException ie) {
} } }
// Method to Handle User Inputs private void input() { int keyStates = getKeyStates();
playerSprite.setFrame(0); if(isalive) { if(counter==0) { enemyDirect=Math.abs(random.nextInt()%4); } counter++; switch(enemyDirect) { case 0: enemyY=Math.max(0,--enemyY); break; case 1: enemyY=Math.min(++enemyY,height-enemySprite.getHeight()); break; case 2: enemyX=Math.max(0,--enemyX); break; case 3: enemyX=Math.min(++enemyX,width-enemySprite.getWidth()); break; } counter=(counter++)%(sequence.length()); enemySprite.setFrame(sequence[counter]); } else { enemyY+=counter; enemyY=Math.min(enemyY,height-enemySprite.getHeight());
if(enemyY counter++; enemySprite.setFrame(3); }
// Left if ((keyStates & LEFT_PRESSED) != 0) { currentX = Math.max(0, currentX - 1); playerSprite.setFrame(1); }
// Right if ((keyStates & RIGHT_PRESSED) != 0) if (currentX + 5 < width) { currentX = Math.min(width, currentX + 1); playerSprite.setFrame(3); }
// Up if ((keyStates & UP_PRESSED) != 0) { currentY = Math.max(0, currentY - 1); playerSprite.setFrame(2); }
// Down if ((keyStates & DOWN_PRESSED) != 0) { isdown=true; }
if ((keyStates & DOWN_PRESSED) != 0) { if(isdown) { if (currentY + 10 < height) { currentY = Math.min(height, currentY + 1); playerSprite.setFrame(4); } } }
if((keyStates & FIRE_PRESSED)!=0) { isalive=!isalive; counter=0; }
if(!(enemyX+enemySprite.getWidth()currentX+playerSprite.getWidth() || enemyY>currentY+playerSprite.getHeight()) && isalive) { counter=0; isalive=false; } }
// Method to Display Graphics private void drawScreen(Graphics g) { g.setColor(0xffffff); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0x0000ff);
// updating player sprite position playerSprite.setPosition(currentX, currentY); enemySprite.setPosition(enemyX,enemyY);
layerManager.setViewWindow(0, 0, width, height); layerManager.paint(g, 0,0);
g.setColor(0xffffff); flushGraphics(); }
} 此程序里敌人随机向4个方向移动,而玩家控制的角色可任意移动, 如果两者发生碰撞,则敌人死亡.
另外按fire键可直接让敌人生或死,呵呵~~
|