/// <summary> /// シーンを更新する /// 1フレームに1回呼び出す /// </summary> /// <param name="status">更新時情報</param> public void Update(GameStatus status) { #if CHECK_INITIALIZED if (!initialized) { throw new NotInitializedException(); } #endif _Update(status); }
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); } }
protected virtual void _Update(GameStatus status) { }
private bool WaitDokuro(GameStatus gameStatus) { if (waitUntil < gameStatus.CurrentTimeInMillis) { drawDokuro = false; return true; } drawDokuro = true; return false; }
private bool WaitHowitzer(GameStatus gameStatus) { if (waitUntil < gameStatus.CurrentTimeInMillis) { return true; } return false; }
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; } }
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; }
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; }
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; }
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; }