Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Windows.Forms;
- public delegate void OnStringGet(string s);
- public class RandomStringInvader : Control
- {
- private bool _PauseOnMouseExit = false;
- public bool PauseOnMouseExit
- {
- get
- {
- return _PauseOnMouseExit;
- }
- set
- {
- _PauseOnMouseExit = value;
- if(_PauseOnMouseExit)
- {
- if (boardX == int.MinValue)
- Stop();
- }
- else
- {
- Start();
- }
- }
- }
- Ship[] shooters;
- Timer drawTimer;
- List<Collectable> FallingCollectables = new List<Collectable>();
- Random r = new Random();
- int boardX = 0;
- int boardY = 0;
- int boardWidth = 0;
- int boardHeight = 6;
- bool Stopped = false;
- public event OnStringGet OnStringGet;
- public string CharMap { get; set; }
- struct Ship
- {
- public bool reverse;
- public int X;
- public Size Size;
- public void Draw(Graphics g)
- {
- g.FillRectangle(Brushes.White, new Rectangle(new Point(X, 0), Size));
- g.FillPolygon(Brushes.White, new Point[] { new Point(X, Size.Height / 2), new Point(X + Size.Width, Size.Height / 2), new Point(X + (Size.Width / 2), Size.Height + 3) });
- }
- }
- struct Collectable
- {
- public string Letter;
- public int X;
- public int Y;
- }
- public RandomStringInvader()
- {
- CharMap = "1234567890-=qwertyuiopasdfghjklzxcvbnm,./;'[]";
- BackColor = Color.Black;
- MinimumSize = new Size(100, 100);
- drawTimer = new Timer();
- drawTimer.Interval = 50;
- drawTimer.Tick += DrawTimer_Tick;
- drawTimer.Start();
- Setup();
- }
- private void DrawTimer_Tick(object sender, EventArgs e)
- {
- for (int i = 0; i < shooters.Length; i++)
- {
- Ship shooter = shooters[i];
- int newX = shooter.X;
- if (shooter.reverse)
- {
- newX -= this.Width / 10;
- if ((newX - (shooter.Size.Width / 2)) < 0)
- {
- newX = newX - (shooter.Size.Width / 2);
- shooter.reverse = false;
- }
- }
- else
- {
- newX += this.Width / 10;
- if (newX > this.Width - shooter.Size.Width)
- {
- newX = this.Width - shooter.Size.Width;
- shooter.reverse = true;
- }
- }
- shooter.X = newX;
- shooters[i] = shooter;
- var newc = new Collectable();
- newc.Letter = CharMap[r.Next(CharMap.Length)].ToString();
- newc.X = shooter.X + (shooter.Size.Width / 2);
- newc.Y = shooter.Size.Height + 3;
- FallingCollectables.Add(newc);
- }
- for (int i = 0; i < FallingCollectables.Count; i++)
- {
- Collectable c = FallingCollectables[i];
- c.Y += 10;
- if (c.Y > this.Height + 10)
- FallingCollectables.RemoveAt(i);
- else
- FallingCollectables[i] = c;
- }
- Invalidate();
- }
- private void Setup()
- {
- shooters = new Ship[]
- {
- new Ship()
- {
- Size = new Size(this.Width / 10, this.Height / 10),
- reverse = false
- },
- new Ship()
- {
- Size = new Size(this.Width / 10, this.Height / 10),
- reverse = true,
- X = this.Width
- },
- new Ship()
- {
- Size = new Size(this.Width / 10, this.Height / 10),
- reverse = false,
- X = this.Width / 2
- }
- };
- boardX = int.MinValue;
- boardY = this.Height - (this.Height / 5);
- boardWidth = this.Width / 10;
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- var g = e.Graphics;
- if(boardX != int.MinValue)
- g.FillRectangle(Brushes.Green, new Rectangle(boardX, boardY, boardWidth, boardHeight));
- foreach (Ship s in shooters)
- s.Draw(g);
- for (int i = 0; i < FallingCollectables.Count; i++)
- {
- Collectable c = FallingCollectables[i];
- if ((c.X > boardX && c.X < boardX + boardWidth) && (c.Y > boardY))
- {
- FallingCollectables.RemoveAt(i);
- var callback = OnStringGet;
- if (callback != null)
- callback(c.Letter);
- }
- else
- {
- g.DrawString(c.Letter, this.Font, Brushes.Red, new Point(c.X, c.Y));
- }
- }
- base.OnPaint(e);
- }
- protected override void OnSizeChanged(EventArgs e)
- {
- base.OnSizeChanged(e);
- Setup();
- }
- protected override void OnMouseMove(MouseEventArgs e)
- {
- base.OnMouseMove(e);
- if(!Stopped)
- boardX = e.X;
- }
- protected override void OnMouseLeave(EventArgs e)
- {
- boardX = int.MinValue;
- if (PauseOnMouseExit)
- Stop();
- base.OnMouseLeave(e);
- }
- protected override void OnMouseEnter(EventArgs e)
- {
- if (PauseOnMouseExit)
- Start();
- base.OnMouseEnter(e);
- }
- public void Stop()
- {
- Stopped = true;
- boardX = int.MinValue;
- drawTimer.Stop();
- }
- public void Start()
- {
- Stopped = false;
- drawTimer.Start();
- }
- public void ClearCharacters()
- {
- FallingCollectables.Clear();
- Invalidate();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement