Ejemplo n.º 1
0
        public override void Update(GameTime gameTime)
        {
            // 中心を新しくセット
            transform.CenterPosition = radius;

            // スケールを毎フレーム代入(transform.Scaleがプロパティでrefが使えないため)
            transform.Scale = currentScale;
            EagingScale();

            collision = new CircleCollision(CompVector2.ScaleConversion(currentScale, radius).X, transform);

            // プレイヤーの移動
            PlayerMove();

            // 任意の分裂
            Division(ref futureScale, ref currentScale, transform.Position);

            // クランプ
            transform.Position = Clamp(transform.Position, CompVector2.ScaleConversion(currentScale, radius));


            // デバッグ用
#if DEBUG
            if (input.IsKeyDown(Keys.T))
            {
                // スケール係数を1ずつ足す
                futureScale += new Vector2(1f);
            }
#endif
        }
Ejemplo n.º 2
0
        public override void Update(GameTime gameTime)
        {
            transform.CenterPosition = radius;

            // 大きさ
            transform.Scale = currentScale;
            EagingScale();

            // 半径が変わるので当たり判定も1フレーム毎にチェック
            collision = new CircleCollision(CompVector2.ScaleConversion(currentScale, radius).X, transform);

            // 移動
            Move();

            // 任意の分裂
            Division(ref futureScale, ref currentScale, transform.Position);

            // クランプ
            transform.Position = Clamp(transform.Position, CompVector2.ScaleConversion(currentScale, radius));

#if DEBUG
            // デバッグ用
            if (input.IsKeyDown(Keys.A))
            {
                isDead = true;
            }
#endif
        }
Ejemplo n.º 3
0
        /// <summary>
        /// エネミーの動きに関するもの
        /// </summary>
        /// <param name="gameTime"></param>
        private void EnemyMove(GameTime gameTime)
        {
            if (randCount < intervalCount)
            {
                // 1秒 ~ 10秒の間でインターバルを決定
                randCount = random.Next(1000, 10000);
                randPos   = Vector2.Normalize(
                    transform.Position - new Vector2(
                        random.Next(0, Screen.MapWidth - (int)(CompVector2.ScaleConversion(scale, radius).X)),
                        random.Next(0, Screen.MapHeight - (int)(CompVector2.ScaleConversion(scale, radius).Y))));
                intervalCount = 0;
            }
            transform.Position -= randPos * Speed(speed, scale.X);

            // インターバルをカウント
            intervalCount += gameTime.ElapsedGameTime.Milliseconds;
        }
Ejemplo n.º 4
0
        public override void Update(GameTime gameTime)
        {
            collision = new CircleCollision(CompVector2.ScaleConversion(scale, radius).X, transform);

            transform.CenterPosition = radius;

            transform.Scale = scale;


            if (findFoodInterval <= findFoodCount && GetScene == SceneID.GamePlay)
            {
                // 餌が近くにないか探す
                FindFood();

                // インターバル + 0.1秒した値よりカウントが大きくなったらリセット
                if (findFoodInterval + 10 <= findFoodCount)
                {
                    findFoodCount = 0;
                }
            }
            findFoodCount++;

            // エネミーのモードによって行動を決定
            switch (mode)
            {
            // 通常行動
            case EnemyMoveMode.NormalMove:
                EnemyMove(gameTime);
                break;

            // 近くに食べ物が見つかればこの行動に移る
            case EnemyMoveMode.EatMove:
                FoodEatMove();
                break;
            }

            transform.Position = Clamp(transform.Position, CompVector2.ScaleConversion(scale, radius));
        }
Ejemplo n.º 5
0
        /// <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;
            }
        }