/// <summary> /// 自分の近くに餌があったらそれを取りに行く動き /// </summary> private void FoodEatMove() { // どんどん餌に近づいていく transform.Position -= Vector2.Normalize(transform.Position - findFoodPos) * Speed(speed, scale.X); // 自分の座標と餌の座標が5ドット以下なら通常行動に移行 if (Vector2.Distance(transform.Position, findFoodPos) <= 5f) { mode = EnemyMoveMode.NormalMove; } }
private Vector2 findFoodPos; // 見つけた餌の座標を入れておくためのリスト public Enemy(GameManager gameManager) : base(gameManager) { id = ObjectID.Character; Tag = CharacterID.Enemy; drawStruct.textureName = Tag; drawStruct.color = new Color(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)); transform.Position = new Vector2(random.Next(0, Screen.MapWidth), random.Next(0, Screen.MapHeight)); radius = new Vector2(16f); speed = 2f; scale = new Vector2((float)random.NextDouble() * (5 - 1) + 1); mode = EnemyMoveMode.NormalMove; findFoodInterval = random.Next(180, 600); // 3~10秒の間で固有のインターバルを決定 //// ゲームプレイで呼ばれたら非同期処理開始 //if(GetScene == SceneID.GamePlay) //{ // FindFood(); //} }
/// <summary> /// 餌を見つける /// </summary> private void FindFood() { List <Vector2> FoodPos = new List <Vector2>(); // 餌を入れる foreach (GameObject food in GameObjectManager.FindAll(CharacterID.Food)) { // 餌と自分との距離が301ドット以上離れているならリストに入れない(軽くするため、、、たぶん軽くなるはず) if (Vector2.Distance(food.transform.Position, transform.Position + CompVector2.ScaleConversion(scale, radius)) >= 301f) { continue; } // 餌の座標を個別に保存する FoodPos.Add(food.transform.Position); } if (FoodPos.Count != 0) { // ソート(バグあり) FoodPos = FoodPos.OrderBy(o => CompVector2.MinVector2(transform.Position, o.X, o.Y)).ToList(); // 見つけた餌の座標の自分から一番近いところを入れる findFoodPos = FoodPos[0]; // 餌との距離が0ドット未満になったら中をクリアする if (Vector2.Distance(transform.Position, FoodPos[0]) < 0) { FoodPos.RemoveAt(0); } } // 近くに餌があったら食べに行く if (FoodPos.Count != 0) { mode = EnemyMoveMode.EatMove; } }