⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcanvas.java.bak

📁 经典j2me开发的手机小游戏!无解压密码!直接可以在WTK2.0中运行
💻 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 + -