📄 gamecanvas.java
字号:
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class GameCanvas extends Canvas
{
private final int DELAY = 100;
private final int ROAD_WIDTH = 70;
private final int INIT_ENERGY = 100;
private final int COLLIDE_ENERGY = 5;
private Game game;
private Form form;
private GameThread thread;
private boolean running;
private boolean finished;
private int trackId;
private Player player;
private Sprite theweapon;
private int key;
private SpriteManager enemyList;
private SpriteManager powerUpsWeapon;
private SpriteManager powerUpsMoney;
private int length;
private long enemyspeed;
private long myspeed = 0;
private long line;
private int timer;
private boolean weaponon = false;
private int weaponcount = 0;
private Weapon weapon;
private Image scene = Image.createImage(getWidth(),
getHeight());
private Graphics g = scene.getGraphics();
public GameCanvas(Game midlet, Form form)
{
game = midlet;
this.form = form;
Cache.width = getWidth();
Cache.height = getHeight();
try
{
player = new Player(Cache.carImage, Cache.carImage.getWidth()/2,
Cache.carImage.getHeight(), 2, INIT_ENERGY);
player.setX(Float.createFloat((Cache.width - player.getWidth()) / 2));
player.setY(Float.createFloat(Cache.height - (player.getHeight() *2)));
player.setVisible(true);
// Use weapon 0 for now
weapon = game.cs.getWeapons()[0];
theweapon = new Sprite(Cache.flameImage,10,14, 2);
theweapon.setX(Float.createFloat((Cache.width - player.getWidth()) / 2));
theweapon.setY(Float.createFloat(Cache.height - (player.getHeight() *2) - 14));
theweapon.setVisible(true);
}
catch (Exception ex)
{
System.out.println("Problem Creating Sprites!");
System.err.println(ex);
}
}
public void initEnemies()
{
line = - Float.createFloat(length);
timer = 0;
enemyList = new SpriteManager(Cache.width, Cache.height);
int size = length / Cache.height * 4 - 1;
Random rnd = new Random();
for (int i = 1; i <= size; i++)
{
try
{
Sprite sprite = new Sprite(Cache.enemyImage,
Cache.enemyImage.getWidth(), Cache.enemyImage.getHeight(), 1);
// Figure out where the enemy starts
int x = rnd.nextInt() % (ROAD_WIDTH -
Cache.enemyImage.getWidth());
x = (x < 0 ? -x : x);
// Draw at a random X
sprite.setX(Float.createFloat((Cache.width - ROAD_WIDTH) / 2 + x));
// Scatter the enemy's Y position
sprite.setY(Float.createFloat(- i * Cache.height / 4));
// Modify the speed slightly
x = rnd.nextInt() % 1000;
long veer = Float.createFloat(0,x);
long newspeed = Float.add(veer,enemyspeed);
sprite.setVy(newspeed);
// Move the enemy back and forth
x = rnd.nextInt() % 2;
long sidemove = Float.createFloat(x);
sprite.setVx(sidemove);
enemyList.addSprite(sprite);
} catch (Exception ex) {}
}
}
public void initPowerups()
{
powerUpsMoney = new SpriteManager(Cache.width, Cache.height);
powerUpsWeapon = new SpriteManager(Cache.width, Cache.height);
int size = length / Cache.height * 4 - 1;
Random rnd = new Random();
boolean formoney = true;
for (int i = 1; i <= size; i++)
{
// The number of power ups a third the number of enemies.
// That seems fair!
// So we will only deal with one out of every four...
if (i % 3 != 0)
continue;
try
{
Sprite sprite = new Sprite(Cache.powerupImage,Cache.powerupImage.getWidth(), Cache.powerupImage.getHeight(), 1);
// Figure out how where to put it...
int x = rnd.nextInt() % (ROAD_WIDTH - Cache.enemyImage.getWidth());
x = (x < 0 ? -x : x);
// Draw at a random X
sprite.setX(Float.createFloat((Cache.width - ROAD_WIDTH) / 2 + x));
// Scatter the power ups Y position
sprite.setY(Float.createFloat(- i * Cache.height / 4));
// Alternate weapons and money
if (!formoney)
powerUpsWeapon.addSprite(sprite);
else
powerUpsMoney.addSprite(sprite);
formoney = !formoney;
} catch (Exception ex) {}
}
}
public void setSpeed(long speed)
{
enemyspeed = speed;
}
public void setLength(int length)
{
this.length = length;
}
public void setTrack(int trackId)
{
this.trackId = trackId;
}
public void start()
{
running = true;
finished = false;
thread = new GameThread();
thread.start();
}
public void stop()
{
running = false;
}
public void keyPressed(int keyCode)
{
key = getGameAction(keyCode);
// When the fire key is pressed, trigger the weapon.
if (key == FIRE)
{
if (!weaponon && weapon.fire())
{
weaponon = true;
weaponcount = 0;
}
}
}
public void keyReleased(int keyCode)
{
key = 0;
}
public void pointerPressed(int x, int y)
{
if (x < Cache.width / 2)
key = LEFT;
else
key = RIGHT;
}
public void pointerReleased(int x, int y)
{
key = 0;
}
public void paint(Graphics gr)
{
g.setColor(0xffffff);
g.fillRect(0, 0, Cache.width, Cache.height);
g.setColor(0x000000);
g.setStrokeStyle(Graphics.DOTTED);
g.drawLine(getWidth() / 2, 0, getWidth() / 2,
getHeight() - 1);
g.setStrokeStyle(Graphics.SOLID);
g.fillRect(0, 0, (getWidth() - ROAD_WIDTH) / 2,
getHeight());
g.fillRect((getWidth() + ROAD_WIDTH) / 2, 0,
(getWidth() - ROAD_WIDTH) / 2, getHeight());
g.drawLine((getWidth() - ROAD_WIDTH) / 2, (int)Float.getInteger(line),
(getWidth() + ROAD_WIDTH) / 2, (int)Float.getInteger(line));
// paint power ups first since they are on the ground
powerUpsMoney.paint(g);
powerUpsWeapon.paint(g);
// Then paint other things
enemyList.paint(g);
// animate the car
try {
player.setFrame(1-player.getFrame());
}
catch (Exception e) { }
player.paint(g);
// Draw the weapon
theweapon.setX(player.getX());
if (weaponon)
{
// Draw flame in front
if (weapon.getWeaponType() == Weapon.FLAME)
theweapon.setVisible(true);
// See if the weapon should be switched off
if (++weaponcount > weapon.getWeaponTime())
{
weaponon = false;
theweapon.setVisible(false);
}
theweapon.paint(g);
}
g.drawString("E:" + player.getEnergy(), (getWidth() - ROAD_WIDTH) /
2 + 1, 0, Graphics.TOP | Graphics.LEFT);
g.drawString("T:" + (timer / 10) + "." + (timer % 10) + "s",
getWidth() / 2 + 1, 0, Graphics.TOP | Graphics.LEFT);
if (weapon != null)
{
g.drawString(weapon.getDisplayName(), (getWidth() - ROAD_WIDTH) /
2 + 1, 15, Graphics.TOP | Graphics.LEFT);
}
g.drawString("$"+game.cs.getCash(), (getWidth() - ROAD_WIDTH) / 2 + 1, 30, Graphics.TOP | Graphics.LEFT);
gr.drawImage(scene, 0, 0, Graphics.TOP | Graphics.LEFT);
}
private void moveSprites()
{
switch (key)
{
case Canvas.LEFT:
if (Float.getInteger(player.getX()) >
(Cache.width - ROAD_WIDTH) / 2)
player.setX(Float.sub(player.getX(),
Float.createFloat(2)));
break;
case Canvas.RIGHT:
if (Float.getInteger(player.getX()) + player.getWidth() <
(Cache.width + ROAD_WIDTH) / 2)
player.setX(Float.add(player.getX(),
Float.createFloat(2)));
break;
case Canvas.UP:
if (Float.getInteger(myspeed) > 10)
break;
myspeed = Float.add(myspeed,1);
for (int i = 0; i < enemyList.size(); i++)
{
Sprite sprite = enemyList.getSprite(i);
sprite.setVy(Float.add(sprite.getVy(),myspeed));
}
break;
case Canvas.DOWN:
if (Float.getInteger(myspeed) < -10)
break;
myspeed = Float.sub(myspeed,1);
for (int i = 0; i < enemyList.size(); i++)
{
Sprite sprite = enemyList.getSprite(i);
sprite.setVy(Float.add(sprite.getVy(),myspeed));
}
break;
}
for (int i = 0; i < enemyList.size(); i++)
{
Sprite sprite = enemyList.getSprite(i);
sprite.setY(Float.add(sprite.getY(), sprite.getVy()));
// Make sure not hitting the side walls
sprite.setX(Float.add(sprite.getX(), sprite.getVx()));
if ((Float.getInteger(sprite.getX()) < (Cache.width - ROAD_WIDTH) / 2) ||
(Float.getInteger(sprite.getX()) +
sprite.getWidth() > (Cache.width + ROAD_WIDTH) / 2))
{
// Move in other direction
sprite.setVx(-sprite.getVx());
}
}
long powerUpSpeed = myspeed;
if (Float.getInteger(powerUpSpeed) <= 3)
powerUpSpeed = Float.createFloat(3);
for (int i = 0; i < powerUpsWeapon.size(); i++)
{
Sprite sprite = powerUpsWeapon.getSprite(i);
sprite.setY(Float.add(sprite.getY(), powerUpSpeed));
}
for (int i = 0; i < powerUpsMoney.size(); i++)
{
Sprite sprite = powerUpsMoney.getSprite(i);
sprite.setY(Float.add(sprite.getY(), powerUpSpeed));
}
line = Float.add(line, enemyList.getSprite(0).getVy());
}
private void checkCollision()
{
// Did enemy hit weapon?
if (weaponon)
{
Sprite collidedwith = enemyList.collideSprite(theweapon);
// Remove the enemy!
if (collidedwith != null)
enemyList.deleteSprite(collidedwith);
}
// Did we hit a power up?
Sprite collidedwith = powerUpsWeapon.collideSprite(player);
if (collidedwith != null)
{
// Remove the power up
powerUpsWeapon.deleteSprite(collidedwith);
Random rnd = new Random();
// Add 1 ammo point
weapon.setWeaponAmmo(weapon.getWeaponAmmo()+1);
}
collidedwith = powerUpsMoney.collideSprite(player);
if (collidedwith != null)
{
// Remove the power up
powerUpsMoney.deleteSprite(collidedwith);
Random rnd = new Random();
// Add from 5 to 15 dollars
int x = rnd.nextInt() % 15;
x = (x < 0 ? -x : x);
x += 5;
game.cs.setCash(game.cs.getCash()+x);
}
collidedwith = enemyList.collideSprite(player);
if (collidedwith != null)
player.setEnergy(player.getEnergy() - COLLIDE_ENERGY);
if (player.getEnergy() <= 0)
{
String vendor = System.getProperty("microedition.platform");
CrashCarEffect tempclass = null;
try {
if( vendor != null && vendor.indexOf( "Siemens" ) != -1 )
tempclass = (CrashCarEffect)Class.forName("SiemensCrash").newInstance();
else
tempclass = (CrashCarEffect)Class.forName("DummyCrash").newInstance();
}
catch (Exception e) { }
if (tempclass != null)
tempclass.ICrashed();
running = false;
}
}
private void checkFinishLine()
{
if (Float.getInteger(line) > Cache.height)
{
running = false;
finished = true;
}
}
public class GameThread extends Thread
{
public void run()
{
while (running)
{
long time = System.currentTimeMillis();
moveSprites();
checkCollision();
checkFinishLine();
timer++;
repaint();
serviceRepaints();
time = System.currentTimeMillis() - time;
try
{
if (time < DELAY)
Thread.sleep(DELAY - (int)time);
}
catch (Exception ex) {}
}
String msg = "You Crashed!";
if (finished)
{
// Post the score
msg = "You finished in time: "+timer+".";
}
Alert errorAlert = new Alert("Game Over",msg,null, AlertType.INFO);
errorAlert.setTimeout(Alert.FOREVER);
game.getDisplay().setCurrent(errorAlert,form);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -