Advertisement
qwoze

Flight_to_the_Stars

Nov 21st, 2023
781
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.47 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using Bots;
  11.  
  12. namespace Flight_to_the_Stars
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         Bitmap bmp;
  17.         Graphics graph;
  18.         int w, h;
  19.         int tick = 0;
  20.         List<Star> stars;
  21.         Random random = new Random();
  22.  
  23.         public Form1()
  24.         {
  25.             InitializeComponent();
  26.         }
  27.  
  28.         private void pictureBox1_Paint(object sender, PaintEventArgs e)
  29.         {
  30.             graph.Clear(Color.Black);
  31.  
  32.             foreach (Star star in stars)
  33.             {
  34.                 star.Move();
  35.                 star.Show(graph);
  36.             }
  37.             e.Graphics.DrawImage(bmp, 0, 0);
  38.         }
  39.  
  40.         private void timer1_Tick(object sender, EventArgs e)
  41.         {
  42.             tick++;
  43.  
  44.             int n = random.Next(5);
  45.             for (int i = 0; i < n; i++)
  46.             {
  47.                 stars.Add(new Star(Properties.Resources.sun));
  48.             }
  49.  
  50.             for (int i = stars.Count - 1; i >= 0; i--)
  51.             {
  52.                 if (stars[i].X > stars[i].MaxX || stars[i].X < 0 || stars[i].Y > stars[i].MaxY || stars[i].Y < 0)
  53.                 {
  54.                     stars.RemoveAt(i);
  55.                 }
  56.             }
  57.  
  58.             pictureBox1.Invalidate();
  59.         }
  60.  
  61.         private void Form1_Load(object sender, EventArgs e)
  62.         {
  63.             bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
  64.             graph = Graphics.FromImage(bmp);
  65.             Bot.SetLimits(pictureBox1.Width, pictureBox1.Height);
  66.             graph.Clear(Color.Black);
  67.  
  68.             stars = new List<Star>();
  69.  
  70.             timer1.Start();
  71.         }
  72.     }
  73. }
  74.  
  75. using System;
  76. using System.Collections.Generic;
  77. using System.Linq;
  78. using System.Text;
  79. using System.Threading.Tasks;
  80. using Bots;
  81. using System.Drawing;
  82.  
  83. namespace Flight_to_the_Stars
  84. {
  85.     class Star : Bot
  86.     {
  87.         static Random random = new Random();
  88.  
  89.         private float amplitude;
  90.         private float period;
  91.         private float angle;
  92.         private float startX;
  93.         public float MaxX => maxX;
  94.         public float MaxY => maxY;
  95.  
  96.         public Star(Image img) : base(img)
  97.         {
  98.             x = maxX * (float)(random.NextDouble());
  99.             y = maxY * (float)(random.NextDouble());
  100.  
  101.             dx = (maxX / 64) * (float)(random.NextDouble() * 2 - 1);
  102.             dy = (maxY / 64) * (float)(random.NextDouble() * 2 - 1);
  103.             width = (float)random.NextDouble() * 3.0f;
  104.             height = width;
  105.  
  106.             amplitude = (float)random.NextDouble() * 30.0f + 10.0f;
  107.             period = (float)random.NextDouble() * 0.2f + 0.1f;
  108.             startX = x;
  109.         }
  110.  
  111.         public override void Move()
  112.         {
  113.             angle += period;
  114.             dx = (maxX / 128) * (float)Math.Cos(angle);
  115.             x = startX + amplitude * (float)Math.Sin(angle);
  116.  
  117.             base.Move();
  118.         }
  119.     }
  120. }
  121.  
  122. using System;
  123. using System.Collections.Generic;
  124. using System.Linq;
  125. using System.Text;
  126. using System.Threading.Tasks;
  127. using System.Drawing;
  128.  
  129. namespace Bots
  130. {
  131.     public class Bot
  132.     {
  133.         //Положение
  134.         protected static float maxX = -1, maxY = -1;
  135.         protected float x, y;
  136.         protected float dx = 1, dy = 1;
  137.         public float X => x;
  138.         public float Y => y;
  139.         public float Dx => dx;
  140.         public float Dy => dy;
  141.         public float MaxX => maxX;
  142.         public float MaxY => maxY;
  143.         //Внешний вид
  144.  
  145.         Image img = null;
  146.         protected float width = 30, height = 30;
  147.         public float Width => width;
  148.         public float Height => height;
  149.         //Поведение
  150.         static bool isSetLimits = false;
  151.  
  152.         /// <summary>
  153.         /// Устанавливает границы области их отображения и перемещения
  154.         /// Исключение Exception: выбрасывается в случае, если один из размеров области отображения меньше 2.
  155.         /// </summary>
  156.         /// <param name="graph"> холст, на который будет выводиться объект</param>
  157.         /// <param name="w"> ширина области отображения</param>
  158.         /// <param name="h"> высота области отображения</param>
  159.  
  160.         public static void SetLimits(int w, int h)
  161.         {
  162.             if (w < 2 || h < 2)
  163.                 throw new Exception("Размеры поля слишком малы");
  164.             maxX = w - 1;
  165.             maxY = h - 1;
  166.             isSetLimits = true;
  167.         }
  168.         /// <summary>
  169.         /// Конструктор
  170.         /// </summary>
  171.         /// <param name="im"> Изображение бота</param>
  172.         /// <param name="x"> координата Х  </param>
  173.         /// <param name="y"> координата У </param>
  174.         /// <param name="width"> ширина изображения </param>
  175.         /// <param name="height"> высота изображения</param>
  176.         public Bot(Image im = null, float x = 0, float y = 0, float width = 30, float height = 30)
  177.         {
  178.             if (!isSetLimits)
  179.             {
  180.                 throw new Exception("Сначала нужно указать размеры области рисования..." +
  181.                 " Для этого предназначен статический метод SetLimits()");
  182.             }
  183.             if (x < 0 || x > maxX || y < 0 || y > maxY)
  184.             {
  185.                 throw new ArgumentOutOfRangeException("Координаты бота должны быть в пределах размеров поля для отображения");
  186.             }
  187.             if (width < 1 || height < 1 || width > maxX || height > maxY)
  188.             {
  189.                 throw new Exception();
  190.             }
  191.             try
  192.             {
  193.                 img = im;
  194.             }
  195.             catch
  196.             {
  197.  
  198.             }
  199.             this.x = x;
  200.             this.y = y;
  201.             this.width = width;
  202.             this.height = height;
  203.  
  204.         }
  205.         /// <summary>
  206.         /// Отображает бота с помощью передаваемого объекта графики
  207.         /// </summary>
  208.         /// <param name="gr">Объект графики</param>
  209.         public virtual void Show(Graphics gr)
  210.         {
  211.             if (img != null)
  212.                 gr.DrawImage(img, x, y, width, height);
  213.         }
  214.         /// <summary>
  215.         /// Перемещает объект
  216.         /// </summary>
  217.         public virtual void Move(float step)
  218.         {
  219.             x += dx * step;
  220.             y += dy * step;
  221.         }
  222.         public virtual void Move()
  223.         {
  224.             x += dx;
  225.             y += dy;
  226.         }
  227.         public void ToLeft()
  228.         {
  229.             dx = -1;
  230.             dy = 0;
  231.         }
  232.         public void ToRight()
  233.         {
  234.             dx = 1;
  235.             dy = 0;
  236.         }
  237.  
  238.         public void ToUp()
  239.         {
  240.             dy = -1;
  241.             dx = 0;
  242.         }
  243.  
  244.         public void ToDown()
  245.         {
  246.             dy = 1;
  247.             dx = 0;
  248.         }
  249.         public void ToDirection(float a, float b)
  250.         {
  251.             dx = a;
  252.             dy = b;
  253.         }
  254.     }
  255. }
  256.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement