📄 gamemain.java
字号:
public void showMenu()
{
if(mbg!=null&&cur!=null)
{
//mg.drawRGB(convertToAlpha(mbg), 0, mbg.getWidth(), 0, 0, mbg.getWidth(), mbg.getHeight(), true);
mg.drawImage(mbg,(GameMIDlet.SCREEN_WIDTH-mbg.getWidth())/2, (GameMIDlet.SCREEN_HEIGHT-mbg.getHeight())/2, 0);
mg.drawImage(cur, 125-curindex*33, 40, 0);
}
flushGraphics();
}
//主角精灵的碰撞检测
public boolean adjustAndCollision(int dir)
{
boolean tmp=false;
switch(dir)
{
case EAST:
if(role.getRefPixelX()-role.spriteWidth/2+GameMIDlet.MOVE_ROLESPEED>GameMIDlet.XTLINE)
tmp=true;
break;
case WEST:
if(role.getRefPixelX()-role.spriteWidth/2-GameMIDlet.MOVE_ROLESPEED<GameMIDlet.XBLINE)
tmp=true;
break;
case SOUTH:
if(role.getRefPixelY()+GameMIDlet.MOVE_ROLESPEED>GameMIDlet.SCREEN_HEIGHT)//该值在支持地图转动时需修改
tmp=true;
break;
case NORTH:
if(role.getRefPixelY()-GameMIDlet.MOVE_ROLESPEED<0)//该值在支持地图转动时需修改
tmp=true;
break;
}
return tmp;
}
protected void keyReleased(int keyCode)
{
//System.out.println("keyRelease key");
role.resume();
isStand=true;
boolean bAction=false;
switch(keyCode)
{
case GameCanvas.KEY_NUM2:
isMove=false;
isUp=false;
break;
case GameCanvas.KEY_NUM6:
isMove=false;
isRight=false;
break;
case GameCanvas.KEY_NUM8:
isMove=false;
isDown=false;
break;
case GameCanvas.KEY_NUM4:
isMove=false;
isLeft=false;
break;
case GameCanvas.KEY_NUM5:
break;
default:
bAction=true;
}
if(bAction)
{
switch(getGameAction(keyCode))
{
case GameCanvas.UP:
isMove=false;
isUp=false;
break;
case GameCanvas.DOWN:
isMove=false;
isDown=false;
break;
case GameCanvas.LEFT:
isMove=false;
isLeft=false;
break;
case GameCanvas.RIGHT:
isMove=false;
isRight=false;
break;
}
}
}
//npc精灵部分
//产生enemy的条件
public void createNPCCondition()
{
//System.out.println(role.getRefPixelY());
//System.out.println(GameMIDlet.SCREEN_HEIGHT/2);
//System.out.println("createNPCCondition函数调用");
if(role.getRefPixelY()>GameMIDlet.SCREEN_HEIGHT/2&&role.getRefPixelY()<GameMIDlet.SCREEN_HEIGHT)
{
//System.out.println("test1");
if(enemy==null)
{
enemy=createNPC();
if(enemy!=null)
initNPCPosition(enemy);
}
}
if(role.getRefPixelY()>GameMIDlet.SCREEN_HEIGHT&&role.getRefPixelY()<GameMIDlet.SCREEN_HEIGHT*3/2)
{
if(enemy==null)
{
enemy=createNPC();
if(enemy!=null)
initNPCPosition(enemy);
}
}
}
//敌人精灵产生函数
public MySprite createNPC()
{
System.out.println("createNPC函数");
MySprite tmp=null;
int npcNameStyle=rd.nextInt(4)+2;
try
{
switch(npcNameStyle)
{
case MySprite.NPC_CB:
tmp=new MySprite(Image.createImage(GameMIDlet.PATH_CB_STAND),MySprite.NPC_CB_SPWIDTH,MySprite.NPC_CB_SPHEIGHT,MySprite.NPC_CB);
break;
case MySprite.NPC_DB:
tmp=new MySprite(Image.createImage(GameMIDlet.PATH_DB_STAND),MySprite.NPC_DB_SPWIDTH,MySprite.NPC_DB_SPHEIGHT,MySprite.NPC_DB);
break;
case MySprite.NPC_TM:
tmp=new MySprite(Image.createImage(GameMIDlet.PATH_TM_STAND),MySprite.NPC_TM_SPWIDTH,MySprite.NPC_TM_SPHEIGHT,MySprite.NPC_TM);
break;
case MySprite.NPC_ZL:
tmp=new MySprite(Image.createImage(GameMIDlet.PATH_ZL_STAND),MySprite.NPC_ZL_SPWIDTH,MySprite.NPC_ZL_SPHEIGHT,MySprite.NPC_ZL);
break;
}
}catch(IOException e)
{
e.printStackTrace();
}
return tmp;
}
// 初始化npc精灵的初始位置
public void initNPCPosition(MySprite ms)
{
System.out.println("initNPCPosition函数");
int rondomX=rd.nextInt(GameMIDlet.XTLINE-GameMIDlet.XBLINE);//npc随机出现的宽度值
ms.setRefPixelPosition(GameMIDlet.XTLINE+ms.spriteWidth/2-rondomX, GameMIDlet.SCREEN_HEIGHT+ms.spriteHeight/2);
}
//enemy精灵逻辑处理
public void enemyLogic()
{
createNPCCondition();
opStrategy();
}
//AI状态决策
public void opStrategy()
{
if(enemy!=null&&isEnemyStand)
{
int wcando=rd.nextInt(100);//站立状态下转换其他状态的概率,50%转换状态
if(wcando<50&&standCount==0)
{
System.out.println("opStrategy::x_distance:"+enemy.getXDistanceFromSprite(role));
System.out.println("opStrategy::y_distance:"+enemy.getYDistanceFromSprite(role));
if(Math.abs(enemy.getXDistanceFromSprite(role))>10||Math.abs(enemy.getYDistanceFromSprite(role))>10)//x,y轴两精灵相距达10像素时,70%移动,30%攻击
{
int canOp=rd.nextInt(100);
if(canOp>30)//70%移动
{
isEnemyMove=true;
isEnemyStand=false;
int level=70;
int dirsel=rd.nextInt(100);
if(Math.abs(enemy.getRefPixelX()-role.getRefPixelX())>(Math.abs(enemy.getRefPixelY()-role.getRefPixelY())-40))//比较两精灵x,y轴向距离,距离大的70%优先
{
level=30;
}
if(dirsel>level)//x轴向移动状态
{
isEnemyXMove=true;
isEnemyAttack=false;
stepCount=6;
}
else//y轴向移动状态
{
isEnemyYMove=true;
isEnemyAttack=false;
stepCount=8;
}
}
else//30%攻击
{
isEnemyAttack=true;
isEnemyStand=false;
isEnemyMove=false;
}
System.out.println("opStrategy::isEnemyMove:"+isEnemyMove);
System.out.println("x:"+isEnemyXMove+" "+"y:"+isEnemyYMove);
System.out.println("opStrategy::isEnemyAttack:"+isEnemyAttack);
System.out.println("opStrategy::isEnemyStand:"+isEnemyStand);
}
else//根据距离,50%攻击
{
int canOp=rd.nextInt(100);
if(canOp>50)
{
isEnemyAttack=true;
isEnemyStand=false;
isEnemyMove=false;
}
else
{
isEnemyAttack=false;
isEnemyStand=true;
isEnemyMove=false;
}
System.out.println("opStrategy::isEnemyMove:"+isEnemyMove);
System.out.println("opStrategy::isEnemyAttack:"+isEnemyAttack);
System.out.println("opStrategy::isEnemyStand:"+isEnemyStand);
}
}
else//站立时状态维持standCount次,防止过快改变状态
{
if(standCount==0)
standCount=8;
enemy.resume();
eframe++;
enemy.setFrame((eframe)%enemy.getFrameSequenceLength());
if(standCount!=0)
standCount--;
}
}
}
//精灵状态间形态变化
public void showEnemyAni()
{
if(!isEnemyStand&&enemy!=null)
{
//System.out.println("showEnemyAni函数调用");
if(isEnemyMove)
{
enemy.changeToWalkSprite();
if(isEnemyXMove&&stepCount>0)
{
if((enemy.getRefPixelX()-role.getRefPixelX())>0)
{
if(!enemyAdjustAndCollision(WEST))
enemy.setRefPixelPosition(enemy.getRefPixelX()-GameMIDlet.MOVE_SPEED, enemy.getRefPixelY());
}
else
{
if(!enemyAdjustAndCollision(EAST))
enemy.setRefPixelPosition(enemy.getRefPixelX()+GameMIDlet.MOVE_SPEED, enemy.getRefPixelY());
}
stepCount--;
if(stepCount==0)
{
isEnemyStand=true;
isEnemyMove=false;
isEnemyXMove=false;
}
eframe++;
}
else if(isEnemyYMove&&stepCount>0)
{
if((enemy.getRefPixelY()-role.getRefPixelY())>0)
{
if(!enemyAdjustAndCollision(NORTH))
enemy.setRefPixelPosition(enemy.getRefPixelX(), enemy.getRefPixelY()-GameMIDlet.MOVE_SPEED);
}
else
{
if(!enemyAdjustAndCollision(SOUTH))
enemy.setRefPixelPosition(enemy.getRefPixelX(), enemy.getRefPixelY()+GameMIDlet.MOVE_SPEED);
}
stepCount--;
if(stepCount==0)
{
isEnemyStand=true;
isEnemyMove=false;
isEnemyYMove=false;
}
eframe++;
}
enemy.setFrame((eframe)%enemy.getFrameSequenceLength());
}
else if(isEnemyAttack)
{
if(attCount==0)
attCount=enemy.getFrameSequenceLength();
enemy.changeToAttackSprite();
attCount--;
if(attCount==0)
{
isEnemyAttack=false;
isEnemyStand=true;
isEnemyMove=false;
}
enemy.setFrame((eframe++)%enemy.getFrameSequenceLength());
}
}
else
{
if(enemy!=null)
{
enemy.resume();
enemy.setFrame(((eframe++)/2)%enemy.getFrameSequenceLength());
}
}
}
/**
* 敌人精灵碰撞检测
* @param dir 方向
* @return
*/
public boolean enemyAdjustAndCollision(int dir)
{
boolean tmp=false;
switch(dir)
{
case EAST:
if(enemy.getRefPixelX()-enemy.spriteWidth/2+GameMIDlet.MOVE_SPEED>GameMIDlet.XTLINE)
tmp=true;
break;
case WEST:
if(enemy.getRefPixelX()-enemy.spriteWidth/2-GameMIDlet.MOVE_SPEED<GameMIDlet.XBLINE)
tmp=true;
break;
case SOUTH:
if(enemy.getRefPixelY()+GameMIDlet.MOVE_SPEED>GameMIDlet.SCREEN_HEIGHT)//该值在支持地图转动时需修改
tmp=true;
break;
case NORTH:
if(enemy.getRefPixelY()-GameMIDlet.MOVE_SPEED<0)//该值在支持地图转动时需修改
tmp=true;
break;
}
return tmp;
}
//设置敌人精灵面向主角
public void setEnemyFTF()
{
if(enemy.getRefPixelY()>role.getRefPixelY())
{
enemy.setTransform(Sprite.TRANS_MIRROR_ROT180);
} else
{
enemy.setTransform(Sprite.TRANS_NONE);
}
}
//地图卷动判断函数
public void detectRollMap()
{
if(!isMapRoll)
{
if(enemy!=null)
{
enemy.setRefPixelPosition(enemy.getRefPixelX(), enemy.getRefPixelY()-enemyXiuZheng);
enemyXiuZheng=0;
}
}
/*if(role.getRefPixelY()>GameMIDlet.SCREEN_HEIGHT/2&&role.getRefPixelY()<GameMIDlet.SCREEN_HEIGHT*3/2)
{
isMapRoll=true;
}
if()*/
}
//扩展功能,菜单透明化
public int[] convertToAlpha(Image in)
{
int[] buff=new int[in.getWidth()*in.getHeight()];
in.getRGB(buff, 0, in.getWidth(), 0, 0, in.getWidth(), in.getHeight());
for(int i=0;i<buff.length;i++)
{
buff[i]=(buff[i]&0x00ffff)|0xb40000;
}
return buff;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -