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

📄 enemy.java

📁 实现了 移动 碰撞检测
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
			break;
		case ship28: //船
			spriteY = 40;
			setHP(10);
			width = 95;
			height = 63;
			this.collisionW = 20;
			this.collisionH = 20;
			collisionX = spriteX + 30;
			collisionY = spriteY + 25;
			execution = 5;
			randomTime = 4;
			enemyState = Enemy.STA_SPUER;
			nextState = enemyState;
			changeState(enemyState);
			break;
		}
		spriteY = spriteY - gameworld.positionY;
		collisionY = collisionY - gameworld.positionY;
	}

	/**
	 * 根据精灵状态播放动画帧
	 * 
	 * @return 所有动画播放完后返回true 否则返回false
	 */
	final boolean playFrame()
	{
		boolean temp = false;
		if (isChangeState)
		{ //状态已经改变
			this.currentFrame = tempFrame; //设置起始帧
			this.totalFrame = tempTotalFrame; //设置结束帧
			isChangeState = false;
		}
		if (this.spriteType == 1)
		{ //静止的步兵动画帧播放
			switch (enemyState)
			{
			case STA_DEAD: //死亡
				if (spriteType == 1)
				{
					currentFrame++;
					if (currentFrame > totalFrame)
					{
						temp = true;
					}
				}
				break;
			case STA_FIRE://动作触发后每隔一秒射击一次
				frameSpace += System.currentTimeMillis() - lastTime;
				movedTimes += System.currentTimeMillis() - lastTime;
				if (frameSpace >= 50)
				{
					gameworld.isKillHP = true;
					frameSpace = 0;
					if (movedTimes >= 1000)
					{
						movedTimes = 0;
						action();
					}
				}
				//移动的敌人如果超出了边界自动消失
				if (this.spriteX >= gameworld.screenWidth - gameworld.offsetX
						|| this.spriteX <= Math.abs(gameworld.offsetX) - this.width)
				{
					this.visible = false;
					gameworld.enemyCount--;
				}
				break;
			case STA_REST://静止
				temp = true;
				//移动的敌人如果超出了边界自动消失
				if (this.spriteX >= gameworld.screenWidth - gameworld.offsetX
						|| this.spriteX <= Math.abs(gameworld.offsetX) - this.width)
				{
					this.visible = false;
					gameworld.enemyCount--;
				}
				break;
			}
			return temp;
		}

		if (this.spriteType == tank2)
		{//坦克
			switch (enemyState)
			{
			case STA_GO_RIGHT: //向右移动
				frameSpace += System.currentTimeMillis() - lastTime;
				movedTimes += System.currentTimeMillis() - lastTime;
				if (frameSpace >= 2500)
				{
					frameSpace = 0;
					if (currentFrame >= totalFrame && movedTimes >= moveTime)
					{
						temp = true;
						nextState = STA_TURN_HEAD; //掉转炮头
					} else
					{
						if (currentFrame >= totalFrame)
						{
							currentFrame = tempFrame;
						}
						currentFrame += 1;
						move(5, 0);
						temp = false;
					}
				}
				break;
			case STA_DEAD://死亡
				frameSpace += System.currentTimeMillis() - lastTime;
				if (frameSpace >= 150)
				{
					frameSpace = 0;
					currentFrame++;
					if (currentFrame > totalFrame)
					{
						temp = true;
					}
				}
				break;
			case STA_FIRE://攻击
				frameSpace += System.currentTimeMillis() - lastTime;
				this.movedTimes += System.currentTimeMillis() - lastTime;
				if (movedTimes >= 1400)
				{//坦克的攻击频率是2秒/次
					if (frameSpace >= 150)
					{//子弹动画有3帧,因此每帧150
						frameSpace = 0;
						currentFrame++;
						if (currentFrame > totalFrame)
						{
							action();
							movedTimes = 0;
							currentFrame = tempFrame;
							nextState = Enemy.STA_FIRE_END;
							temp = true;
							gameworld.isKillHPBom = true;
						}
					}
				}
				break;
			case STA_REST://静止
				temp = true;
				break;
			case STA_TURN_HEAD://掉转炮头
				frameSpace += System.currentTimeMillis() - lastTime;
				if (frameSpace >= 1000)
				{
					frameSpace = 0;
					if (currentFrame >= totalFrame)
					{
						temp = true;
					} else
					{
						currentFrame += 1;
						temp = false;
					}
				}
				break;
			case STA_FIRE_END://炮弹爆破
				frameSpace += System.currentTimeMillis() - lastTime;
				if (frameSpace >= 200)
				{
					frameSpace = 0;
					currentFrame++;
					if (currentFrame > totalFrame)
					{
						temp = true;
						nextState = Enemy.STA_FIRE;
					}
				}
				break;
			}
			return temp;
		}
		if (this.spriteType == soldier_small4 || spriteType == soldier_big5)
		{//随机出现的敌人
			switch (enemyState)
			{
			case STA_GO_RIGHT:
				frameSpace += System.currentTimeMillis() - lastTime;

				if (frameSpace >= 100)
				{//6帧/秒
					frameSpace = 0;
					currentFrame++;
					move(4, 0);
					if (currentFrame > totalFrame)
					{
						currentFrame = tempFrame;
						temp = true;
					}
				}
				break;
			case STA_DEAD://死亡
				frameSpace += System.currentTimeMillis() - lastTime;
				if (frameSpace >= 1000)
				{
					frameSpace = 0;
					temp = true;
					int tempNum = gameworld.randomNum(8);
					if (tempNum == 7)
					{
						this.init(this.spriteX, 23);
					}
				}
				break;
			case STA_FIRE://攻击
				frameSpace += System.currentTimeMillis() - lastTime;
				if (spriteType == soldier_small4)
				{//开枪
					this.movedTimes += System.currentTimeMillis() - lastTime;
					if (frameSpace >= 50)
					{
						gameworld.isKillHP = true;
						frameSpace = 0;
						if (movedTimes >= 1000)
						{
							action();
							movedTimes = 0;
							temp = true;
							isTrigger = false;
							nextState = tempState;//恢复原有的状态
						} else
						{
							currentFrame = currentFrame + 1 > totalFrame ? tempFrame
									: currentFrame + 1;
						}
					}
				} else
				{//扔雷
					if (frameSpace > 200)
					{
						frameSpace = 0;
						currentFrame++;
						if (currentFrame > totalFrame)
						{
							temp = true;
							nextState = tempState;//恢复原有的状态
							for (int i = 0; i < gameworld.allEnemy.length; i++)
							{
								if (!gameworld.allEnemy[i].visible)
								{
									gameworld.allEnemy[i].init(spriteX, 15);
									break;
								}
							}
						}
					}
				}
				break;
			case STA_GO_LEFT: //向左运动
				frameSpace += System.currentTimeMillis() - lastTime;
				if (frameSpace >= 100)
				{ //6帧/秒
					frameSpace = 0;
					currentFrame++;

					move(-4, 0);
					temp = false;
					if (currentFrame > totalFrame)
					{
						temp = true;
						currentFrame = tempFrame;
					}
				}
				break;
			}
			return temp;
		}
		if (this.spriteType == plane6)
		{ //飞机
			frameSpace += System.currentTimeMillis() - lastTime;
			switch (enemyState)
			{
			case STA_GO_RIGHT: //向右飞行
				if (frameSpace >= 100)
				{
					frameSpace = 0;
					currentFrame++;
					if (spriteX + gameworld.offsetX < 50)
						move(4, 0);
					if (currentFrame > totalFrame)
					{
						temp = true;
						currentFrame = tempFrame;
					}
				}
				if (isFire == true)
					gameworld.player.killHP(gameworld.randomNum(2));
				break;
			case STA_DEAD: //爆炸
				if (frameSpace >= 150)
				{
					frameSpace = 0;
					currentFrame++;
					if (currentFrame > totalFrame)
					{
						temp = true;
					}
				}
				break;
			}
		}
		if (spriteType == Hp9)
		{ //血瓶
			switch (enemyState)
			{
			case STA_DEAD: //被打中播放爆炸效果
				frameSpace += System.currentTimeMillis() - lastTime;
				if (frameSpace > 100)
				{
					frameSpace = 0;
					currentFrame++;
				}
				if (currentFrame > 3)
				{ //爆炸后加生命值
					if (spriteY < gameworld.screenHeight - 14)
					{
						move(0, 14);
					} else
					{
						spriteY = gameworld.screenHeight - 14;
						if (spriteX <= -gameworld.offsetX + 10)
						{
							this.visible = false;
							gameworld.player.addHP();
						} else
						{
							move(-14, 0);
						}
					}
				}
				break;
			}
			return temp;
		}
		if (spriteType == casern12)
		{//碉堡
			frameSpace += System.currentTimeMillis() - lastTime;
			switch (enemyState)
			{
			case STA_FIRE: //攻击
				if (frameSpace >= 1000)
				{
					frameSpace = 0;
					temp = true;
					action();
				}
				break;
			case STA_REST: //静止
				temp = true;
				break;
			case STA_DEAD: //
				break;
			}
		}
		if (spriteType == supersoj13)
		{//特种兵
			frameSpace += System.currentTimeMillis() - lastTime;
			switch (enemyState)
			{
			case STA_GO_RIGHT: //向右移动
				if (frameSpace >= 100)
				{ //6帧/秒
					frameSpace = 0;
					currentFrame++;
					move(6, 0);
					if (currentFrame > totalFrame)
					{
						currentFrame = tempFrame;
						temp = true;
					}
				}
				break;
			case STA_DEAD: //死亡
				if (frameSpace >= 1000)
				{
					frameSpace = 0;
					temp = true;
				}
				break;
			case STA_FIRE: //攻击
				if (frameSpace >= 1000)
				{
					frameSpace = 0;
					temp = true;
					action();
				}
				break;
			case STA_GO_LEFT: //向左移动
				if (frameSpace >= 100)
				{ //6帧/秒
					frameSpace = 0;
					currentFrame++;
					move(-6, 0);
					if (currentFrame > totalFrame)
					{
						currentFrame = tempFrame;
						temp = true;
					}
				}
				break;
			case STA_ROLL_RIGHT: //向右翻滚
				if (frameSpace >= 100)
				{ //6帧/秒
					frameSpace = 0;
					currentFrame++;
					move(15, 0);
					if (currentFrame > totalFrame)
					{
						currentFrame = 0;
						temp = true;
						nextState = Enemy.STA_FIRE;
					}
				}
				break;
			case STA_ROLL_LEFT: //向左翻滚
				if (frameSpace >= 100)
				{ //6帧/秒
					frameSpace = 0;
					currentFrame++;
					move(-15, 0);
					if (currentFrame > totalFrame)
					{
						currentFrame = 0;
						temp = true;
						nextState = Enemy.STA_FIRE;
					}
				}
				break;
			}
		}

		if (spriteType == bus14)
		{//汽车
			frameSpace += System.currentTimeMillis() - lastTime;
			switch (enemyState)
			{
			case STA_DEAD://爆炸
				if (frameSpace >= 150)
				{
					frameSpace = 0;
					currentFrame++;
					if (currentFrame > totalFrame)
					{
						temp = true;
					}
				}
				break;
			case STA_FIRE:// 子弹
				isFire = !isFire;
				if (isFire
						&& spriteX + gameworld.offsetX > -120
						&& spriteX + gameworld.offsetX < gameworld.screenWidth - 20)
				{
					//						System.out.println(isFire);
					action();
				}
				frameSpace = 0;
				currentFrame++;
				if (currentFrame > totalFrame)
				{
					temp = true;
					nextState = Enemy.STA_REST;
					changeState(Enemy.STA_REST);
				}
				break;
			case STA_REST:
				isFire = !isFire;
				temp = true;
				break;
			}
			return temp;
		}

		if (spriteType == bomb15)
		{ //敌人的手雷
			frameSpace += System.currentTimeMillis() - lastTime;
			switch (enemyState)
			{
			case STA_GO_RIGHT: //手雷被扔出
				if (frameSpace > 200)
				{
					frameSpace = 0;
					currentFrame++;
					spriteY += 10;
					if (currentFrame > totalFrame)
					{
						action();
						changeState(STA_DEAD);
					}
				}
				break;
			case STA_DEAD: //手雷爆炸
				if (frameSpace > 300)
				{
					frameSpace = 0;
					currentFrame++;
					if (currentFrame > totalFrame)
					{
						gameworld.isKillHPBom = true;
						gameworld.player.killHP(5);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -