Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using Bots;
- namespace Flight_to_the_Stars
- {
- public partial class Form1 : Form
- {
- Bitmap bmp;
- Graphics graph;
- int w, h;
- int tick = 0;
- List<Star> stars;
- Random random = new Random();
- public Form1()
- {
- InitializeComponent();
- }
- private void pictureBox1_Paint(object sender, PaintEventArgs e)
- {
- graph.Clear(Color.Black);
- foreach (Star star in stars)
- {
- star.Move();
- star.Show(graph);
- }
- e.Graphics.DrawImage(bmp, 0, 0);
- }
- private void timer1_Tick(object sender, EventArgs e)
- {
- tick++;
- int n = random.Next(5);
- for (int i = 0; i < n; i++)
- {
- stars.Add(new Star(Properties.Resources.sun));
- }
- for (int i = stars.Count - 1; i >= 0; i--)
- {
- if (stars[i].X > stars[i].MaxX || stars[i].X < 0 || stars[i].Y > stars[i].MaxY || stars[i].Y < 0)
- {
- stars.RemoveAt(i);
- }
- }
- pictureBox1.Invalidate();
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
- graph = Graphics.FromImage(bmp);
- Bot.SetLimits(pictureBox1.Width, pictureBox1.Height);
- graph.Clear(Color.Black);
- stars = new List<Star>();
- timer1.Start();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Bots;
- using System.Drawing;
- namespace Flight_to_the_Stars
- {
- class Star : Bot
- {
- static Random random = new Random();
- private float amplitude;
- private float period;
- private float angle;
- private float startX;
- public float MaxX => maxX;
- public float MaxY => maxY;
- public Star(Image img) : base(img)
- {
- x = maxX * (float)(random.NextDouble());
- y = maxY * (float)(random.NextDouble());
- dx = (maxX / 64) * (float)(random.NextDouble() * 2 - 1);
- dy = (maxY / 64) * (float)(random.NextDouble() * 2 - 1);
- width = (float)random.NextDouble() * 3.0f;
- height = width;
- amplitude = (float)random.NextDouble() * 30.0f + 10.0f;
- period = (float)random.NextDouble() * 0.2f + 0.1f;
- startX = x;
- }
- public override void Move()
- {
- angle += period;
- dx = (maxX / 128) * (float)Math.Cos(angle);
- x = startX + amplitude * (float)Math.Sin(angle);
- base.Move();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Drawing;
- namespace Bots
- {
- public class Bot
- {
- //Положение
- protected static float maxX = -1, maxY = -1;
- protected float x, y;
- protected float dx = 1, dy = 1;
- public float X => x;
- public float Y => y;
- public float Dx => dx;
- public float Dy => dy;
- public float MaxX => maxX;
- public float MaxY => maxY;
- //Внешний вид
- Image img = null;
- protected float width = 30, height = 30;
- public float Width => width;
- public float Height => height;
- //Поведение
- static bool isSetLimits = false;
- /// <summary>
- /// Устанавливает границы области их отображения и перемещения
- /// Исключение Exception: выбрасывается в случае, если один из размеров области отображения меньше 2.
- /// </summary>
- /// <param name="graph"> холст, на который будет выводиться объект</param>
- /// <param name="w"> ширина области отображения</param>
- /// <param name="h"> высота области отображения</param>
- public static void SetLimits(int w, int h)
- {
- if (w < 2 || h < 2)
- throw new Exception("Размеры поля слишком малы");
- maxX = w - 1;
- maxY = h - 1;
- isSetLimits = true;
- }
- /// <summary>
- /// Конструктор
- /// </summary>
- /// <param name="im"> Изображение бота</param>
- /// <param name="x"> координата Х </param>
- /// <param name="y"> координата У </param>
- /// <param name="width"> ширина изображения </param>
- /// <param name="height"> высота изображения</param>
- public Bot(Image im = null, float x = 0, float y = 0, float width = 30, float height = 30)
- {
- if (!isSetLimits)
- {
- throw new Exception("Сначала нужно указать размеры области рисования..." +
- " Для этого предназначен статический метод SetLimits()");
- }
- if (x < 0 || x > maxX || y < 0 || y > maxY)
- {
- throw new ArgumentOutOfRangeException("Координаты бота должны быть в пределах размеров поля для отображения");
- }
- if (width < 1 || height < 1 || width > maxX || height > maxY)
- {
- throw new Exception();
- }
- try
- {
- img = im;
- }
- catch
- {
- }
- this.x = x;
- this.y = y;
- this.width = width;
- this.height = height;
- }
- /// <summary>
- /// Отображает бота с помощью передаваемого объекта графики
- /// </summary>
- /// <param name="gr">Объект графики</param>
- public virtual void Show(Graphics gr)
- {
- if (img != null)
- gr.DrawImage(img, x, y, width, height);
- }
- /// <summary>
- /// Перемещает объект
- /// </summary>
- public virtual void Move(float step)
- {
- x += dx * step;
- y += dy * step;
- }
- public virtual void Move()
- {
- x += dx;
- y += dy;
- }
- public void ToLeft()
- {
- dx = -1;
- dy = 0;
- }
- public void ToRight()
- {
- dx = 1;
- dy = 0;
- }
- public void ToUp()
- {
- dy = -1;
- dx = 0;
- }
- public void ToDown()
- {
- dy = 1;
- dx = 0;
- }
- public void ToDirection(float a, float b)
- {
- dx = a;
- dy = b;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement