📄 castlecanvas.java
字号:
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 + -