📄 socanvas.java
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
import java.io.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.rms.*;
public class SOCanvas extends GameCanvas implements Runnable {
private Random rand;
private Display display;
private boolean sleeping;
private long frameDelay;
private LayerManager layers;
private Image splash;
private Image background;
private Image smallCar;
private MovingSprite playerSprite;
private MovingSprite[] blobboSprite = new MovingSprite[3];
private MovingSprite[] jellySprite = new MovingSprite[3];
private MovingSprite[] timmySprite = new MovingSprite[3];
private MovingSprite[] missileSprite = new MovingSprite[10];
private Sprite[] explosionSprite = new Sprite[3];
private Player musicPlayer;
private Player explosionPlayer;
private Player gameoverPlayer;
private boolean gameOver;
private int score, carsLeft;
private int[] hiScores = new int[5];
public SOCanvas(Display d) {
super(true);
display = d;
// Initialize the random number generator
rand = new Random();
// Set the frame rate (30 fps)
frameDelay = 33;
}
public void start() {
// Set the canvas as the current screen
display.setCurrent(this);
// Read the high scores
readHiScores();
// Initialize the background and small car images
try {
splash = Image.createImage("/Splash.png");
background = Image.createImage("/StarryNight.png");
smallCar = Image.createImage("/SmallCar.png");
}
catch (IOException e) {
System.err.println("Failed loading images!");
}
// Initialize the sprites
try {
// Create the player car sprite
playerSprite = new MovingSprite(Image.createImage("/Car.png"), 0, 0,
MovingSprite.BA_STOP, this);
playerSprite.setVisible(false);
int sequence5[] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1 };
int sequence3[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 1, 1, 1 };
for (int i = 0; i < 3; i++) {
// Create the Blobbo alien sprites
blobboSprite[i] = new MovingSprite(Image.createImage("/Blobbo.png"), 20, 21, 3, 2,
MovingSprite.BA_BOUNCE, this);
blobboSprite[i].setFrameSequence(sequence5);
blobboSprite[i].setVisible(false);
// Create the Jelly alien sprites
jellySprite[i] = new MovingSprite(Image.createImage("/Jelly.png"), 21, 21, 1, 4,
MovingSprite.BA_BOUNCE, this);
jellySprite[i].setFrameSequence(sequence3);
jellySprite[i].setVisible(false);
// Create the Timmy alien sprites
timmySprite[i] = new MovingSprite(Image.createImage("/Timmy.png"), 21, 11, 5, 0,
MovingSprite.BA_WRAP, this);
timmySprite[i].setFrameSequence(sequence3);
timmySprite[i].setVisible(false);
// Create the explosion sprites
explosionSprite[i] = new Sprite(Image.createImage("/Explosion.png"), 21, 21);
explosionSprite[i].setVisible(false);
}
// Create the missile sprites
for (int i = 0; i < 10; i++) {
missileSprite[i] = new MovingSprite(Image.createImage("/Missiles.png"), 11, 11, 0, 0,
MovingSprite.BA_HIDE, this);
missileSprite[i].setVisible(false);
}
}
catch (IOException e) {
System.err.println("Failed loading images!");
}
// Create the layer manager and add the sprites to it
layers = new LayerManager();
layers.append(playerSprite);
for (int i = 0; i < 3; i++) {
layers.append(blobboSprite[i]);
layers.append(jellySprite[i]);
layers.append(timmySprite[i]);
layers.append(explosionSprite[i]);
}
for (int i = 0; i < 10; i++) {
layers.append(missileSprite[i]);
}
// Initialize the music and wave players
try {
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
musicPlayer.setLoopCount(-1);
is = getClass().getResourceAsStream("Explosion.wav");
explosionPlayer = Manager.createPlayer(is, "audio/X-wav");
explosionPlayer.prefetch();
is = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
gameoverPlayer.prefetch();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}
// Show the splash screen by indicating a game over
gameOver = true;
// Start the animation thread
sleeping = false;
Thread t = new Thread(this);
t.start();
}
public void stop() {
// Close the music and wave players
musicPlayer.close();
explosionPlayer.close();
gameoverPlayer.close();
// Stop the animation
sleeping = true;
// Write the high scores
writeHiScores();
}
public void run() {
Graphics g = getGraphics();
// The main game loop
while (!sleeping) {
update();
draw(g);
try {
Thread.sleep(frameDelay);
}
catch (InterruptedException ie) {}
}
}
private void update() {
// Check to see whether the game is being restarted
if (gameOver) {
int keyState = getKeyStates();
if ((keyState & FIRE_PRESSED) != 0)
// Start a new game
newGame();
// The game is over, so don't update anything
return;
}
// Process user input to move the car and fire missiles
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
playerSprite.setXSpeed(-2);
}
else if ((keyState & RIGHT_PRESSED) != 0) {
playerSprite.setXSpeed(4);
}
if ((keyState & FIRE_PRESSED) != 0) {
// Play a fire sound
try {
Manager.playTone(ToneControl.C4 + 12, 10, 100);
}
catch (Exception e) {
}
addMissile(playerSprite);
}
playerSprite.update();
// Update the alien and explosion sprites
for (int i = 0; i < 3; i++) {
if (blobboSprite[i].isVisible()) {
blobboSprite[i].update();
blobboSprite[i].nextFrame();
}
if (jellySprite[i].isVisible()) {
jellySprite[i].update();
jellySprite[i].nextFrame();
}
if (timmySprite[i].isVisible()) {
timmySprite[i].update();
timmySprite[i].nextFrame();
}
if (explosionSprite[i].isVisible()) {
if (explosionSprite[i].getFrame() < 3)
explosionSprite[i].nextFrame();
else
explosionSprite[i].setVisible(false);
}
}
// Check for collisions and update the missile sprites
for (int i = 0; i < 10; i++) {
if (missileSprite[i].isVisible()) {
// Is the missile a player missile?
if (missileSprite[i].getFrame() == 0) {
for (int j = 0; j < 3; j++) {
// Did the missile hit a Blobbo alien?
if (blobboSprite[j].isVisible())
if (missileSprite[i].collidesWith(blobboSprite[j], false)) {
// Play a destruction sound
try {
Manager.playTone(ToneControl.C4 - 6, 100, 100);
}
catch (Exception e) {
}
// Create an explosion
addExplosion(blobboSprite[j]);
// Hide the sprites and update the score
blobboSprite[j].setVisible(false);
missileSprite[i].setVisible(false);
score += 10;
break;
}
// Did the missile hit a Jelly alien?
if (jellySprite[j].isVisible())
if (missileSprite[i].collidesWith(jellySprite[j], false)) {
// Play a destruction sound
try {
Manager.playTone(ToneControl.C4 - 6, 100, 100);
}
catch (Exception e) {
}
// Create an explosion
addExplosion(jellySprite[j]);
// Hide the sprites and update the score
jellySprite[j].setVisible(false);
missileSprite[i].setVisible(false);
score += 15;
break;
}
// Did the missile hit a Timmy alien?
if (timmySprite[j].isVisible())
if (missileSprite[i].collidesWith(timmySprite[j], false)) {
// Play a destruction sound
try {
Manager.playTone(ToneControl.C4 - 6, 100, 100);
}
catch (Exception e) {
}
// Create an explosion
addExplosion(timmySprite[j]);
// Hide the sprites and update the score
timmySprite[j].setVisible(false);
missileSprite[i].setVisible(false);
score += 20;
break;
}
}
}
// The missile is an alien missile
else {
// Did the missile hit the player car sprite
if (missileSprite[i].collidesWith(playerSprite, false)) {
// Play a wave sound for the car getting destroyed
try {
explosionPlayer.start();
}
catch (MediaException me) {
}
// Create an explosion
addExplosion(playerSprite);
// Reset the player car sprite
playerSprite.setPosition(0,
getHeight() - playerSprite.getHeight() - 10);
playerSprite.setXSpeed(4);
playerSprite.setYSpeed(0);
// Hide the missile sprite
missileSprite[i].setVisible(false);
// See whether the game is over
if (carsLeft-- == 0) {
// Stop the music
try {
musicPlayer.stop();
}
catch (MediaException me) {
}
// Play a wave sound for the game ending
try {
gameoverPlayer.start();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -