📄 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];
InputStream is; //声音流
InputStream is1;
InputStream is2;
//构造函数初始话了fps和敌人数
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("/StarryNight2.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,//图片,速度,速度,子弹动作,在哪个canvas上
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);//设置blobbo不可见
// 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]);//可发10颗子弹
}
// Initialize the music and wave players
try {
is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
musicPlayer.setLoopCount(-1);
//is1 = getClass().getResourceAsStream("Explosion.wav");
//explosionPlayer = Manager.createPlayer(is1, "audio/X-wav");
//explosionPlayer.prefetch();
//is2 = getClass().getResourceAsStream("GameOver.wav");
//gameoverPlayer = Manager.createPlayer(is2, "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)
newGame();// Start a new game
return;// The game is over, so don't update anything
}
// 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)//开火处理
{
try
{
Manager.playTone(60, 10, 100);// Play a fire sound
}
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())
{
if (missileSprite[i].getFrame() == 0)// Is the missile a player missile?玩家的子弹
{
for (int j = 0; j < 3; j++)
{
if (blobboSprite[j].isVisible())// Did the missile hit a Blobbo alien?
if (missileSprite[i].collidesWith(blobboSprite[j], false))
{
try
{
Manager.playTone(ToneControl.C4 - 6, 100, 100);// Play a destruction sound
}
catch (Exception e) {
}
addExplosion(blobboSprite[j]);// Create an explosion
blobboSprite[j].setVisible(false);// Hide the sprites and update the score
missileSprite[i].setVisible(false);
score += 10;
break;
}
if (jellySprite[j].isVisible())// Did the missile hit a Jelly alien?
if (missileSprite[i].collidesWith(jellySprite[j], false))
{
try
{
Manager.playTone(ToneControl.C4 - 6, 100, 100); // Play a destruction sound
}
catch (Exception e) {
}
addExplosion(jellySprite[j]);// Create an explosion
jellySprite[j].setVisible(false);// Hide the sprites and update the score
missileSprite[i].setVisible(false);
score += 15;
break;
}
if (timmySprite[j].isVisible())// Did the missile hit a Timmy alien?
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{
is1 = getClass().getResourceAsStream("Explosion.wav");
explosionPlayer = Manager.createPlayer(is1, "audio/X-wav");
explosionPlayer.prefetch();
} catch (IOException ioe) {
}
catch (MediaException me) {
}
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) {
}
try{
is2 = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is2, "audio/X-wav");
gameoverPlayer.prefetch();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}
// Play a wave sound for the game ending
try {
gameoverPlayer.start();
}
catch (MediaException me) {
}
// Hide the player car
playerSprite.setVisible(false);
// Update the high score list
updateHiScores();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -