📄 hcanvas.java.bak
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
import java.io.*;
public class HCanvas extends GameCanvas implements Runnable
{
private Display display;
private boolean sleeping;
private long frameDelay;
private int inputDelay;//这个变量很重要(增加游戏的有趣性与挑战性)。它仔细控制游戏中用户输入的灵敏度,目的在于限制小鸡的速度,产生按键延迟的效果
private Random rand;//产生随机数
private Image background;//背景图片
private Image chickenHead;//小鸡头像的图片
private Sprite chickenSprite;//小鸡精灵
private Sprite[] carSprite=new Sprite[4];//4个汽车精灵
private int[] carYSpeed=new int[4];//汽车只在垂直方向上运动,每个汽车有不同的速度
private boolean gameOver;//游戏是否结束
private int numLives;//保存剩下的小鸡数目,用来确定游戏何时结束,以及控制小鸡的头像数目
private int score;//游戏得分
public HCanvas(Display d)
{
super(true);
display=d;
//设置祯速率(30祯每秒)
frameDelay=33;
//清除输入延迟
inputDelay=0;
}
public void start()
{
//把canvas设置为当前屏幕
display.setCurrent(this);
//初始化随机数生成器
rand=new Random();
//初始化游戏变量
gameOver=false;
numLives=3;
score=3;
//初始化背景图象、小鸡和汽车精灵
try
{
background=Image.createImage("/images/highway.png");
chickenHead=Image.createImage("/images/ChickenHead.png");
chickenSprite=new Sprite(Image.createImage("/images/chicken.png"),30,22);
chickenSprite.setPosition(2,120);
carSprite[0]=new Sprite(Image.createImage("/images/car1.png"));
carSprite[0].setPosition(37,0);
carYSpeed[0]=3;
carSprite[1]=new Sprite(Image.createImage("/images/car2.png"));
carSprite[1].setPosition(81,0);
carYSpeed[1]=1;
carSprite[2]=new Sprite(Image.createImage("/images/car3.png"));
carSprite[2].setPosition(130,67);
carYSpeed[2]=-2;
carSprite[3]=new Sprite(Image.createImage("/images/car4.png"));
carSprite[3].setPosition(175,64);
carYSpeed[3]=-5;//最后一辆汽车速度最快
}
catch(IOException e)
{
System.err.println("Failed loading images!");
}
//开始动画线程
sleeping=false;
Thread t=new Thread(this);
t.start();
}
public void stop()
{
sleeping=true;
}
public void run()
{
Graphics g=getGraphics();
//主游戏循环
while(!sleeping)
{
update();
draw(g);
try
{
Thread.sleep(frameDelay);
}
catch(InterruptedException ie){}
}
}
private void update()
{
//检查游戏是否重新开始
if(gameOver)
{
int keyState=getKeyStates();
if((keyState&FIRE_PRESSED)!=0)
{
//开始一个新游戏
chickenSprite.setPosition(2,120);
gameOver=false;
score=0;
numLives=3;
}
//游戏结束,不必再更新
return;
}
//处理用户输入以控制小鸡的移动
if(++inputDelay>2)
{
int keyState=getKeyStates();
if((keyState&LEFT_PRESSED)!=0)
{
chickenSprite.move(-6,0);
chickenSprite.nextFrame();
}
else if((keyState&RIGHT_PRESSED)!=0)
{
chickenSprite.move(6,0);
chickenSprite.nextFrame();
}
if((keyState&UP_PRESSED)!=0)
{
chickenSprite.move(0,-6);
chickenSprite.nextFrame();
}
else if((keyState&DOWN_PRESSED)!=0)
{
chickenSprite.move(0,6);
chickenSprite.nextFrame();
}
checkBounds(chickenSprite,false);
//重置输入延迟
inputDelay=0;
}
//查看小鸡是否通过
if(chickenSprite.getX()>208)
{
//发出安全通过的声音
AlertType.WARNING.playSound(display);
//重置小鸡的位置并增加分数
chickenSprite.setPosition(2,77);
score+=25;
}
//更新汽车精灵
for(int i=0;i<4;i++)
{
//移动汽车精灵
carSprite[i].move(0,carYSpeed[i]);
checkBounds(carSprite[i],true);//第二个参数为真,表示汽车在边界处折返
//检查小鸡和汽车之间的冲突
if(chickenSprite.collidesWith(carSprite[i],true))
{
//发出警告的声音表示失去一只小鸡
AlertType.ERROR.playSound(display);
//查看游戏是否结束
if(--numLives==0)
{
gameOver=true;
}
else
{
//重置小鸡的位置
chickenSprite.setPosition(2,120);
}
//不必继续更新汽车精灵
break;
}
}
}
private void draw(Graphics g)
{
//绘制公路背景
g.drawImage(background,0,0,Graphics.TOP | Graphics.LEFT);
//绘制剩下的小鸡数目,一些小鸡脑袋的图象绘制到屏幕右下角,表示还剩余多少小鸡
for(int i=0;i<numLives;i++)
{
g.drawImage(chickenHead,240-((i+1)*8),10,Graphics.TOP | Graphics.LEFT);
}
//绘制小鸡精灵
chickenSprite.paint(g);
//绘制汽车精灵
for(int i=0;i<4;i++)
{
carSprite[i].paint(g);
}
if(gameOver)
{
//绘制游戏结束的消息和得分
g.setColor(255,255,255);//white 白色
g.setFont(Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_LARGE));
g.drawString("GAME OVER",120,120,Graphics.TOP | Graphics.HCENTER);
g.setFont(Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_MEDIUM));
g.drawString("Your scored "+score+" points.",120,150,Graphics.TOP | Graphics.HCENTER);
}
//刷新屏幕外图形缓冲
flushGraphics();
}
private void checkBounds(Sprite sprite,boolean wrap)
{
//如果有必要,折返或停止精灵
if(wrap)
{
//图形屏幕边界折返精灵
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
{
//在屏幕边界折返精灵
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());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -