首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2ME开发 >

疯了!让这个Sprite实例运行起来!该如何处理

2012-01-05 
疯了!让这个Sprite实例运行起来!Sprite没用过、那些API也看不懂、所以在网上找了一个实例、编译没有报错、但事

疯了!让这个Sprite实例运行起来!
Sprite没用过、那些API也看不懂、所以在网上找了一个实例、编译没有报错、但事实上是运行不起来的。
      烦请高手帮我修改修改,做成ME程序 <即包含MIDlet的程序> 要确保复制上去不用修改就可以直接运行。
    先鞠个弓。
完整程序如下:
import   javax.microedition.lcdui.*;
import   javax.microedition.lcdui.game.*;
public   class   TankGameCanvas   extends   GameCanvas   implements   Runnable   {
//   控制方向:
private   static   int   INDEX_OF_UP   =   0;
private   static   int   INDEX_OF_DOWN   =   1;
private   static   int   INDEX_OF_LEFT   =   3;
private   static   int   INDEX_OF_RIGHT   =   2;
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   Sprite   spriteTank;   //   our   sprite!
//   Constructor   and   initialization
public   TankGameCanvas()   {
super(true);
width   =   getWidth();
height   =   getHeight();
currentX   =   width   /   2;
currentY   =   height   /   2;
delay   =   20;
//   init   sprite:
try   {
Image   image   =   Image.createImage( "/res/img/player1.png ");   //   注意路径
spriteTank   =   new   Sprite(image,   16,   16);   //   大小是16x16
}   catch   (Exception   e)   {
e.printStackTrace();
}
}
//   Automatically   start   thread   for   game   loop
public   void   start()   {
isPlay   =   true;
new   Thread(this).start();
}
public   void   stop()   {
isPlay   =   false;
}
//   Main   Game   Loop
public   void   run()   {
Graphics   g   =   getGraphics();
while   (isPlay)   {
input();
drawScreen(g);
try   {
Thread.sleep(delay);
}   catch   (InterruptedException   ie)   {
}
}
}
//   Method   to   Handle   User   Inputs
private   void   input()   {
int   keyStates   =   getKeyStates();
//   Left
if   ((keyStates   &   LEFT_PRESSED)   !=   0)   {
currentX   =   Math.max(0,   currentX   -   1);
spriteTank.setFrame(INDEX_OF_LEFT);
}
//   Right
if   ((keyStates   &   RIGHT_PRESSED)   !=0   )   {
if   (   currentX   +   5   <   width)
currentX   =   Math.min(width,   currentX   +   1);
spriteTank.setFrame(INDEX_OF_RIGHT);
}
//   Up
if   ((keyStates   &   UP_PRESSED)   !=   0)   {
currentY   =   Math.max(0,   currentY   -   1);
spriteTank.setFrame(INDEX_OF_UP);
}
//   Down
if   ((keyStates   &   DOWN_PRESSED)   !=0)   {
if   (   currentY   +   10   <   height)


currentY   =   Math.min(height,   currentY   +   1);
spriteTank.setFrame(INDEX_OF_DOWN);
}
}
//   Method   to   Display   Graphics
private   void   drawScreen(Graphics   g)   {
g.setColor(0);   //   black
g.fillRect(0,   0,   getWidth(),   getHeight());
//   画一个Sprite非常简单:
spriteTank.setPosition(currentX,   currentY);
spriteTank.paint(g);
flushGraphics();
}
}
这个程序不含MIDlet所以根本运行不起来,我加上MIDlet后还是没有运行,但是情况有所不同、说明我没修改对,请高手帮帮忙。拜托、鞠躬。

[解决办法]
很简单啊。

//MainMidlet.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class MainMidlet extends MIDlet {
private static MainMidlet instance;
private Display display;
private TankGameCanvas tgc;

public MainMidlet() {
instance = this;
tgc = new TankGameCanvas();
tgc.start();
}

public void startApp() {
display = Display.getDisplay(this);
display.setCurrent(tgc);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
//------------------------

//TankGameCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class TankGameCanvas extends GameCanvas implements Runnable {
// 控制方向:
private static int INDEX_OF_UP = 0;
private static int INDEX_OF_DOWN = 1;
private static int INDEX_OF_LEFT = 3;
private static int INDEX_OF_RIGHT = 2;
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 Sprite spriteTank; // our sprite!
// Constructor and initialization
public TankGameCanvas() {
super(true);
width = getWidth();
height = getHeight();
currentX = width / 2;
currentY = height / 2;
delay = 20;
// init sprite:
try {
Image image = Image.createImage( "/player1.png "); // 注意路径
spriteTank = new Sprite(image, 16, 16); // 大小是16x16
} catch (Exception e) {
e.printStackTrace();
}
}
// Automatically start thread for game loop
public void start() {
isPlay = true;
new Thread(this).start();
}
public void stop() {
isPlay = false;
}
// Main Game Loop
public void run() {
Graphics g = getGraphics();
while (isPlay) {
input();
drawScreen(g);
try {
Thread.sleep(delay);
} catch (InterruptedException ie) {
}
}
}
// Method to Handle User Inputs
private void input() {
int keyStates = getKeyStates();
// Left
if ((keyStates & LEFT_PRESSED) != 0) {
currentX = Math.max(0, currentX - 1);
spriteTank.setFrame(INDEX_OF_LEFT);


}
// Right
if ((keyStates & RIGHT_PRESSED) !=0 ) {
if ( currentX + 5 < width)
currentX = Math.min(width, currentX + 1);
spriteTank.setFrame(INDEX_OF_RIGHT);
}
// Up
if ((keyStates & UP_PRESSED) != 0) {
currentY = Math.max(0, currentY - 1);
spriteTank.setFrame(INDEX_OF_UP);
}
// Down
if ((keyStates & DOWN_PRESSED) !=0) {
if ( currentY + 10 < height)
currentY = Math.min(height, currentY + 1);
spriteTank.setFrame(INDEX_OF_DOWN);
}
}
// Method to Display Graphics
private void drawScreen(Graphics g) {
g.setColor(0); // black
g.fillRect(0, 0, getWidth(), getHeight());
// 画一个Sprite非常简单:
spriteTank.setPosition(currentX, currentY);
spriteTank.paint(g);
flushGraphics();
}
}
[解决办法]
package hello;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import java.util.Random;
import javax.microedition.lcdui.game.*;

/**
*
* @author wjs5-8
* @version
*/
public class Midlet extends MIDlet implements CommandListener
{
private Display display;
private deycanvas maincanvas;
private Command exitCommand=new Command( "退出 ",Command.EXIT,1);
public void startApp() {
if(display==null)
{display=Display.getDisplay(this);
maincanvas=new deycanvas();
maincanvas.addCommand(exitCommand);
maincanvas.setCommandListener(this);
new Thread(maincanvas).start();
display.setCurrent(maincanvas);

}

}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}
public void commandAction(Command cmd,Displayable displayable){

if(cmd==exitCommand)
{
destroyApp(false);
notifyDestroyed();
}

}
}
class deycanvas extends GameCanvas implements Runnable{


public int action;
public boolean leftPressed,righrPressed,stop,upPressed,downPressed;
private int width;//屏幕宽度
private int height;//屏幕高
private int x,y,vx,vy;
public static final int BLUE = 0x000000ff;
public Graphics g;
private Sprite spriteTank;
private Sprite diren;
private Sprite spr;
private Sprite spl;
private Sprite spu;
private Sprite spd;
private boolean zhuangtai=false;
deycanvas()
{ super(true);
g=getGraphics();
stop=true;
width = getWidth();
height = getHeight();
x=width/2;
y=height/2;
vx=x;
vy=y;


try{
Image image = Image.createImage( "/img/5.png ");
Image imagediren=Image.createImage( "/img/4.png ");

spr=new Sprite(image,24,32);
spl=new Sprite(image,24,32);
spu=new Sprite(image,24,32);
spd=new Sprite(image,24,32);
spriteTank=new Sprite(image,24,32);
diren=new Sprite(imagediren,24,32);
spl.setFrameSequence(new int[]{9,10,11});
spr.setFrameSequence(new int[]{3,4,5});
spu.setFrameSequence(new int[]{0,1,2});
spd.setFrameSequence(new int[]{6,7,8});


}
catch(IOException e)


{ e.printStackTrace();
}
}
private void input()
{
int keyStates=getKeyStates();
if((keyStates & LEFT_PRESSED)!=0)
{spriteTank=spl;
leftPressed=true;
System.out.println( "leftleftleftlelt ");
}
if((keyStates & RIGHT_PRESSED)!=0)
{

spriteTank=spr;

righrPressed=true;

}
if((keyStates & UP_PRESSED)!=0)
{ spriteTank=spu;
upPressed=true;

}
if((keyStates & DOWN_PRESSED)!=0)
{ spriteTank=spd;
downPressed=true;

}
}
public synchronized void keyPressed(int keyCode)
{
int action=getGameAction(keyCode);

switch(action)
{
case LEFT:
leftPressed=true;

break;
case RIGHT:

righrPressed=true;
break;
case UP :

upPressed=true;
break;
case DOWN :

downPressed=true;
break;
default:
break;



}

//repaint();
}


public void run()
{ int i=3;


while(stop)
{
input();

if(leftPressed)
{
left();

leftPressed=false;

}
if(righrPressed)
{

right();


righrPressed=false;
}
if(upPressed)
{
up();
upPressed=false;
}
if(downPressed)
{
down();
downPressed=false;
}
diren.setPosition(100,57);
spriteTank.setPosition(vx,vy);

if(spriteTank.collidesWith(diren ,true))
{
zhuangtai=true;
vx=vx-2;
spriteTank.prevFrame();
}else{
zhuangtai=false;
}

rrrr(g, spriteTank);


try{
Thread.sleep(50);


}catch(InterruptedException e)

{

}
}
}
public void left()
{
if(vx> 5)
{
vx=vx-2;
spriteTank.nextFrame();
}


}
public void right()
{
if(vx <width-5)
{
vx=vx+2;
spriteTank.nextFrame();
}


}
public void up(){
if(vy> 5)
{
vy=vy-2;
spriteTank.nextFrame();
}

//spriteTank.setFrame(0);
}
public void down()
{
if(vy <height-5)
{
vy=vy+2;
spriteTank.nextFrame();
}

//spriteTank.setFrame(1);
}
public void rrrr(Graphics g,Sprite spriteTank ){
g.setColor(BLUE);
g.fillRect(0, 0, width, height);

if(zhuangtai)
{
g.setColor(0xffffff);
}else
{
g.setColor(0x0000ffff);
}
g.fillRect(0, 0, width, height);
// g.drawString( "O "+width+ "在线 "+ height,vx,vy,Graphics.LEFT|Graphics.TOP);


diren.paint(g);
spriteTank.paint(g);
flushGraphics();
}

热点排行