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

📄 castlecanvas.java

📁 恶魔城-晓月圆舞曲 JAVA手機遊戲
💻 JAVA
📖 第 1 页 / 共 4 页
字号:

import java.io.IOException;
import java.util.*;

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class CastleCanvas extends GameCanvas implements Runnable{
	static byte gameState = -1; //游戏状态
	static final byte GAME_LOGO = 0; //游戏公司LOGO
	static final byte GAME_MENU_EFFECT = 1; //开始菜单出现动画效果
	static final byte GAME_MENU = 2; //开始菜单界面
	static final byte GAME_ANIMATION = 3; //开始游戏和空闲片头动画
	static final byte GAME_MENU_SELECT = 4; //开始游戏的选择、复制、删除界面
	static final byte GAME_SELECT_DATA = 5; //选择DATA界面
	static final byte GAME_COPY_DATA = 6; //复制DATA界面
	static final byte GAME_DELETE_DATA = 7; //删除DATA界面
	static final byte GAME_WAIT_OTHER = 8; //等待其他完家通信
	static final byte GAME_NEW_START = 9; //新的游戏界面
	static final byte GAME_SAVE_LOAD = 10; //继续游戏载入到纪录点
	static final byte GAME_MAIN = 11; //主游戏界面
	static final byte GAME_MAP = 12; //游戏地图
	static final byte GAME_ROLE_STATE = 13; //主角的属性
	static final byte GUT_ONE = 101; //第1个剧情
	static final byte GAME_GAIN_FETCH = -2; //得到魂的效果
	static final byte GAME_SCENE_ONE = 14; //场景1
	static final byte GAME_COM_LOGO = 15;
	static final byte GAME_LOADING = 16;
	static final byte GAME_CONECT = 17;//连接通信
	static final byte GAME_OVER = 18;

	static byte loadingState = -1;//根据不同界面加载不同资源
	static final byte loadMenu = 0;//加载菜单
	static final byte loadGameMain = 1;//加载主游戏界面
	
	private boolean timeState; //控制延迟时间开关 
	private boolean isCopy;//判断选择存单还是复制存单
	private boolean isDelete;//是否是选择状态
	private boolean[] rmsExist = new boolean[3];;//判断存档是否存在
	private boolean alphaLogo;//判断浅见 或 逐渐显示
	private boolean isCopySure;//确认拷贝
	private byte imgHV; //HCENTEER|VCENTER
	public static byte imgLT; //LEFT|TOP
	private byte loadingCount;
	private byte menuIndex; //开始游戏菜单位置
	private byte gameSelect;//DATA菜单选择的位置
	private byte handFrame;//指示标志的动态移动的X坐标
	private byte fireFrame;//火焰播放的帧数
	private byte copyIndex;//要拷贝的存档的下标
	private byte deleIndex;//要删除存档的下标
	private byte isNot;//选择是否的下标
	static byte[] handSpeed = new byte[]{1,2,4,6,7,6,4,2,1};//手指指示的X坐标	
	private byte aniSpeed;//动画播放速度
	private byte maxSelect;//控制最大选择数的下标
	private byte flashSpeed;//控制手指标示的闪动
	public static final short screenWidth = 176; //屏幕宽度
	public static final short screenHeight = 220; //屏幕高度
	private short alpha;//设置透明度
	private int keyState;//键缓冲
	private long timeMachine; //时间开始
	private long keyStart;//按键开始按下的时间
	private boolean keyFlag;//案件延迟的标记
	private Image konamiLogo; //Konami Logo
	private Image gameLogo; // Game Logo
	private Image menuTitle; //menuTitle
	private Image menuCastle; //menuCastle
	private Image menuSelect; //Select
	private Image loadImg; //loading
	private Image menuMoon; //moon
	private Image menuMoonBack;//moonBack
	private Image selectData;//选择、复制、删除界面
	private Image selectFont;
	private Image selectGameData;//选择存档界面
	private Image copyData;//复制存单界面
	private Image deleteData;//删除存档界面
	private Image newGame;//新游戏开始界面
	private Image menuBack;//菜单背景界面
	private Image handFlag;//指标,火焰等碎图
	private Image nameFont;//创建新游戏 起名界面
	private Image dead;
	public static Image itemEnum;
	static Font blodFace;
	static Font plainFace;
	static Font smallFace;
	static Font lagerFace;
	public static Map map;
	public static RoleMan soma;//游戏主角
	public static StateInterface sFace;
	private Runtime rt; 
	private CastlevaniaMIDlet MidLet;
	private static CastleCanvas canvas;
	public static Vector enemy;
	public static Vector effect;
	public static final Vector magic = new Vector();
	private CastleCanvas(CastlevaniaMIDlet MidLet) {
		super(false);
		rt = Runtime.getRuntime();
		maxSelect = 2;
		copyIndex = -1;
		gameState = GAME_LOADING;
		loadingState = loadMenu;
		timeState = true;
		keyFlag = true;
		imgHV = Graphics.VCENTER|Graphics.HCENTER;
		imgLT = Graphics.LEFT|Graphics.TOP;
		loadImg = createImage("Loading");
		blodFace = Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_MEDIUM);
		this.MidLet = MidLet;
		this.setFullScreenMode(true);
	}
//	protected void pointerPressed(int x,int y)
//	{
//		System.out.println("x:"+x+"y:"+y);
//	}
	public static CastleCanvas getCanvas(CastlevaniaMIDlet MidLet)
	{
		canvas = new CastleCanvas(MidLet);
		return canvas;
	}
	public boolean[] getRms()
	{
		boolean[] rmsExist = new boolean[]{
				true,false,true
			};//假设
		return rmsExist;
	}
	public static Image createImage(String pngName)
	{//封装的加载图片方法
		Image pngImage = null;
		try {
			pngImage = Image.createImage("/respng/"+pngName+".png");
		} catch (IOException e) {
			System.err.println("Image create false!PNGNAME:"+pngName);
			e.printStackTrace();
		}
		return pngImage;
	}
	private void selectLeft()
	{
		for(int i=0;i<rmsExist.length;i++) //控制案件向左移动的下标
		{									//并且不选择无存档的位置						
			if(!rmsExist[gameSelect])
			{
				gameSelect--;
				if(gameSelect<0)
				{
					gameSelect = 2;
				}
			}
		}
	}
	private void selectRight()
	{
		for(int i=0;i<rmsExist.length;i++)//控制案件向右移动的下标
		{									//并且不选择无存档的位置
			if(!rmsExist[gameSelect])
			{
				gameSelect++;
				gameSelect %= 3;
			}
		}
	}
/*	纪时模式现实LOGO
 * private void drawLogo(Graphics g,Image logo,byte gameState)
	{
		
		if(timeState)
		{
			timeMachine = System.currentTimeMillis();//LOGO开始时间
			timeState = false;
		}
		if(System.currentTimeMillis()-timeMachine>3000)//大于3秒(3000毫秒)切换到下一个状态
		{
			CastlevaniaCanvas.gameState = gameState;
			timeState = true;
		}
	}*/
	private boolean drawLoading(Graphics g)
	{
		int x = (screenWidth-160)/2;
		int y = (screenHeight-59)/2;
		byte count = 7;
		int width = 160/count;
		byte value =(byte)((float)loadingCount/(float)count*100);
		g.setColor(0xF84830);
		g.setFont(blodFace);
		g.drawString("Loading"+value+"%",x+90,y+48,imgLT);
		g.setClip(x,y,loadingCount*width,59);
		g.drawImage(loadImg,x,y,imgLT);
		switch(loadingState)
		{
		case loadMenu:
			if(loadingCount==0)
			{
				konamiLogo = createImage("konami");//加载LOGO
				gameLogo = createImage("eurLogo");
			}
			else if(loadingCount==1)
			{//初始化字体
				plainFace = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
				smallFace = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
				lagerFace = Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_PLAIN,Font.SIZE_LARGE);
			}
			else if(loadingCount==2)
			{
				map = new Map();
		
				menuCastle = createImage("castle");
				menuTitle = createImage("title");
				menuSelect = createImage("select2");
			}
			else if(loadingCount==3)
			{//加载菜单图片
				menuCastle = createImage("castle");
				menuMoon = createImage("moon");
				menuMoonBack = createImage("mb");
			}
			else if(loadingCount==4)
			{
				selectData = createImage("selectData");
				selectFont = createImage("setectFont");
			}
			else if(loadingCount==5)
			{
				selectGameData = createImage("selectInData");
				copyData = createImage("copyData");
				deleteData = createImage("deleteData");
				newGame = createImage("newGame");
				menuBack = createImage("menuBack");
				handFlag = createImage("flagSel");
			}
			else if(loadingCount==6)
			{
				rmsExist = getRms();
				itemEnum = createImage("item_enum");
				soma = new RoleMan((short)84,(short)623);
//				CastleCanvas.soma.setRoleY((short)141);
//				CastleCanvas.soma.setRoleX((short)0);
			}
			else if(loadingCount==count)
			{
				enemy = new Vector();
				effect = new Vector();
				map.setMap(Map.MAPBORN);
				CastleCanvas.map.setPosRY((short)452);
				CastleCanvas.map.setPosRX((short)0);
				sFace = new StateInterface();
				dead = createImage("dead");
				return true;
			}
			break;
		}
		loadingCount++;
		return false;
	}
	private void drawAlphaLogo(Graphics g1,Image logo,byte gameState)
	{
		int width = logo.getWidth();
		int height = logo.getHeight();
		int[] buffImg = new int[width*height];
		logo.getRGB(buffImg,0,width,0,0,width,height);
		for(int i=0;i<buffImg.length;i++)
		{
			// 0xffrrggbb
			int r = buffImg[i] >> 16 & 255;//0x0000rr
			int g = buffImg[i] >> 8 & 255; //0x00rrgg
			int b = buffImg[i] & 255;	   //0xrrggbb	
			buffImg[i] = alpha<<24 | r<<16 | g<<8 | b;
		}
		g1.drawRGB(buffImg,0,width,0,0,width,height,true);
		if(!alphaLogo)
		{
			alpha += 10;
			if(alpha>=255)
			{
				alpha = 255;
				alphaLogo = true;
			}
		}
		else
		{
			alpha -= 10;
			if(alpha<=0)
			{
				alpha = 0;
				alphaLogo = false;
				CastleCanvas.gameState = gameState;
			}
		}
	}
	public void drawFire(Graphics g,short x,short y,byte gap)
	{
		g.setClip(x,y,10,16);
		g.drawImage(handFlag,x-fireFrame*16,y-87,imgLT);
		g.setClip(x+gap,y,10,16);
		g.drawImage(handFlag,x+gap-fireFrame*16,y-87,imgLT);
		aniSpeed++;
		aniSpeed %= 2;
		if(aniSpeed==0)
			fireFrame++;
		fireFrame %= 4;
	}
	private void drawClearScreen(Graphics g,int Color) //清屏
	{
		g.setClip(0,0,240,320);
		g.setColor(Color); 
		g.fillRect(0,0,240,320); 
	}  
	private void drawMenu(Graphics g)
	{
		byte bx = 25;	//彩蛋背景X
		byte by = 40;	//彩蛋背景Y
		byte currentX = 71;//菜单宽度
		byte y = 8;//菜单高度
		g.setClip(0,0,menuMoon.getWidth(),menuMoon.getHeight());//限制月亮剪切区
		g.drawImage(menuMoon,0,0,imgLT);//画月亮
		g.setClip(bx+9,by+9,menuMoonBack.getWidth(),menuMoonBack.getHeight());//限制月亮MASK剪切区
		g.drawImage(menuMoonBack,bx+9,by+9,imgLT);//画月亮MASK
		g.setClip(bx-20,by-9,menuCastle.getWidth(),menuCastle.getHeight());//限制城堡剪切娶
		g.drawImage(menuCastle,bx-20,by-9,imgLT);//画城堡
		g.setClip(bx-25,by+28,menuTitle.getWidth(),menuTitle.getHeight());//限制标题剪切娶
		g.drawImage(menuTitle,bx-25,by+28,imgLT);//画标题
		g.setClip(50,147,currentX,y*3);//限制菜单剪切区,高度为一行*3,一次切出
	    g.drawImage(menuSelect,50,130,imgLT);//画菜单
		g.setClip(51,131+(menuIndex+2)*8,currentX,y);//限制当前菜单剪切区,改变menuIndex动态改边区域,高亮现实
		g.drawImage(menuSelect,-20,130,imgLT);//画高亮菜单
		g.setClip(0,210,176,20);//以下无聊
		g.setColor(0xFFffffff);//画信息
		g.setFont(smallFace);////请无视,必要时删除
		g.drawString("C.2008 FWQ J2MEGameDemo CHINA",0,210,imgLT);
	}
	private void drawMenuEffect(Graphics g)
	{
		g.setColor(0xFFffffff);
		g.drawString("菜单过场效果,按任意键跳过",50,100,imgLT);
	}
	private void drawMenuSelect(Graphics g)
	{
		g.setFont(lagerFace);
		g.setColor(0xFFffffff);
		byte height = (byte)(selectFont.getHeight()/3);
		byte width = (byte)selectFont.getWidth();
		g.setClip(0,0,screenWidth,screenHeight);
		g.drawImage(menuBack,0,0,imgLT);
		g.drawImage(selectData,0,0,imgLT);
		g.setClip(17+gameSelect*33,34+gameSelect*42,width,height);
		g.drawImage(selectFont,17+gameSelect*33,34+gameSelect*41-gameSelect*height,imgLT);
		if(gameSelect==0 || gameSelect==1)
			drawFire(g,(short)(2+gameSelect*30),(short)(24+gameSelect*43),(byte)93);
		else
			drawFire(g,(short)(68),(short)(110),(byte)93);
		g.setClip(0,172,100,30);
		switch(gameSelect)
		{
		case 0:
			g.drawString("选择存档。",10,172,imgLT);
			break;
		case 1:
			g.drawString("复制存档。",10,172,imgLT);
			break;
		case 2:
			g.drawString("删除存档。",10,172,imgLT);
			break;
		}
	}
	private void drawMenuSelectData(Graphics g)
	{
		g.setFont(lagerFace);
		g.setColor(0xFFffffff);
		g.setClip(0,0,screenWidth,screenHeight);
		g.drawImage(selectGameData,0,0,imgLT);
		drawFire(g,(short)34,(short)2,(byte)100);
		g.setClip(-5+handSpeed[handFrame]+gameSelect*32,55,20,10);
		g.drawImage(handFlag,-5+handSpeed[handFrame]+gameSelect*32,55,imgLT);
		handFrame++;
		handFrame %= handSpeed.length;
		if(rmsExist[gameSelect])
		{
			g.setClip(68,125,100,26);//x,y STATE
			g.drawImage(handFlag,68,96,imgLT);//x-0,y-29
			g.setClip(5,182,100,30);
			g.drawString("继续游戏。",10,182,imgLT);
		}
		else
		{
			g.setClip(86,125,62,12);//x,y NEW GAME
			g.drawImage(handFlag,86,55,imgLT);//x-0.y-70
			g.setClip(5,182,100,30);
			g.drawString("从头开始游戏。",10,182,imgLT);
		}
	}

	private void drawMenuCopyData(Graphics g)
	{	
		g.setFont(lagerFace);
		g.setColor(0xFFffffff);
		g.setClip(0,0,screenWidth,screenHeight);
		g.drawImage(menuBack,0,0,imgLT);
		g.drawImage(copyData,0,0,imgLT);
		if(!isCopySure)
		{
			g.setClip(80+handSpeed[handFrame]+gameSelect*22,40,20,10);
			g.drawImage(handFlag,80+handSpeed[handFrame]+gameSelect*25,40,imgLT);
			handFrame++;
			handFrame %= handSpeed.length;
			g.setClip(0,152,170,30);
			if(isCopy)
			{
				g.drawString("请选择复制位置。",10,152,imgLT);
			}
			else
			{
				g.drawString("请选择要复制的存档。",10,152,imgLT);
			}
		}
		else
		{
			flashSpeed++;
			flashSpeed %= 2;
			if(flashSpeed == 0)//手指指示闪动
			{
				g.setClip(80+gameSelect*22,40,20,10);
				g.drawImage(handFlag,80+gameSelect*22,40,imgLT);
			}
			g.setClip(8+handSpeed[handFrame]+isNot*70,166,20,10);
			g.drawImage(handFlag,8+handSpeed[handFrame]+isNot*70,166,imgLT);
			handFrame++;
			handFrame %= handSpeed.length;
			g.setClip(0,132,180,50);
			g.drawString("要复制这个存档?",3,146,imgLT);
			g.drawString("是",30,162,imgLT);
			g.drawString("否",100,162,imgLT);
		}
		drawFire(g,(short)(1),(short)(30),(byte)73);
	}
	private void drawMenuDeleteData(Graphics g)
	{
		g.setFont(lagerFace);
		g.setColor(0xFFffffff);
		g.setClip(0,0,screenWidth,screenHeight);
		g.drawImage(menuBack,0,0,imgLT);
		g.drawImage(deleteData,0,0,imgLT);
		drawFire(g,(short)33,(short)-2,(byte)97);
		if(isDelete)
		{
			if(rmsExist[deleIndex])//进入下标选择保证DATA绘制
			{
				g.setClip(15,65,100,26);//x,y
				g.drawImage(handFlag,15,36,imgLT);//x-0,y-29
			}
			else
			{
				g.setClip(35,66,56,13);//x,y
				g.drawImage(handFlag,35,10,imgLT);//x-0,y-56
			}
			flashSpeed++;
			flashSpeed %= 2;
			if(flashSpeed == 0)//手指指示闪动
			{
				g.setClip(55+gameSelect*32,140,20,10);
				g.drawImage(handFlag,55+gameSelect*32,140,imgLT);
			}
			g.setClip(8+handSpeed[handFrame]+isNot*70,198,20,10);
			g.drawImage(handFlag,8+handSpeed[handFrame]+isNot*70,198,imgLT);
			handFrame++;
			handFrame %= handSpeed.length;
			g.setClip(0,175,180,50);
			g.drawString("要删除这个存档?",5,179,imgLT);
			g.drawString("是",30,194,imgLT);
			g.drawString("否",100,194,imgLT);
		}
		else
		{
			g.setClip(55+handSpeed[handFrame]+gameSelect*32,140,20,10);
			g.drawImage(handFlag,55+handSpeed[handFrame]+gameSelect*32,140,imgLT);
			handFrame++;
			handFrame %= handSpeed.length;
			if(rmsExist[gameSelect])
			{
				g.setClip(15,65,100,26);//x,y
				g.drawImage(handFlag,15,36,imgLT);//x-0,y-29
			}
			else
			{
				g.setClip(35,66,56,13);//x,y
				g.drawImage(handFlag,35,10,imgLT);//x-0,y-56
			}

⌨️ 快捷键说明

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