/// <summary> /// 画面を描画する。 /// </summary> public void Draw() { // 背景 DX.SetDrawBright(BackR, BackG, BackB); DX.DrawGraph(0, 0, imgBack, DX.FALSE); DX.SetDrawBright(255, 255, 255); Enemies.ForEach(enemy => enemy.Draw()); OwnBullets.ForEach(bullet => bullet.Draw()); EnemyBullets.ForEach(bullet => bullet.Draw()); OwnChar.Draw(); if (Boss != null) { Boss.Draw(); DX.DrawFillBox(bossHpX1, bossHpY1, bossHpX1 + bossHpW, bossHpY1 + bossHpH, bossHpColBack); DX.DrawFillBox(bossHpX1, bossHpY1, bossHpX1 + Boss.HP * bossHpW / Boss.MaxHP, bossHpY1 + bossHpH, bossHpCol); } }
/// <summary> /// 1フレームぶんの処理を行う。 /// </summary> public void Update() { // スクリプト実行 runner.Step(); // 自機 OwnChar.Update(key); // 敵 Enemies.ForEach(enemy => enemy.Update()); // 自機の弾 OwnBullets.ForEach(bullet => bullet.Update()); // 敵の弾 EnemyBullets.ForEach(bullet => bullet.Update()); // ボス if (Boss != null) { Boss.Update(); } // 画面外の弾を削除 OwnBullets.RemoveAll(bullet => bullet.Position.X < -bullet.Radius || bullet.Position.Y < -bullet.Radius || bullet.Position.X > 640 + bullet.Radius || bullet.Position.Y > 480 + bullet.Radius); EnemyBullets.RemoveAll(bullet => bullet.Position.X < -bullet.Radius || bullet.Position.Y < -bullet.Radius || bullet.Position.X > 640 + bullet.Radius || bullet.Position.Y > 480 + bullet.Radius); // 敵と弾の当たり判定 for (var bi = OwnBullets.Count - 1; bi >= 0; --bi) { var bullet = OwnBullets[bi]; for (var ei = Enemies.Count - 1; ei >= 0; --ei) { var enemy = Enemies[ei]; if (collidesCircleCircle( bullet.Position.X, bullet.Position.Y, bullet.Radius, enemy.Position.X, enemy.Position.Y, enemy.Radius)) { enemy.OnDamaged(bullet.Power); OwnBullets.RemoveAt(bi); break; } } } Enemies.RemoveAll(enemy => enemy.Dead); // ボスと弾の当たり判定 if (Boss != null) { for (var bi = OwnBullets.Count - 1; bi >= 0; --bi) { var bullet = OwnBullets[bi]; if (collidesCircleCircle( bullet.Position.X, bullet.Position.Y, bullet.Radius, Boss.Position.X, Boss.Position.Y, Boss.Radius)) { Boss.OnDamaged(bullet.Power); OwnBullets.RemoveAt(bi); } } } // 自機と敵の当たり判定 foreach (var enemy in Enemies) { if (collidesCircleCircle( OwnChar.Position.X, OwnChar.Position.Y, OwnChar.Radius, enemy.Position.X, enemy.Position.Y, enemy.Radius)) { failed = !DebugMode; } } // 自機とボスの当たり判定 if (Boss != null) { if (collidesCircleCircle( OwnChar.Position.X, OwnChar.Position.Y, OwnChar.Radius, Boss.Position.X, Boss.Position.Y, Boss.Radius)) { failed = !DebugMode; } } // 自機と敵の弾の当たり判定 foreach (var bullet in EnemyBullets) { if (collidesCircleCircle( OwnChar.Position.X, OwnChar.Position.Y, OwnChar.Radius, bullet.Position.X, bullet.Position.Y, bullet.Radius)) { failed = !DebugMode; } } // R キーで自滅 if (key.IsPressed(DX.KEY_INPUT_R)) { failed = true; } }