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

📄 gamecanvas.java

📁 RPG冒险游戏
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Font;
import javax.microedition.rms.RecordStore;
import CustomlUtil.Configration;
import CustomlUtil.Monster;
import CustomlUtil.TiledLayer;
import CustomlUtil.ImageSet;

public class GameCanvas extends Canvas implements Runnable
{
	//--------------定义线程--------------------------
	private Thread th = null; 
	private GameMid GM = null;
	private int i_Speed = 0;
	private boolean is_Run = false;
	private int i_num;
	
	//-------------定义屏幕宽高-----------------------
	private int i_lcdWidth = 0;
	private int i_lcdHeight = 0;
	
	//-------------定义屏幕中心坐标--------------------
	private int i_lcdCenterX = 0;
	private int i_lcdCenterY = 0;
	
	//-------------定义地图-----------------------
	//-------共计22层,每层为11×11的大小---------------
	private TiledLayer map;	//游戏地图
	private byte mapArray[] = new byte[121];
	byte b_star[] = {5,9,5,9,0,1,1,10,10,9,0,9,9,9,5,10,0,1,6,3,4,
			6,1,10,9,10,1,10,5,9,3,0,5,0,5,8,1,10,9,10,5,4,5,5,};//每层地图的入口
	byte b_end[] = {5,1,1,0,0,9,10,9,0,9,9,9,4,9,1,0,7,4,6,7,0,9,9,
			10,1,10,4,10,5,9,7,0,5,6,1,10,9,10,5,4,5,6,5,6};//每层地图的出口
	
	//---------定义变量表示游戏状态--------------------
	private byte SS_NOW = 0;
	private byte CurrentState = 0;   //当前游戏中的状态
    
	//---------定义英雄的相关信息---------------------
	private byte HeroLv = 0; //英雄等级
	private int HeroLp = 0;//英雄生命值
	private int HeroAc = 0;//英雄攻击力
	private int HeroDc = 0;//英雄防御力
	private int HeroExp = 0;//经验值
	private int HeroMoney = 0; //钱币
	private byte RedKey = 0;//红钥匙的数量
	private byte YellowKey = 0;//黄钥匙的数量
	private byte BlueKey = 0;//蓝钥匙的数量
	private byte Steps[] = {0,1,2,1}; //英雄在地图上前进的帧序列
	private byte stepIndex = 0;//英雄当前帧的序号
	private byte b_x,b_y;  //英雄在地图数组中的位置
	private byte Direction; //英雄的朝向;
	private boolean is_Move = true; //定义英雄是否可以移动
	private byte b_Dx,b_Dy; 
	//----------定义菜单选项--------------------------
	private byte b_Selected  = 0;
	//-------------游戏中用的图片---------------------
	private Image img_Logo;   //LOGO
	private Image img_Title;  //TITLE
	private Image img_AnyKey; //PressAnyKey
	private Image img_jtl;  //向左箭头
	private Image img_jtr; //向右箭头
    private Image img_Hero; //英雄图片
    private Image img_Map;  //地图图片
    //-------------定义当前关卡-----------------
    private byte b_Stage = 0;
    private byte maxStage = 0;  //到过的最高楼层;
    
    //------------定义游戏Intro界面Y轴偏移量-------
    private int offestY = 0;
    private int IntroHeight = 0;
    
    //----------定义游戏存储对象---------
    private RecordStore rs;
    private boolean is_Loaded = false;//判断游戏是否加载完毕
	
    
    //----------定义计时器--------------
    private long StartTime = 0;
    private long UsedTime = 0;
    
    //定义一些变量用于控制游戏情节进展
    private String Message,Msg;
    private boolean hasLuoPan = false; //是否得到了风之罗盘
    private boolean hasBaoDian = false; //是否得到怪物宝典
    private boolean is_DialogedForAngle = false; //是否与天使对过话
	private byte b_DialogIndexForAngle = 0;
	private boolean hasLatinCross = false; //是否拿到了十字架
	
	private boolean is_DialogedForJack = false;//是否与JACK对过话;
	private byte b_DialogIndexForJack = 0;
	private boolean hasPickax = false; //是否拿到了镐
	
	private boolean is_DialogedForLevelUp = false; //是否与老头NPC对话
	private boolean is_DialogedForLevelUp15 = false;
	private byte b_DialogIndexForLevelUp = 0;
	private boolean hasExp = false;
	
	private boolean is_DialogedForBuyKey = false; //是否与商人NPC对话
	private boolean is_DialogedForBuyKey15 = false;
	private byte b_DialogIndexForBuyKey = 0;
	private boolean hasMoney = false;
	
	private boolean is_DialogedForPrincess = false;//是否与公主对过话;
	private byte b_DialogIndexForPrincess  = 0;
	
	private boolean is_DialogedForBeelzeBub = false;//是否与魔王对过话;
	private byte b_DialogIndexForBeelzeBub = 0;
	private boolean BeelzeBubIsDead = false; //是否已经杀死了魔王
	
	public GameCanvas(GameMid GM)
	{
		SS_NOW = Configration.SS_LOGO;
		LoadImage();		
		
		i_lcdWidth = this.getWidth();
		i_lcdHeight = this.getHeight();
		offestY = i_lcdHeight - 30;
		i_lcdCenterX = i_lcdWidth / 2;
		i_lcdCenterY = i_lcdHeight / 2;
	
		this.GM = GM;
		i_num = 1;
		is_Run = true;
		i_Speed = 100;
		th = new Thread(this);
		th.start();
	}
//	=====================游戏规则===========================	
	private boolean CanMove()
	{
		switch(getFront())
		{
			case -1://老头NPC
				if(b_Stage == 2 || b_Stage == 15)
				{
					DialogForLevelUp();
				}
				CurrentState = Configration.LEVELUP;		
				break;
			case -2://财主NPC
				if(b_Stage == 2 || b_Stage == 15)
				{
					DialogForBuyKey();
				}
				CurrentState = Configration.BUYKEY;
				break;
			case -3://商店NPC
				CurrentState = Configration.SHOPING;
				break;
			case -4://天使NPC
				CurrentState = Configration.ANGEL;
				DialogForAngle();
				break;
			case -36:
				CurrentState = Configration.PRINCESS;
				DialogForPrincess();
				break;
			case -37:
				CurrentState = Configration.JACK;
				DialogForJack();
				break;
			case 77:
				hasBaoDian = true;
				setValue();
				Msg = "得到怪物宝典,可以通过数字键3查看当前怪物的属性!";
				break;
			case 78:
				hasLuoPan = true;
				setValue();
				Msg = "得到风之罗盘,可以通过数字键1快速到达指定的楼层!";
				break;
			case 79:
				RedKey++;
				BlueKey++;
				YellowKey++;
				Msg = "所有钥匙加1";
				i_num = 1;
				setValue();
				break;
			case 81:
				hasPickax = true;
				b_DialogIndexForJack = 0;
				is_DialogedForJack = false;
				setValue();
				Msg = "获得嵌着红宝石的榔头";
				i_num = 1;					
				break;
			case 82:
				HeroMoney += 300;
				Msg = "金币增加300";
				i_num = 1;
				setValue();			
				break;
			case 83:
				if(YellowKey > 0)
				{
					YellowKey--;
					setValue();					
				}
				break;
			case 84:
				if(BlueKey > 0)
				{
					BlueKey--;
					setValue();
				}
				break;
			case 85:
				if(RedKey > 0)
				{
					RedKey--;
					setValue();

					if(b_Stage == 16)
					{
						CurrentState = Configration.BEELZEBUB;
						DialogForBeelzeBub();						
					}
				}
				break;
			case 87:
				YellowKey++;
				setValue();
				Msg = "获得一把黄钥匙";
				i_num = 1;
				break;
			case 88:
				BlueKey++;
				setValue();
				Msg = "获得一把蓝钥匙";
				i_num = 1;
				break;
			case 89:
				RedKey++;
				setValue();
				Msg = "获得一把红钥匙";
				i_num = 1;
				break;
			case 90:
				HeroDc += 3;
				setValue();
				Msg = "提升3点防御力";
				i_num = 1;
				break;
			case 91:
				HeroAc += 3;
				setValue();
				Msg = "提升3点攻击力";
				i_num = 1;
				break;
			case 92:
				HeroLp += 200;
				setValue();
				Msg = "生命值提升200点";
				i_num = 1;
				break;
			case 93:
				HeroLp += 500;
				setValue();
				Msg = "生命值提升500点";
				i_num = 1;
				break;
			case 94:
				if(maxStage < b_Stage)
				{
					maxStage = b_Stage;
				}
				SaveMap();
				b_Stage++;
				b_x = b_star[b_Stage * 2];
				b_y = b_star[b_Stage * 2 + 1];
				initStage();
				CurrentState = Configration.STAGECHANGED;
				i_num = 1;
				break;
			case 95:
				SaveMap();
				b_Stage--;
				b_x = b_end[b_Stage * 2];
				b_y = b_end[b_Stage * 2 + 1];
				initStage();				
				CurrentState = Configration.STAGECHANGED;
				i_num = 1;
				break;
			case 96://铁门
				setValue();
				break;
			case 103:
				HeroAc += 10;
				setValue();
				Msg = "攻击提升10点";
				i_num = 1;
				break;
			case 104:
				HeroAc += 40;
				setValue();
				Msg = "攻击提升40点";
				i_num = 1;
				break;
			case 107:
				HeroAc += 80;
				setValue();
				Msg = "攻击提升80点";
				i_num = 1;
				break;
			case 108:
				HeroDc += 10;
				setValue();
				Msg = "防御提升10点";
				i_num = 1;
				break;
			case 109:
				HeroDc += 85;
				setValue();
				Msg = "防御提升85点";
				i_num = 1;
				break;
			case 112:
				HeroDc += 100;
				setValue();
				Msg = "防御提升100点";
				i_num = 1;	
				break;
			case 113:
				HeroLvUp(1);
				setValue();
				Msg = "获得小飞羽等级提升1";
				i_num = 1;	
				break;
			case 115:
				HeroLvUp(3);
				setValue();
				Msg = "获得大飞羽等级提升3";
				i_num = 1;	
				break;
			case 116:
				hasLatinCross = true;
				b_DialogIndexForAngle = 0;
				is_DialogedForAngle = false;
				setValue();
				Msg = "获得光明十字架";
				i_num = 1;				
				break;
			case 117:
				HeroLp *= 2;
				setValue();
				Msg = "获得超级血瓶生命值翻倍";
				i_num = 1;
				break;
			case 120:
				return true;
			default:
				byte f = getFront();
				byte index = (byte)(-f - 5);
				
				if(f > -36 && f < -4)
				{
					if(f == -15)
					{
						int i = HeroLp / 4;
						HeroLp -= i;
						if(Fight(Configration.Mn[index]))
						{
							setValue();
						}
						else
						{
							HeroLp += i;
						}
					}
					else if(f == -21)
					{
						int i = HeroLp / 3;
						HeroLp -= i;
						if(b_Stage == 21)
						{
							index = 31;
						}
						if(Fight(Configration.Mn[index]))
						{
							setValue();
						}
						else
						{
							HeroLp += i;
						}
					}
					else if(f == -34)
					{
						switch(b_Stage)
						{
							case 19:
								CurrentState = Configration.BEELZEBUB;
								DialogForBeelzeBub();
								break;
							case 21:
								if(Fight(Configration.Mn[35]))
								{
									setValue();
									Msg = "冥灵魔王:啊......怎么可能,我怎么可能会被你打败呢!不,不要这样.........";
									BeelzeBubIsDead = true;
								}
								break;
						}				
					}
					else
					{
						if(f == -22 && b_Stage == 17)
						{
							index = 32;
						}
						else if(f == -25 && b_Stage == 20)
						{
							index = 33;
						}
						else if(f == -35 && b_Stage == 19)
						{
							index = 34;
						}
						
						if(Fight(Configration.Mn[index]))
						{
							setValue();
						}
					}
				}
				break; 
		}
		return false;
	}

	private void CloseStore()	//关闭数据存储记录
	{
		try
		{
			rs.closeRecordStore();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	private void OpenStore()	//打开数据存储记录
	{
		try
		{
			rs = RecordStore.openRecordStore("Game1.Save",false);
		} 
		catch (Exception e)
		{
			try 
			{
				rs = RecordStore.openRecordStore("Game1.Save",true);
				byte temp[] = ImageSet.LoadMap("/Map/Map.Lib", 2662);
				rs.addRecord(temp, 0, temp.length);
				
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				DataOutputStream os = new DataOutputStream(baos);
				os.writeByte(1);
				os.writeInt(1000);
				os.writeInt(10);
				os.writeInt(10);
				os.writeInt(0);
				os.writeInt(0);
				os.writeByte(0);
				os.writeByte(0);
				os.writeByte(0);
				os.writeByte(5);
				os.writeByte(9);
				os.writeByte(0);
				os.writeLong(0);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeByte(0);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeByte(0);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeByte(0);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeByte(0);
				os.writeBoolean(false);
				os.writeBoolean(false);
				os.writeByte(0);
				os.writeBoolean(false);
				os.writeByte(0);
				os.writeBoolean(false);
				os.close();
				byte data[] = baos.toByteArray();
				rs.addRecord(data, 0, data.length);
				
				rs.addRecord(temp, 0, temp.length);
			} 
			catch (Exception e1)
			{
				e1.printStackTrace();
			}
		}
	}
	
	private void DialogForAngle() //处理与天使的对话
	{
		if(!hasLatinCross)
		{	
			if(b_DialogIndexForAngle >= Configration.DialogForAngle1.length - 1)
			{
				b_DialogIndexForAngle =(byte)(Configration.DialogForAngle1.length - 1);
				is_Move = true;
				if(!is_DialogedForAngle)
				{
					is_DialogedForAngle = true;
					YellowKey++;
					RedKey++;
					BlueKey++;
				}
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -