public void init(MainWindow mw, SerifuWindow sw, ebifry ebi) { syn = mw; voice = SeyanaVoice.SeyanaVoiceFactory; this.sw = sw; this.ebi = ebi; clk = new Clock(); clk.Show(); nowMoveMode = moveMode.STAND; queue = new Queue <qtask>(); moveSeyana(MainWindow.x, MainWindow.y); moveTask.start(); thinkTask.start(); }
/// <summary> /// キーイベント /// </summary> /// <param name="k">押されたキー</param> public void keyPressed(KeyEventArgs k) { switch (k.Key) { case Key.C: { openConfig(); break; } case Key.E: { syn.createEbi(); break; } case Key.Q: { syn.Quit_Clicked(null, null); break; } case Key.T: { clk.Timer_Click(null, null); clk.Activate(); break; } case Key.Z: { manpukudo = 5 * FPS; if (nowMoveMode == moveMode.RANDOMWALK) { nowMoveMode = moveMode.STAND; } break; } } }
// Use this for initialization void Start() { aiMovementMode = moveMode.Command; agent.updatePosition = false; agent.updateRotation = false; vehicleType = controller.vehicle.type; switch (vehicleType) { case Vehicle.vehicleType.Tank: attackController = GetComponentInChildren <TankTurretControl>(); break; case Vehicle.vehicleType.Truck: break; case Vehicle.vehicleType.Heli: break; case Vehicle.vehicleType.Spy: break; case Vehicle.vehicleType.Base: break; default: attackController = GetComponentInChildren <WeaponControl>(); break; } Vehicle v = GetComponent <VehicleController>().vehicle; attackRange = v.attackRange; sightRange = v.sightRange; oldPos = transform.position; }
/// <summary> /// 思考ルーチン /// </summary> private void run() { // エビフライを食べた後大人しくしている時間(秒) int ebisize = 12; thinkTask.getToken().ThrowIfCancellationRequested(); try { while (true) { if (thinkTask.cancellationRequest()) { thinkTask.getToken().ThrowIfCancellationRequested(); } // queue処理 #region queue if (queue.Count != 0) { var top = queue.Peek(); switch (top) { case qtask.JUMP: { switch (nowMoveMode) { case moveMode.JUMP: { break; } default: { queue.Dequeue(); nowMoveMode = moveMode.JUMP; move_t = 0; break; } } break; } case qtask.EBI_ARABURI: // エビを食べている nowMoveMode = moveMode.ARABURI; if (ebi.live) { manpukudo = ebisize * FPS; int dx = (MainWindow.x + syn.w / 2) - (ebi.x + ebi.w / 2); int dy = (MainWindow.y + syn.h / 2) - (ebi.y + ebi.h / 2); if (dx * dx + dy * dy < 75 * 75) { ebi.eaten(); } } else { nowMoveMode = moveMode.STAND; queue.Dequeue(); } break; case qtask.TIMER_ARABURI: // タイマー終了通知 nowMoveMode = moveMode.ARABURI; voice.playSeyana(); break; } } #endregion else // queueが空の処理 { // エビフライ判定 // 画面内にエビフライがあればそっちに向かう if (ebi.live) { nowMoveMode = moveMode.EBI; voice.playEbifry(); } // ランダムウォーク判定 // 移動中でないかつランダムウォーク判定に成功するとランダムウォークが起こる else if (nowMoveMode == moveMode.STAND && Util.rnd.NextDouble() < randomWalkThreshold && manpukudo <= 0) { randomWalk(); } } if (manpukudo > 0) { manpukudo--; } syn.setScale(); System.Threading.Thread.Sleep(1000 / FPS); } }catch (OperationCanceledException) { } }
/// <summary> /// 移動ルーチン /// </summary> private void move() { moveTask.getToken().ThrowIfCancellationRequested(); int x = MainWindow.x; int y = MainWindow.y; try { while (true) { if (moveTask.cancellationRequest()) { moveTask.getToken().ThrowIfCancellationRequested(); } switch (nowMoveMode) { case moveMode.STAND: { //System.Threading.Thread.Sleep(Util.rnd.Next(100, 500)); syn.faceToCursor(); moveSeyana(MainWindow.x, MainWindow.y); break; } case moveMode.EBI: { int dx = (ebi.x + ebi.w / 2) - (x + syn.w / 2); int dy = (ebi.y + ebi.h / 2) - (y + syn.h / 2); double dst = Math.Sqrt(dx * dx + dy * dy); if (dst > 70) { double dir = Math.Atan2(dy, dx); x = (int)(x + speed * Math.Cos(dir)); y = (int)(y + speed * Math.Sin(dir)); if (Math.Cos(dir) > 0) { syn.faceRight(); } else { syn.faceLeft(); } moveSeyana(x, y); } else { centX = ebi.x + ebi.w / 2; centY = ebi.y + ebi.h / 2; queue.Enqueue(qtask.EBI_ARABURI); } sw.hide(); if (Util.rnd.NextDouble() < 0.05) { voice.playEbifry(); } break; } case moveMode.RANDOMWALK: { double dx = toX - x; double dy = toY - y; double dir = Math.Atan2(dy, dx); double dst = Math.Sqrt(dx * dx + dy * dy); if (dst > 10) { x += (int)(speed * Math.Cos(dir)); y += (int)(speed * Math.Sin(dir)); if (Math.Cos(dir) > 0) { syn.faceRight(); } else { syn.faceLeft(); } moveSeyana(x, y); } else { nowMoveMode = moveMode.STAND; } sw.hide(); break; } case moveMode.JUMP: { // 重力加速度,ジャンプ力 double g = 1.2; double v0 = 20; double dx = 0; double dy = -v0 + g * move_t; x += (int)dx; y += (int)dy; if (g * move_t > 2 * v0) { nowMoveMode = moveMode.STAND; } else { moveOnlySeyana(x, y); } break; } case moveMode.ARABURI: { if (queue.Count == 0 || !(queue.Peek() == qtask.EBI_ARABURI || queue.Peek() == qtask.TIMER_ARABURI)) { nowMoveMode = moveMode.STAND; } if (!(centX == ebi.x + ebi.w / 2 && centY == ebi.y + ebi.h / 2) && (queue.Count > 0 && queue.Peek() == qtask.EBI_ARABURI)) { Console.WriteLine("move"); nowMoveMode = moveMode.EBI; voice.playEbifry(); queue.Dequeue(); break; } double dst = Util.rnd.NextDouble() * 60; double dir = Util.rnd.NextDouble() * 2 * Math.PI; x = (int)(centX + dst * Math.Cos(dir) - syn.w / 2); y = (int)(centY + dst * Math.Sin(dir) - syn.h / 2); moveOnlySeyana(x, y); sw.hide(); break; } default: break; } move_t++; System.Threading.Thread.Sleep((int)(1000 / FPS / (nowMoveMode == moveMode.EBI ? 1.7 : 1.0))); } }catch (OperationCanceledException) { } }
private void randomWalk() { toX = Util.rnd.Next(syn.w, Util.screenwidth - syn.w); toY = Util.rnd.Next(syn.h, Util.screenheight - syn.h); nowMoveMode = moveMode.RANDOMWALK; }