/// <param name="attack">攻撃</param> public AttackInfo(Attack attack) { Position = attack.ModelInfo.Position; BlockPosition = attack.BlockPosition; Speed = attack.Speed; OwnerInfo = attack.OwnerInfo; }
public override void Update(Games.GameInfo gameInfo, Input input) { base.Update(gameInfo, input); //--- 自分のプレイヤー情報を更新 ---// foreach (PlayerInfo player in gameInfo.PlayerInfos) { if (PlayerIndex == player.Index) { me = player; break; } } //--- ルールベースで命令を記述 ---// foreach (PlayerInfo player in gameInfo.PlayerInfos) { // 自分の情報はスキップ if (player.Equals(me)) continue; // 敵の進行方向に自分がいるか if (isLookingThisWay(player)) { runAwayFrom(player); break; } else { // 自分の進行方向に敵がいるか if (isInADirection(player)) { Attack(); break; } else { idle(gameInfo); } } } }
private void UpdatePlayerInfo(GameInfo gameInfo) { foreach (PlayerInfo playerInfo in gameInfo.PlayerInfos) { if (new Vector2(ModelInfo.Position.X, ModelInfo.Position.Z) == new Vector2(playerInfo.BlockPositionX, playerInfo.BlockPositionZ)) { this.PlayerInfo = playerInfo; return; } } this.PlayerInfo = null; }
/// <summary> /// 必要に応じて落下させる /// </summary> /// <param name="gameInfo">ゲームの情報</param> private void FallIfNecessary(GameInfo gameInfo) { if (IsFalling) { return; } if (!beforeFallTimer.IsRunning || beforeFallTimer.Elapsed < minBeforeFallTime) { foreach (AttackInfo attackInfo in gameInfo.AttackInfos) { if (ModelInfo.Position == attackInfo.BlockPosition) { lastAttackPlayerInfo = attackInfo.OwnerInfo; beforeFallTimer.Start(); break; } } return; } beforeFallTimer.Reset(); Fall(); }
/// <param name="block">ブロック</param> public BlockInfo(Block block) : base(block) { this.IsDead = block.IsDead; this.PlayerInfo = block.PlayerInfo; }
// プレイヤーの攻撃圏内から逃げる void runAwayFrom(PlayerInfo player) { //--- 敵の向きに対して時計回りの方向へ垂直に逃げる ---// // 敵の向き:上 if (player.Direction == new Vector3(0, 0, -1)) Move(Direction.RIGHT); // 敵の向き:下 else if (player.Direction == new Vector3(0, 0, 1)) Move(Direction.LEFT); // 敵の向き:左 if (player.Direction == new Vector3(-1, 0, 0)) Move(Direction.UP); // 敵の向き:右 if (player.Direction == new Vector3(1, 0, 0)) Move(Direction.DOWN); }
/// <summary> /// プレイヤーの進行方向に自分がいるか /// </summary> /// <param name="player">プレイヤー情報</param> /// <returns></returns> Boolean isLookingThisWay(PlayerInfo player) { // 相手が死んでいたらスキップ if (player.IsDead) return false; // 敵から見た自分のいる方向 Vector3 dir = me.Position - player.Position; dir = new Vector3((float)Math.Round(dir.X), (float)Math.Round(dir.Y), (float)Math.Round(dir.Z)); dir.Normalize(); if (dir == player.Direction) return true; return false; }
/// <summary> /// 自分の進行方向にプレイヤーがいるか /// </summary> /// <param name="player"></param> /// <returns></returns> Boolean isInADirection(PlayerInfo player) { // 相手が死んでいたらスキップ if (player.IsDead) return false; // 自分から見た敵のいる方向 Vector3 dir = player.Position - me.Position; dir = new Vector3((float)Math.Round(dir.X), (float)Math.Round(dir.Y), (float)Math.Round(dir.Z)); dir.Normalize(); if (dir == me.Direction) return true; return false; }