Here's my take of a 'space invaders' in a quick 15 minute hack-up of code:
Code:
Public Class Form1
Private WithEvents DisplayTimer As Windows.Forms.Timer
Private Rand As New Random
Private monster As Alien
Private ship As Citizen
Private laser As Gun
Private score As Integer
Private Class Alien
Public Property Visible As Boolean
Public Property X As Integer
Public Property Y As Integer
Public Property Width As Integer
Public Property Height As Integer
Public Property Speed As Integer
End Class
Private Class Citizen
Public Sub New()
Width = 20
Height = 10
End Sub
Public Property X As Integer
Public Property Y As Integer
Public Property Width As Integer
Public Property Height As Integer
End Class
Private Class Gun
Public Sub New()
Width = 3
Height = 8
End Sub
Public Property visible As Boolean
Public Property X As Integer
Public Property Y As Integer
Public Property Width As Integer
Public Property Height As Integer
End Class
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.SetStyle(ControlStyles.UserPaint, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.UpdateStyles()
End Sub
Private Sub Board_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
DisplayTimer = New Windows.Forms.Timer
monster = New Alien
ship = New Citizen
laser = New Gun
ship.X = Me.ClientSize.Width \ 2
ship.Y = Me.ClientSize.Height - 20
DisplayTimer.Interval = 30
DisplayTimer.Enabled = True
End Sub
Protected Overrides Sub OnKeyDown(e As System.Windows.Forms.KeyEventArgs)
MyBase.OnKeyDown(e)
If e.KeyCode = Keys.A Then
ship.X -= 10
ElseIf e.KeyCode = Keys.D Then
ship.X += 10
ElseIf e.KeyCode = Keys.Space Then
If laser.visible = False Then
laser.X = ship.X + ship.Width \ 2 - laser.Width \ 2
laser.Y = ship.Y - laser.Height
laser.visible = True
End If
End If
End Sub
Protected Overrides Sub OnResize(e As System.EventArgs)
MyBase.OnResize(e)
Me.ship.Y = Me.ClientSize.Height - 20
End Sub
Private Sub DisplayTimer_Tick(sender As Object, e As System.EventArgs) Handles DisplayTimer.Tick
If monster.Visible Then
monster.X += monster.Speed
If monster.X > Me.ClientSize.Width Then monster.Visible = False
Else
monster.Visible = True
monster.Width = Rand.Next(20, 40)
monster.Y = Rand.Next(0, 100)
monster.Height = Rand.Next(10, 20)
monster.Speed = Rand.Next(1, 10)
monster.X = -monster.Width
End If
'
If laser.visible Then
Dim oldY As Integer = laser.Y
laser.Y -= 10
If laser.Y + laser.Height < 0 Then laser.visible = False
' Check for collision
Dim r As New Rectangle(laser.X, laser.Y, laser.Width, laser.Y - oldY + laser.Height)
If r.IntersectsWith(New Rectangle(monster.X, monster.Y, monster.Width, monster.Height)) Then
' HIT
monster.Visible = False
laser.visible = False
score += 1
End If
End If
' perform a redraw
Me.Invalidate()
End Sub
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
' draw the monster
If monster.Visible Then e.Graphics.FillRectangle(Brushes.Red, monster.X, monster.Y, monster.Width, monster.height)
' draw the ship
e.Graphics.FillEllipse(Brushes.DarkBlue, ship.X, ship.Y, ship.Width, ship.Height)
' draw the laser
If laser.visible Then e.Graphics.FillRectangle(Brushes.Green, laser.X, laser.Y, laser.Width, laser.Height)
' draw the score
e.Graphics.DrawString(score.ToString, Me.Font, Brushes.Black, 0, 0)
End Sub
End Class