📄 gamemain.java
字号:
package com.ejoy;
//Download by http://www.codefans.net
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.*;
public class GameMain extends GameCanvas implements Runnable
{
public MySprite role=null;//主角精灵,默认为站立
public MySprite enemy=null;//敌人精灵,默认为站立
//主角精灵各状态图片
public Image standimg;//精灵站立图片
public Image walkimg;//精灵行走图片
public Image attackimg;//精灵攻击图片
//地图状态及数据
public boolean isMapRoll=false;//地图卷动状态
public int mapY=0;//地图卷动y坐标偏移值
private Image bg;//地图图片
private Image mbg;//菜单图片
private Image cur;//箭头图片
public int curindex=0;
public Graphics mg;
public Thread cThread;
public boolean isRunning;
public int enemyXiuZheng=0;//地图卷动时,敌人精灵的位移修正值
//游戏中各种状态
public boolean isNormalThread=true;//游戏正常进程
//-------------role状态----------------
public boolean isStand=true;//是否是站立状态
public boolean isforward=true;//是否是向前
public int currentFrame=0;
public boolean isMove=false;
public boolean isUp=false;
public boolean isDown=false;
public boolean isLeft=false;
public boolean isRight=false;
public boolean isFire=false;
//-------------enemy状态-------------
public boolean isEnemyMove=false;//是否为移动状态
public boolean isEnemyXMove=false;//是否在x轴上移动
public boolean isEnemyYMove=false;//是否在y轴上移动
public boolean isEnemyStand=true;//是否站立状态
public boolean isEnemyAttack=false;//是否是攻击状态
public int attCount=0;//攻击频率控制
public int eframe=0;//敌人移动精灵当前帧
public int stepCount=0;//移动步数,防止频繁改变方向
public int standCount=0;//站立延时
private GameMIDlet m_gmid;
//------------------方向----------------------
public final static int EAST=0;
public final static int WEST=1;
public final static int SOUTH=2;
public final static int NORTH=3;
//随机对象
public Random rd;
//游戏中菜单状态
public boolean isGamingMenuShow=false;
//音乐管理器
public AVManager av;
public GameMain(GameMIDlet gm,int spName)
{
super(false);
m_gmid=gm;
mg=getGraphics();
isRunning=true;
rd=new Random();
setFullScreenMode(true);
try
{
if(spName==MySprite.ROLE_DC)
{
role=new MySprite(Image.createImage(GameMIDlet.PATH_DC_STAND),54,72,spName);
role.setRefPixelPosition(GameMIDlet.SCREEN_WIDTH/2, role.spriteHeight);//设置主角初始位置
}
if(spName==MySprite.ROLE_ZF)
{
role=new MySprite(Image.createImage(GameMIDlet.PATH_ZF_STAND),60,108,spName);
role.setRefPixelPosition(GameMIDlet.SCREEN_WIDTH/2, role.spriteHeight);//设置主角初始位置
}
bg=Image.createImage(GameMIDlet.PATH_GAME_BG);
mbg=Image.createImage(GameMIDlet.PATH_GMENU);
cur=Image.createImage(GameMIDlet.PATH_CUR);
}
catch(IOException e)
{
e.printStackTrace();
}
av=new AVManager(m_gmid);
av.createPlayer("/res/bg_2.mid", AVManager.MEDIA_TYPE_MIDI);
av.init();
av.play();
System.out.println("GameMain构造函数!");
}
//主角精灵逻辑处理
public void roleLogic()
{
if(isStand)
role.setFrame((currentFrame++)%role.getFrameSequenceLength());
else if(isMove)
{
if(isUp)
{
//isStand=false;
role.changeToWalkSprite();
if(!adjustAndCollision(NORTH))
{
role.setRefPixelPosition(role.getRefPixelX(), role.getRefPixelY()-GameMIDlet.MOVE_ROLESPEED);
}
if(isforward)
{
role.setTransform(Sprite.TRANS_MIRROR_ROT180);
isforward=false;
}
currentFrame++;
}
else if(isDown)
{
//isStand=false;
role.changeToWalkSprite();
if(!adjustAndCollision(SOUTH))
{
role.setRefPixelPosition(role.getRefPixelX(), role.getRefPixelY()+GameMIDlet.MOVE_ROLESPEED);
if(!isMapRoll)
{
if(mapY+GameMIDlet.MOVE_ROLESPEED<GameMIDlet.MAPHEIGHT-GameMIDlet.SCREEN_HEIGHT)
{
mapY+=GameMIDlet.MOVE_ROLESPEED;
enemyXiuZheng+=GameMIDlet.MOVE_ROLESPEED;
}
}
}
if(!isforward)
{
role.setTransform(Sprite.TRANS_NONE);
isforward=true;
}
currentFrame++;
}
else if(isLeft)
{
role.changeToWalkSprite();
if(!adjustAndCollision(WEST))
role.setRefPixelPosition(role.getRefPixelX()-GameMIDlet.MOVE_ROLESPEED, role.getRefPixelY());
role.setFrame((currentFrame++)%role.getFrameSequenceLength());
//currentFrame++;
}
else if(isRight)
{
role.changeToWalkSprite();
if(!adjustAndCollision(EAST))
role.setRefPixelPosition(role.getRefPixelX()+GameMIDlet.MOVE_ROLESPEED, role.getRefPixelY());
role.setFrame((currentFrame++)%role.getFrameSequenceLength());
//currentFrame++;
}
role.setFrame((currentFrame)%role.getFrameSequenceLength());
} else if(isFire)
{
System.out.println("play animation");
role.changeToAttackSprite();
role.setFrame((currentFrame++)%role.getFrameSequenceLength());
}
}
//游戏主类画布画画函数
public void run()
{
while(isRunning)
{
if(isNormalThread)
{
long lastTime=System.currentTimeMillis();
mg.setColor(0x666666);
mg.fillRect(0, 0,getWidth() /*GameMIDlet.SCREEN_WIDTH*/, GameMIDlet.SCREEN_HEIGHT);
mg.drawImage(bg, 0, -mapY, 0);
roleLogic();
enemyLogic();
showEnemyAni();
detectRollMap();
//---begin----判断精灵之间的覆盖问题
if(enemy==null);
role.paint(mg);
if(enemy!=null)
{
setEnemyFTF();
if(role.getRefPixelX()-role.spriteWidth/2<enemy.getRefPixelX()-enemy.spriteWidth/2)
{
enemy.paint(mg);
role.paint(mg);
}
else
{
role.paint(mg);
enemy.paint(mg);
}
}
//------------end----------
flushGraphics();
long currentTime=System.currentTimeMillis();
int esp=(int)(currentTime-lastTime);
if(esp<1000/GameMIDlet.FPS)
{
try
{
Thread.sleep(1000/GameMIDlet.FPS-esp);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
else if(isGamingMenuShow)
{
showMenu();
}
}
}
protected void keyPressed(int keyCode)
{
boolean bAction=false;
if(!isGamingMenuShow)
{
switch(keyCode)
{
case GameCanvas.KEY_NUM2://游戏界面中左
isMove=true;
isStand=false;
isUp=true;
break;
case GameCanvas.KEY_NUM6://游戏界面中上
isMove=true;
isStand=false;
isRight=true;
break;
case GameCanvas.KEY_NUM8://游戏界面中右
isMove=true;
isStand=false;
isDown=true;
break;
case GameCanvas.KEY_NUM4://游戏界面中下
isMove=true;
isStand=false;
isLeft=true;
break;
case GameCanvas.KEY_NUM5://确定
isFire=true;
isStand=false;
isMove=false;
break;
case GameCanvas.KEY_POUND://调出游戏中菜单
isNormalThread=false;
isGamingMenuShow=true;
break;
case GameCanvas.KEY_STAR:
break;
default:
bAction=true;
}
if(bAction)
{
switch(getGameAction(keyCode))
{
case GameCanvas.DOWN://游戏界面中右
isMove=true;
isStand=false;
isDown=true;
break;
case GameCanvas.UP://游戏界面中左
isMove=true;
isStand=false;
isUp=true;
break;
case GameCanvas.LEFT://游戏界面中下
isMove=true;
isStand=false;
isLeft=true;
break;
case GameCanvas.RIGHT://游戏界面中上
isMove=true;
isStand=false;
isRight=true;
break;
case GameCanvas.FIRE:
isFire=true;
isStand=false;
isMove=false;
break;
}
}
}
else//菜单选择的按键事件
{
switch(keyCode)
{
case GameCanvas.KEY_NUM6://上移菜单项
if(curindex!=0)
curindex--;
case GameCanvas.KEY_NUM4://下移菜单项
if(curindex!=3)
curindex++;
case GameCanvas.KEY_NUM5://确定
switch(curindex)
{
case 0:
isNormalThread=true;
isGamingMenuShow=false;
break;
case 1:
av.releaseMediaResource();
break;
case 2:
break;
case 3:
try
{
m_gmid.exit();
}
catch(Exception e)
{
e.printStackTrace();
}
break;
}
default:
bAction=true;
if(bAction)
{
switch(getGameAction(keyCode))
{
case GameCanvas.LEFT:
if(curindex!=3)
curindex++;
break;
case GameCanvas.RIGHT:
if(curindex!=0)
curindex--;
break;
case GameCanvas.FIRE:
switch(curindex)
{
case 0:
isNormalThread=true;
isGamingMenuShow=false;
break;
case 1:
av.releaseMediaResource();
break;
case 2:
break;
case 3:
try
{
m_gmid.exit();
}
catch(Exception e)
{
e.printStackTrace();
}
break;
}
break;
}
}
}
}
}
/**
* 游戏中菜单
* @param g 菜单画笔
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -