Example #1
0
        /// <summary>
        /// シーンを更新する
        /// 1フレームに1回呼び出す
        /// </summary>
        /// <param name="status">更新時情報</param>
        public void Update(GameStatus status)
        {
#if CHECK_INITIALIZED
            if (!initialized)
            {
                throw new NotInitializedException();
            }
#endif

            _Update(status);
        }
Example #2
0
        public void Update(GameStatus status)
        {
            foreach (var op in nextOperations)
            {
                switch (op.action)
                {
                    case Operation.Kind.Pop:
                        if (scenes.Count >= 2)
                        {
                            // 現在のシーンをまずポーズさせて、次にスタックとの接続を解除する
                            CurrentScene.Pause();
                            CurrentScene.SetStack(null);

                            // スタックから削除する
                            scenes.RemoveAt(scenes.Count - 1);

                            // 新しく一番上になったシーンを再開させる
                            CurrentScene.Resume();
                        }
                        break;
                    case Operation.Kind.Push:
                        // 現在のシーンをポーズさせる
                        CurrentScene.Pause();

                        // まずプッシュするシーンとスタックを連結させ、次にスタックに追加する
                        op.scene.SetStack(this);
                        scenes.Add(op.scene);

                        // 新しく一番上になったシーンを開始させる
                        CurrentScene.Resume();
                        break;
                }
            }
            nextOperations.Clear();

            foreach (var s in scenes)
            {
                s.Update(status);
            }
        }
Example #3
0
 protected virtual void _Update(GameStatus status)
 {
 }
Example #4
0
        private bool WaitDokuro(GameStatus gameStatus)
        {
            if (waitUntil < gameStatus.CurrentTimeInMillis)
            {
                drawDokuro = false;
                return true;
            }

            drawDokuro = true;

            return false;
        }
Example #5
0
        private bool WaitHowitzer(GameStatus gameStatus)
        {
            if (waitUntil < gameStatus.CurrentTimeInMillis)
            {
                return true;
            }

            return false;
        }
Example #6
0
 private void UpdateBullet(GameStatus gameStatus)
 {
     switch (phase)
     {
         case 0:
             if (MoveHowitzer(gameStatus))
             {
                 phase++;
             }
             break;
         case 1:
             if (WaitHowitzer(gameStatus))
             {
                 phase++;
             }
             break;
         case 2:
             if (FireBullet(gameStatus))
             {
                 phase++;
             }
             break;
         case 3:
             if (MoveBullet(gameStatus))
             {
                 phase++;
             }
             break;
         case 4:
             if (WaitDokuro(gameStatus))
             {
                 phase++;
             }
             break;
         default:
             phase = 0;
             break;
     }
 }
Example #7
0
        private bool MoveHowitzer(GameStatus gameStatus)
        {
            bool mouseInScreen = 0 <= Mouse.X && Mouse.X < GameSettings.WindowWidth && 0 <= Mouse.Y && Mouse.Y < GameSettings.WindowHeight;

            if (mouseInScreen && Mouse.Left)
            {
                int depthAtMouse = GetDepthAt(Mouse.X, Mouse.Y);
                int mouseXCenter = Mouse.X - GameSettings.WindowWidth / 2;
                int mouseYCenter = GameSettings.WindowHeight / 2 - Mouse.Y;
                PolarPoint pp = GetPolarPointAt(mouseXCenter, mouseYCenter, depthAtMouse);

                double diffBulletAzimuth = pp.Azimuth -
                    (bulletTarget != null ? bulletTarget.Azimuth : 0);

                bulletTarget = pp;

                double v0 = bulletSpeed;
                double g = 9.8;
                double[] angles = Util.CalcFiringAngle(bulletTarget.Length / 1000.0, bulletTarget.Elevation, v0, g);
                this.firingAngle = angles[directShot ? 0 : 1];

                double srv1Deg = firingAngle * 180 / Math.PI;
                double srv2Deg = pp.Azimuth * 180 / Math.PI;

                int tmp = (int)Math.Round(1500 + srv1Deg * 7);
                SerialPort.Write(string.Format("srv1:{0}\n", tmp)); // 1500 usec中心
                Console.WriteLine(string.Format("{0}, {1}", srv1Deg, tmp));
                SerialPort.Write(string.Format("srv2:{0}\n", (int)Math.Round(1500 + srv2Deg * 10))); // 1500 usec中心
                // http://homepage3.nifty.com/rio_i/lab/avr/09pwm.html

                waitUntil = gameStatus.CurrentTimeInMillis + (int)(7000 * Math.Abs(diffBulletAzimuth) / Math.PI) + 1000;
                DX.PlaySoundMem(turretMoveSound, DX.DX_PLAYTYPE_BACK);
                //waitUntil = gameStatus.CurrentTimeInMillis;

                return true;
            }

            return false;
        }
Example #8
0
        private bool MoveBullet(GameStatus gameStatus)
        {
            if (bullet != null)
            {
                int timeInMillis = gameStatus.CurrentTimeInMillis - gameStatus.PreviousTimeInMillis;

                bullet.Update(timeInMillis);
                DebugWindow.Update("10:BL_V", bullet.Vertical.Position.ToString("F2"));
                DebugWindow.Update("11:BL_H", bullet.Horizontal.Position.ToString("F2"));

                /*
                Console.WriteLine(string.Format("bullet updated, Vertical a={0:F2} v={1:F2} p={2:F2}",
                    bullet.Vertical.Acceleration, bullet.Vertical.Velocity, bullet.Vertical.Position));
                Console.WriteLine(string.Format("                Horizontal a={0:F2} v={1:F2} p={2:F2}",
                    bullet.Horizontal.Acceleration, bullet.Horizontal.Velocity, bullet.Horizontal.Position));
                 * */

                if (bulletTarget.Length / 1000 * Math.Cos(bulletTarget.Elevation) < bullet.Horizontal.Position
                    && bulletTarget.Length / 1000 * Math.Sin(bulletTarget.Elevation) > bullet.Vertical.Position)
                {
                    bulletHit = true;

                    DX.PlaySoundMem(hitSound, DX.DX_PLAYTYPE_BACK);

                    waitUntil = gameStatus.CurrentTimeInMillis + 1000;

                    return true;
                }
                {
                    bulletHit = false;
                    //DrawBullet(false);
                }

                return false;
            }
            return true;
        }
Example #9
0
        private bool FireBullet(GameStatus gameStatus)
        {
            if (bulletTarget.Length > 0)
            {
                double v0 = bulletSpeed;
                double g = 9.8;

                double sin = Math.Sin(firingAngle), cos = Math.Cos(firingAngle);

                DebugWindow.Update("12:FANG", (firingAngle * 180 / Math.PI).ToString("F02"));

                bullet = new Bullet();
                bullet.Horizontal.Acceleration = 0;
                bullet.Horizontal.Velocity = cos * v0;
                bullet.Horizontal.Position = 0.05;
                bullet.Vertical.Acceleration = -g;
                bullet.Vertical.Velocity = sin * v0;
                bullet.Vertical.Position = 0;

                /*
                Console.WriteLine(string.Format("bullet allocated, Vertical a={0:F2} v={1:F2} p={2:F2}",
                    bullet.Vertical.Acceleration, bullet.Vertical.Velocity, bullet.Vertical.Position));
                 * */

                bulletAzimuth = bulletTarget.Azimuth;

                //Console.WriteLine(string.Format("{0:F2},{1:F2}", angles[0] * 180 / Math.PI, angles[1] * 180 / Math.PI));

                DX.StopSoundMem(turretMoveSound);
                DX.PlaySoundMem(fireSound, DX.DX_PLAYTYPE_BACK);
            }

            return true;
        }
Example #10
0
        protected override void _Update(GameStatus status)
        {
            base._Update(status);
            if (Mouse.Left || Mouse.Middle || Mouse.Right
                || Mouse.X != previousMouseX || Mouse.Y != previousMouseY)
            {
                previousActionTime = status.CurrentTimeInMillis;
            }

            UpdateBullet(status);

            if (Keyboard.GetHitPeriod(DX.KEY_INPUT_AT) == 1)
            {
                directShot = !directShot;
            }

            foreach (var obj in gameObjects)
            {
                obj.Update(status);
            }

            if (Keyboard.IsHit(DX.KEY_INPUT_ESCAPE))
            {
                PauseScene s = new PauseScene();
                s.Init(GameSettings);
                CallScene(s);
            }

            // 一定時間無操作なら、オープニング画面へ。
            if ((status.CurrentTimeInMillis - previousActionTime) > 30 * 1000)
            {
                var s = new OpeningScene();
                s.Init(GameSettings);
                s.SerialPort = SerialPort;
                GotoScene(s);
            }

            previousMouseX = Mouse.X;
            previousMouseY = Mouse.Y;
        }