📄 castlevania_canvas.java
字号:
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
public class Castlevania_Canvas extends Canvas implements Runnable{
public Castlevania_Canvas() {
setFullScreenMode(true);//设置全屏
bufferImage=Image.createImage(176,208);
new Thread(this).start();//启动线程
}
public void run() {
long begin;//用来记录临时时间
while(!isRunning){
// System.out.println(Runtime.getRuntime().totalMemory());
begin = System.currentTimeMillis();//获得系统时间
gameLoop();//整个游戏的逻辑部分
repaint();//重新刷新屏幕
serviceRepaints();//强制线程重新刷新屏幕
while(System.currentTimeMillis() - begin < 60);
//为保证线程每次刷新一样,为0.1秒1次(1秒10次)
}
}
protected static boolean isRunning;//线程标记
protected static final int SCREEN_WIDTH=176;//屏幕宽度
protected static final int SCREEN_HEIGHT=208;//屏幕高度
//游戏状态集
protected static byte iGameState;//当前游戏状态标记
//以下是游戏基本状态集
protected final static byte GS_LOGO = 0;
protected final static byte GS_MENU1= 1;
protected final static byte GS_MENU2=2;
protected final static byte GS_CONTINUE = 3;
protected final static byte GS_HELP = 4;
protected final static byte GS_EXIT=5;
protected final static byte GS_LOADGAME=6;
protected final static byte GS_GAME = 7;
//按键状态集
protected static int keyCode;//记录按键值
protected static int keyState;//当前的按键状态;
//常量
protected static Image logo;
protected static Image t1;
static int r;
static int a;
static int iCount;
String str[]={"新游戏","继续游戏","游戏帮助","退出游戏"};
static boolean isok;
Engine engine;
Image bufferImage = null;
protected final void gameLoop(){//主逻辑处理部分
switch(iGameState){
case GS_LOGO:
if(logo==null){
try {
logo=Image.createImage("/logo.png");
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
iCount++;
if(iCount>=20){
setGameState(GS_MENU1);
}
break;
case GS_MENU1:
if(t1==null){
try {
t1=Image.createImage("/t1.png");
isok=true;
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
if(iCount<6){
iCount++;
}else{
iCount=0;
}
break;
case GS_MENU2:
break;
case GS_GAME:
engine.runGame();
break;
case GS_LOADGAME:
if(iCount<6){
iCount++;
}else{
iCount=0;
}
if(o>=2){
o-=2;
if(o==60){
engine=new Engine();
}else if(o==20){
engine.init();
}
}else{
isok=true;
}
break;
}
}
protected void paint(Graphics g) {//屏幕显示部分
Graphics old=g;
if(bufferImage!=null){
g=bufferImage.getGraphics(); //将bufferImage的Graphics对象赋给g
}
drawClearScreen(g,0XFFFFFF);
switch(iGameState){//根据不同状态显示不同内容
case GS_LOGO:
drawLogo(g);
break;
case GS_MENU1:
drawMenu(g);
break;
case GS_GAME:
engine.drawGame(g);
break;
case GS_LOADGAME:
drawLoadingScreen(g);
break;
}
if(g!=old){ //要是图片已经发生改变则将缓冲区图片一次性画到屏幕上去
old.drawImage(bufferImage,0,0,Graphics.LEFT|Graphics.TOP);
}
}
//各种方法//
public void drawClearScreen ( Graphics g , int Color ) { //清屏
g.setClip( 0 , 0 , SCREEN_WIDTH , SCREEN_HEIGHT ) ;
g.setColor( Color ) ;
g.fillRect( 0 , 0 , SCREEN_WIDTH , SCREEN_HEIGHT) ;
}
public void drawLogo(Graphics g){ //画LOGO
if(logo!=null){
g.drawImage(logo,SCREEN_WIDTH/2,SCREEN_HEIGHT/2,g.VCENTER|g.HCENTER);
}
}
// public void drawBlind(Graphics g){ // 画矩形效果
// g.setColor(0x000000);
// for(int i=0;i<11;i++){
// for(int j=0;j<13;j++){
// g.fillRect(16/2-r/2+i*16,16/2-r/2+j*16,r,r);
// }
// }
// }
public void drawMenu(Graphics g){
if(t1!=null){
g.drawImage(t1,0,0,0);
g.setColor(0xffffff);
g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_PLAIN,Font.SIZE_SMALL));
g.drawString("2008 ABCDEFGHIFJKIL",Tools.SCREEN_WIDTH/2,Tools.SCREEN_HEIGHT+48,g.HCENTER|g.BASELINE);
g.setColor(0xfffff0);
if(isok){
if(iCount>3){
g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM));
g.drawString("按确定键开始",Tools.SCREEN_WIDTH/2,Tools.SCREEN_HEIGHT+20,g.HCENTER|g.BASELINE);
}
}else{
GameUI.drawString(g,Tools.SCREEN_WIDTH/2,Tools.SCREEN_HEIGHT+20,"< "+str[r]+" >");
}
}
}
//画进度界面
public boolean drawLoadingScreen(Graphics g){
g.setColor(0x000000);
g.fillRect(0,0,176,208);
GameUI.drawRect(g,0,1,175,206,0);
GameUI.drawRect(g,2,3,171,202,1);
// g.setColor(158,79,7);
// g.drawArc(10,10,120,120,0,360);
drawSPLASH(g);
GameUI.drawString(g,Tools.SCREEN_WIDTH/2,30,"4/6:移动");
GameUI.drawString(g,Tools.SCREEN_WIDTH/2,50,"2:跳跃");
GameUI.drawString(g,Tools.SCREEN_WIDTH/2,70,"5:攻击");
GameUI.drawString(g,Tools.SCREEN_WIDTH/2,90,"8:下蹲");
GameUI.drawString(g,Tools.SCREEN_WIDTH/2,110,"0:法术");
return false;
}
//画进度条
int o=96;
public void drawSPLASH(Graphics g){
if(isok){
if(iCount>3){
GameUI.drawString(g,Tools.SCREEN_WIDTH/2,157,"按任意键开始");
}
}else{
g.setColor(149,117,13);
g.drawRoundRect(20+18,150,100,9,4,4);
g.setColor(40,40,40);
g.drawLine(22+18,152,98+38,152);
g.setColor(102,102,102);
g.drawLine(22+18,153,98+38,153);
g.setColor(153,153,153);
g.drawLine(22+18,154,98+38,154);
g.setColor(141,141,141);
g.drawLine(22+18,155,98+38,155);
g.setColor(72,72,72);
g.drawLine(22+18,156,98+38,156);
g.setColor(57,57,57);
g.drawLine(22+18,157,98+38,157);
g.setColor(236,87,0);
g.drawLine(22+18,152,98+38-o,152);
g.setColor(236,135,0);
g.drawLine(22+18,153,98+38-o,153);
g.setColor(236,192,121);
g.drawLine(22+18,154,98+38-o,154);
g.setColor(236,178,91);
g.drawLine(22+18,155,98+38-o,155);
g.setColor(236,135,0);
g.drawLine(22+18,156,98+38-o,156);
g.setColor(236,98,0);
g.drawLine(22+18,157,98+38-o,157);
}
}
//画帮助界面
public void drawHelp(Graphics g){
}
//............................
protected static final void getKeyState(){//获得单前的按键状态
keyState = keyCode;
}
protected void keyPressed(int keys){//按键按下的处理部分
keyCode = getGameAction(keys);
switch(iGameState){
case GS_MENU1:
switch(keyCode){
case Canvas.FIRE:
if(r==0&&!isok){
setGameState(GS_LOADGAME);
}
isok=false;
break;
case Canvas.LEFT:
if(!isok){
r--;
}
if(r<=-1){
r=3;
}
break;
case Canvas.RIGHT:
if(!isok){
r++;
}
if(r>=4){
r=0;
}
break;
}
break;
case GS_LOADGAME:
if(isok)
setGameState(GS_GAME);
break;
case GS_GAME:
if(engine.isok==true){
if(engine != null){
if(engine.role != null){
engine.role.keyPressed(keyCode);}
break;
};
break;
}
}
}
protected void keyReleased(int keys){//按键松开的处理
keyCode = 0;
switch(iGameState){
case GS_GAME:
if(engine.isok==true){
if(engine != null){
if(engine.role != null)
engine.role.keyReleased(getGameAction(keys));
}
break;
}
}
}
protected static final void setGameState(byte nowState){//利用此方法来切换状态
switch (nowState) {
case GS_LOGO: //GS_LOGO状态下初始化的数据
iCount = 0;
r=0;
break;
case GS_MENU1:
iCount = 0;
r=0;
break;
case GS_LOADGAME:
iCount = 0;
r=0;
isok=false;
break;
case GS_GAME:
break;
}
iGameState = nowState;//设置当前的游戏状态为参数nowState值
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -