/// <summary> /// Плохое завершение игры /// </summary> public void Finish() { finish = true; LogEvent?.Invoke("Игрок проиграл", player.Pos.X, player.Pos.Y); //Сообщение GL.ClearColor(Color.Black); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.LoadIdentity(); GL.PushMatrix(); GL.Translate(15, 15, 0); GL.Color3(Color.Black); GL.Begin(PrimitiveType.TriangleFan); GL.Vertex2(0, 0); GL.Vertex2(0, screen.Height); GL.Vertex2(screen.Width, screen.Height); GL.Vertex2(screen.Width, 0); GL.End(); GL.Color3(Color.Wheat); TextGame.Print2DText(50, (float)(screen.Height - 200), "Вы проиграли! Мир захватил электронный разум, вышедший из под контроля своих создателей."); TextGame.Print2DText(50, (float)(screen.Height - 350), "Неужели это конец?"); TextGame.Print2DText(50, (float)(screen.Height - 500), "Мастер, готовы ли вы к перерождению во имя победы?"); GL.PopMatrix(); // дожидаемся завершения визуализации кадра GL.Flush(); // сигнал для обновление элемента реализующего визуализацию. glControl.Invalidate(); }
/// <summary> /// Обновление матрицы видового экрана OpenGL /// </summary> private void DrawConsole() { GL.ClearColor(Color.Black); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.LoadIdentity(); GL.PushMatrix(); GL.Translate(15, 15, 0); foreach (var b in backgrounds) { b.Draw(r); } for (int i = 0; i < bullet.Count; ++i) { if (!bullet[i].Draw(r, new PointGrath(0, 0))) { bullet.RemoveAt(i); } } var boom = false; var size = 100; for (int i = 0; i < dangerous.Count; ++i) { for (int b = 0; b < bullet.Count; ++b) { if (dangerous[i].Collision(bullet[b])) { score++; boom = true; System.Media.SystemSounds.Hand.Play(); bullet.RemoveAt(b); } } for (int m = 0; m < medicine.Count; ++m) { if (dangerous[i].Collision(medicine[m])) { boom = true; System.Media.SystemSounds.Hand.Play(); medicine[m] = new Medicine(new PointGrath((screen.Width / 2) + r.Next(-2000, 2000), (screen.Height / 2) + r.Next(-2000, 2000)), new Speed(0, 0), new PointGrath(60, 60), screen); } } if (dangerous[i].Collision(player)) { boom = true; var damage = r.Next(1, 10); LogEvent?.Invoke($"Столкновение с {dangerous[i].GetType()}. Вы получили урон в размере: {damage}", player.Pos.X, player.Pos.Y); player.EnergyLow(damage); score++; System.Media.SystemSounds.Asterisk.Play(); if (player.Energy <= 0) { player?.Die(); } } if (!boom && !dangerous[i].Draw(r)) { dangerous[i] = new Danger_lvl2(new PointGrath(r.Next((int)(screen.Width / 1.5), (int)(screen.Width - size)), r.Next((int)(0 - (size * 2)), (int)(screen.Height - (size * 2)))), new Speed(6 + r.NextDouble() * 16, 6 + r.NextDouble() * 24), new PointGrath(size, size), screen); } if (boom) { LogEvent?.Invoke($"Враг {dangerous[i].GetType()} повержен", player.Pos.X, player.Pos.Y); if (r.Next(0, 100) < 50) { dangerous[i] = new Danger_lvl2(new PointGrath(r.Next((int)(screen.Width / 1.5), (int)(screen.Width - size)), r.Next((int)(0 - (size * 2)), (int)(screen.Height - (size * 2)))), new Speed(12 + r.NextDouble() * 64, 6 + r.NextDouble() * 24), new PointGrath(size, size), screen); if (r.Next(0, 1000) > 900) { dangerous.Add(new Danger_lvl2(new PointGrath(r.Next((int)(screen.Width / 1.5), (int)(screen.Width - size)), r.Next((int)(0 - (size * 2)), (int)(screen.Height - (size * 2)))), new Speed(12 + r.NextDouble() * 64, 6 + r.NextDouble() * 24), new PointGrath(size, size), screen)); } } else { dangerous[i] = new Danger(new PointGrath(r.Next((int)(0 + size), (int)(screen.Width / 4)), r.Next((int)(0 - (size * 2)), (int)(screen.Height - (size * 2)))), new Speed(12 + r.NextDouble() * 64, 6 + r.NextDouble() * 24), new PointGrath(size, size), screen); if (r.Next(0, 1000) > 700) { dangerous.Add(new Danger(new PointGrath(r.Next((int)(0 + size), (int)(screen.Width / 4)), r.Next((int)(0 - (size * 2)), (int)(screen.Height - (size * 2)))), new Speed(12 + r.NextDouble() * 64, 6 + r.NextDouble() * 24), new PointGrath(size, size), screen)); } } boom = false; } } player.Draw(r, new PointGrath(lineX, lineY)); for (var i = 0; i < medicine.Count; ++i) { if (player.Collision(medicine[i])) { player.Heal(medicine[i].Heal); medicine[i] = new Medicine(new PointGrath((screen.Width / 2) + r.Next(-2000, 2000), (screen.Height / 2) + r.Next(-2000, 2000)), new Speed(0, 0), new PointGrath(60, 60), screen); } else if (!medicine[i].Draw(r, new PointGrath(lineX, lineY))) { medicine[i] = new Medicine(new PointGrath((screen.Width / 2) + r.Next(-2000, 2000), (screen.Height / 2) + r.Next(-2000, 2000)), new Speed(0, 0), new PointGrath(60, 60), screen); } } GeneralizedDelegate <string> d = Summ <string>; GL.Color3(Color.Crimson); if (score < 5000) { TextGame.Print2DText(50, (float)(screen.Height - 200), d("Марафон дикой аптечки! ", $"Марафон дикой аптечки! Вы разрушили {score} из 5000 астероидов.")); } else { TextGame.Print2DText(50, (float)(screen.Height - 200), d("Марафон дикой аптечки выы выйграли!", $"Со счетом {score} астероидов.")); } GL.PopMatrix(); // дожидаемся завершения визуализации кадра GL.Flush(); // сигнал для обновление элемента реализующего визуализацию. glControl.Invalidate(); }