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

📄 gamemain.java

📁 一款新手改造的J2me手机游戏项目
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	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 + -