📄 advanceddirmovetest.java
字号:
import net.jscience.math.kvm.MathFP;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.IOException;
/**
* An example MIDlet that demonstrates advanced movement.
* @author Martin J. Wells
*/
public class AdvancedDirMoveTest extends MIDlet implements CommandListener, Runnable
{
private static int SHIP_FRAME_WIDTH = 16;
private static int SHIP_FRAME_HEIGHT = 16;
public static final int FP_PI2 = MathFP.mul(MathFP.PI, MathFP.toFP(2));
public static final int FP_DEGREES_PER_RAD = MathFP.div(MathFP.toFP(360), FP_PI2);
public static final int FP_22P5 = MathFP.toFP("22.5");
private GameScreen myCanvas;
private Command quit;
private boolean running;
private Sprite shipSprite;
/**
* A Canvas used to draw and move a little ship sprite.
*/
class GameScreen extends Canvas
{
// ship properties
private int shipXFP; // x position (as a MathFP)
private int shipYFP; // y position (as a MathFP)
private int direction; // current direction in degrees
private int xVelFP; // x velocity (as a MathFP)
private int yVelFP; // y velocity (as a MathFP)
private int maxVelFP = MathFP.toFP("2");
private int thrustFP = MathFP.toFP("0.2");
/**
* Canvas paint implementation which clears the screen and then draws
* the ship at its current position.
* @param graphics The graphics context on which to draw.
*/
protected void paint(Graphics graphics)
{
// Clear the screen.
graphics.setColor(0);
graphics.fillRect(0, 0, getWidth(), getHeight());
// Find the frame corresponding to the current direction by dividing
// the direction by the increment we each frame in the sprite (360
// divided by 16 = 22.5) - we use MathFP because of the fractions.
int frame = MathFP.toInt(MathFP.div(MathFP.toFP(direction), FP_22P5));
// Set the ship sprite frame to be the one matching the direction.
shipSprite.setFrame(frame);
// Draw that frame on the screen.
shipSprite.draw(graphics, MathFP.toInt(shipXFP), MathFP.toInt(shipYFP));
}
/**
* Moves the ship based on the angle it's facing using directional
* acceleration and velocity.
*/
public void cycle()
{
// move the ship according to its current direction (in radians)
int dirRadians = MathFP.div(MathFP.toFP(direction), FP_DEGREES_PER_RAD);
int xAccFP = MathFP.mul(thrustFP, MathFP.cos(dirRadians));
int yAccFP = MathFP.mul(thrustFP, -MathFP.sin(dirRadians));
xVelFP = MathFP.add(xVelFP, xAccFP);
yVelFP = MathFP.add(yVelFP, yAccFP);
// cap our velocity to a controllable level
if (xVelFP > maxVelFP) xVelFP = maxVelFP;
else if (xVelFP < -maxVelFP) xVelFP = -maxVelFP;
if (yVelFP > maxVelFP) yVelFP = maxVelFP;
else if (yVelFP < -maxVelFP) yVelFP = -maxVelFP;
shipXFP = MathFP.add(shipXFP, xVelFP);
shipYFP = MathFP.add(shipYFP, yVelFP);
// check our position and wrap around if we have to.
if (MathFP.toInt(shipXFP) < 0)
shipXFP = MathFP.toFP(myCanvas.getWidth() - 1);
if (MathFP.toInt(shipXFP) > myCanvas.getWidth())
shipXFP = MathFP.toFP(0);
if (MathFP.toInt(shipYFP) < 0)
shipYFP = MathFP.toFP(myCanvas.getHeight() - 1);
if (MathFP.toInt(shipYFP) > myCanvas.getHeight())
shipYFP = MathFP.toFP(0);
}
/**
* React to keys pressed by the user.
* @param keyCode The code of the key the players pressed.
*/
protected void keyPressed(int keyCode)
{
int action = getGameAction(keyCode);
// Based on the key they pressed we adjust the facing angle by an
// increment equal to the facing directions of the ship (16 possible
// translates to 22.5 which we round up to 23).
if (action == RIGHT) direction -= 23;
if (action == LEFT) direction += 23;
// Wrap the direction around if it's now invalid.
if (direction < 0) direction = 359-23;
if (direction > 358) direction = 0;
}
}
/**
* MIDlet constructor loads up the ship graphics and then creates a
* cooresponding ImageSet and Sprite. It then constructs a canvas and quit
* command.
*/
public AdvancedDirMoveTest()
{
// Load up the standard ship graphics and make up a Sprite.
try
{
Image[] frames = ImageSet.extractFrames(Image.createImage("/ship.png"),
0, 0, 4, 4,
SHIP_FRAME_WIDTH,
SHIP_FRAME_HEIGHT);
ImageSet set = new ImageSet(1);
set.addState(frames, 0);
shipSprite = new Sprite(set, 0, 0);
}
catch (IOException ioe)
{
System.out.println("unable to load image");
}
// Construct a canvas.
myCanvas = new GameScreen();
// And a way to quit.
quit = new Command("Quit", Command.EXIT, 2);
myCanvas.addCommand(quit);
myCanvas.setCommandListener(this);
running = true;
Thread t = new Thread(this);
t.start();
}
/**
* Runnable interface run method that cycles the ship and requests a repaint
* of the Canvas.
*/
public void run()
{
while (running)
{
myCanvas.repaint();
myCanvas.cycle();
try
{
// Simple timing - sleep for 100 milliseconds.
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
}
}
/**
* Handles Application Manager notification the MIDlet is starting (or
* resuning from a pause). In this case we set the canvas as the current
* display screen.
* @throws MIDletStateChangeException
*/
protected void startApp() throws MIDletStateChangeException
{
Display.getDisplay(this).setCurrent(myCanvas);
}
/**
* Handles Application Manager notification the MIDlet is about to be paused.
* We don't bother doing anything for this case.
*/
protected void pauseApp()
{
}
/**
* Handles Application Manager notification the MIDlet is about to be
* destroyed. We don't bother doing anything for this case.
*/
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
/**
* The CommandListener interface method called when the user executes
* a Command, in this case it can only be the quit command we created in the
* consutructor and added to the Canvas.
* @param command The command that was executed.
* @param displayable The displayable that command was embedded within.
*/
public void commandAction(Command command, Displayable displayable)
{
try
{
if (command == quit)
{
running = false;
destroyApp(true);
notifyDestroyed();
}
}
catch (MIDletStateChangeException me)
{
System.out.println(me + " caught.");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -