📄 henwaycanvas.java
字号:
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.*;
import javax.microedition.media*;
import javax.microedition.rms.RecordStore;
import com.nokia.mid.ui.*;
/*
* 创建日期 2006-11-15
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
/**
* @author liwei
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class HenwayCanvas extends FullCanvas implements Runnable{
int gameState=0;
MIDletFrame mf;
boolean flag;
Font font;
Random rand;
int num,setnum;
int soundset,vibraset;
boolean left,right,up,down;
//====================================================
private boolean sleeping;
private long frameDelay;
private Image background;
private Image chickenHead;
private Sprite chickenSprite;
private Sprite[] carSprite = new Sprite[4];
private int[] carYSpeed = new int[4];
private boolean gameOver;
private int numLives;
private int score;
private Player musicPlayer;
private Player celebratePlayer;
private Player squishPlayer;
private Player gameoverPlayer;
public static int HSc = 0;
private boolean back;
Thread trd;
public HenwayCanvas(MIDletFrame mf)
{
this.mf=mf;
flag=true;
font=Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
//Set the frame rate (20 fps)
frameDelay = 50;
// Clear the input delay
recordJob(false);
rand=new Random();
start();
trd=new Thread(this);
trd.start();
}
public void start()
{
// Initialize the game variables
gameOver = false;
numLives = 3;
score = 0;
// Initialize the background image and chicken and car sprites
try {
background = Image.createImage("/Highway.png");
chickenHead = Image.createImage("/ChickenHead.png");
chickenSprite = new Sprite(Image.createImage("/Chicken.png"), 22, 22);
chickenSprite.setPosition(0, 77);
carSprite[0] = new Sprite(Image.createImage("/Car1.png"));
carSprite[0].setPosition(27, 0);
carYSpeed[0] = 3;
carSprite[1] = new Sprite(Image.createImage("/Car2.png"));
carSprite[1].setPosition(62, 0);
carYSpeed[1] = 1;
carSprite[2] = new Sprite(Image.createImage("/Car3.png"));
carSprite[2].setPosition(93, 67);
carYSpeed[2] = -2;
carSprite[3] = new Sprite(Image.createImage("/Car4.png"));
carSprite[3].setPosition(128, 64);
carYSpeed[3] = -5;
}
catch (IOException e) {
System.err.println("Failed loading images!");
}
// Initialize the music and wave players
try {
InputStream is = getClass().getResourceAsStream("Music.mid");
musicPlayer = Manager.createPlayer(is, "audio/midi");
musicPlayer.prefetch();
is = getClass().getResourceAsStream("Celebrate.wav");
celebratePlayer = Manager.createPlayer(is, "audio/X-wav");
celebratePlayer.prefetch();
is = getClass().getResourceAsStream("Squish.wav");
squishPlayer = Manager.createPlayer(is, "audio/X-wav");
squishPlayer.prefetch();
is = getClass().getResourceAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");
gameoverPlayer.prefetch();
}
catch (IOException ioe) {
}
catch (MediaException me) {
}
}
protected synchronized void recordJob(boolean writeflags)
{
RecordStore recordStore = null;
byte[] b = null;
String str = null;
try{
recordStore = RecordStore.openRecordStore("ChacknPop", true);
if(recordStore.getNumRecords() == 0){
str = Integer.toString(HSc);
b = str.getBytes();
recordStore.addRecord(b, 0, b.length);
}else{
if(writeflags == true){
str = Integer.toString(HSc);
b = str.getBytes();
recordStore.setRecord(1, b, 0, b.length);
}else if(writeflags == false){
b = recordStore.getRecord(1);
HSc = Integer.parseInt(new String(b));
}
}
recordStore.closeRecordStore();
recordStore = null;
b = null;
str = null;
}catch(Exception e){
}
}
private void CheckScore()
{
if(HSc < score){
HSc = score;
}
}
public void drawGame(Graphics g)
{
g.setFont(font);
// Draw the highway background
g.setColor(0,0,0);
g.fillRect(0,0,getWidth(),getHeight());
g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);
g.setColor(0,255,255);
g.drawString("返回",0,getHeight()-font.getHeight(),0);
g.drawString("退出",getWidth()-font.stringWidth("退出"),getHeight()-font.getHeight(),0);
//Draw the score
g.setColor(255,0,0);
g.drawString("Sc:",155,0,0);
g.drawString(""+score,155,font.getHeight(),0);
// Draw the number of remaining lives
for (int i = 0; i < numLives; i++)
g.drawImage(chickenHead, 25 - ((i + 1) * 8), 0, Graphics.TOP | Graphics.LEFT);
// Draw the chicken sprite
chickenSprite.paint(g);
// Draw the car sprites
for (int i = 0; i < 4; i++)
carSprite[i].paint(g);
if (gameOver) {
gameState=6;
}
}
private void update()
{
checkBounds(chickenSprite, false);
// See whether the chicken made it across
if (chickenSprite.getX() == (getWidth() - chickenSprite.getWidth())) {
// Play a sound for making it safely across
if(soundset==0)
{
try {
celebratePlayer.start();
}
catch (MediaException me) {
}
}
// Reset the chicken position and increment the score
chickenSprite.setPosition(0, 77);
score += 25;
}
if(left==true)
{
chickenSprite.move(-3, 0);
chickenSprite.nextFrame();
}
if(right==true)
{
chickenSprite.move(3, 0);
chickenSprite.nextFrame();
}
if(up==true)
{
chickenSprite.move(0, -3);
chickenSprite.nextFrame();
}
if(down==true)
{
chickenSprite.move(0, 3);
chickenSprite.nextFrame();
}
// Update the car sprites
for (int i = 0; i < 4; i++) {
// Move the car sprites
carSprite[i].move(0, carYSpeed[i]);
checkBounds(carSprite[i], true);
// Check for a collision between the chicken and cars
if (chickenSprite.collidesWith(carSprite[i], true)) {
// Play a sound for losing a chicken
if(soundset==0)
{
try {
squishPlayer.start();
}
catch (MediaException me) {
}
}
if(vibraset==0)
{
mf.display.vibrate(200);
}
// Check for a game over
if (--numLives == 0) {
// Stop the music and play a game over sound
if(soundset==0)
{
try {
musicPlayer.stop();
try
{
Thread.sleep(20);
}
catch(Exception e){}
gameoverPlayer.start();
}
catch (MediaException me) {
}
}
gameOver = true;
} else {
// Reset the chicken position
chickenSprite.setPosition(0, 77);
}
// No need to continue updating the car sprites
break;
}
}
}
private void checkBounds(Sprite sprite, boolean wrap) {
// Wrap/stop the sprite if necessary
if (wrap) {
// Wrap the sprite around the edges of the screen
if (sprite.getX() < -sprite.getWidth())
sprite.setPosition(getWidth(), sprite.getY());
else if (sprite.getX() > getWidth())
sprite.setPosition(-sprite.getWidth(), sprite.getY());
if (sprite.getY() < -sprite.getHeight())
sprite.setPosition(sprite.getX(), getHeight());
else if (sprite.getY() > getHeight())
sprite.setPosition(sprite.getX(), -sprite.getHeight());
}
else {
// Stop the sprite at the edges of the screen
if (sprite.getX() < 0)
sprite.setPosition(0, sprite.getY());
else if (sprite.getX() > (getWidth() - sprite.getWidth()))
sprite.setPosition(getWidth() - sprite.getWidth(), sprite.getY());
if (sprite.getY() < 0)
sprite.setPosition(sprite.getX(), 0);
else if (sprite.getY() > (getHeight() - sprite.getHeight()))
sprite.setPosition(sprite.getX(), getHeight() - sprite.getHeight());
}
}
public void paint(Graphics g)
{
if(gameState==0)
{
drawTitle(g);
}
else if(gameState==1)
{
drawMenu(g);
}
else if(gameState==2)
{
drawSettings(g);
}
else if(gameState==3)
{
drawHelp(g);
}
else if(gameState==4)
{
drawAbout(g);
}
else if(gameState==5)
{
drawGame(g);
update();
}
else if(gameState==6)
{
GameOver(g);
}
}
public void drawTitle(Graphics g)
{
g.setFont(font);
Integer integer;
String string;
g.setColor(200,200,30);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0,255,255);
g.drawString("小鸡过马路",(getWidth()-font.stringWidth("小鸡过马路"))/2,50,0);
g.drawString("菜单",0,getHeight()-font.getHeight(),0);
g.drawString("退出",getWidth()-font.stringWidth("退出"),getHeight()-font.getHeight(),0);
g.setColor(255,0,0);
integer=new Integer(HSc);
string=integer.toString();
g.drawString("最高分: "+HSc,(getWidth()-(font.stringWidth("最高分: "+string)))/2,90,0);
}
public void drawHelp(Graphics g)
{
g.setFont(font);
g.setColor(200,200,30);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0,255,255);
g.drawString("帮助",(getWidth()-font.stringWidth("帮助"))/2,0,0);
g.drawString("返回",getWidth()-font.stringWidth("返回"),getHeight()-font.getHeight(),0);
}
public void drawAbout(Graphics g)
{
g.setFont(font);
g.setColor(200,200,30);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0,255,255);
g.drawString("关于",(getWidth()-font.stringWidth("关于"))/2,0,0);
g.drawString("返回",getWidth()-font.stringWidth("返回"),getHeight()-font.getHeight(),0);
}
public void drawSettings(Graphics g)
{
g.setFont(font);
g.setColor(200,200,30);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(150,100,0);
g.fillRect(0,60+font.getHeight()*setnum,getWidth(),font.getHeight());
g.setColor(0,255,255);
g.drawString("设置",(getWidth()-font.stringWidth("设置"))/2,0,0);
if(soundset==1)
{
g.drawString("声音: 关",60,60,0);
}
else
{
g.drawString("声音: 开",60,60,0);
}
if(vibraset==1)
{
g.drawString("振动: 关",60,60+font.getHeight(),0);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -