Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Aviation Fight

0.00/5 (No votes)
30 Nov 2008 1  
This is a very simple 2D desktop game developed in Visual Studio

Sample Image

Introduction

This is a very simple 2D desktop game developed in Visual Studio 2003 for Windows 2000/XP/Vista (doesn't work on Win 98 & Millennium ). In this game you have to destroy enemies with limited rockets, there are several levels and different difficulties.

You can move your fighter by dragging of mouse, and shoot by click on the fighter, you can also use keyboard (Arrow keys & Space bar), consider that you have to shoot to the center part of airplanes to destroy them .

Right click on the fighter will open a menu to change some options or exit of game.

Background

I wrote this code in September 2006 and put it on the PSC, I just decided to copy it here.

Using the Code

This program uses Form's transparency and animated pictures to show a simple animation. All objects make in runtime and add to a collection so we can control and destroy them easily.

There are 3 timers to control movements and hits; you can see different parts of the program in following diagrams:

A. This is the first part, when you start the game; it shows an information panel and set screen and game level and more ....

B. When you shoot a Rocket, following mechanism starts:

C. And this is the main timer which control hits, remained enemies and rockets and also end of the game:

And full diagram is something like this:

Now I try to explain more:

1.

These are some common variables in mdlMain module:

Friend myMaxWidth As Integer = Screen.PrimaryScreen.WorkingArea.Width
Friend myMaxHeight As Integer = Screen.PrimaryScreen.WorkingArea.Height
Friend myLevel As Integer = 1 ' Current level of game
Friend mySpeed As Integer 'Speed of airplanes
Friend myEnemies As Integer 'Total enemies (airplanes)
Friend myRemainEnemies As Integer ' Enemies that are not on the screen, 
  ' but when one airplane crashes, one appears on screen.
Friend myTotalRockets As Integer
Friend myTotalScore As Integer
Friend myLevelScore As Integer
Friend playSound As Boolean = True

I used 3 collections for Airplanes , Rockets and Explosions as following:

Private myPlanesCollection As New Collection
Private myRocketsCollection As New Collection
Private myExplodesCollection As New Collection

I made some Forms for different parts of game and defined some variables to use them in run time

Private myShowLevel As New frmLevel ' show level of game
Private myGameOver As New frmGameOver ' show when game is over
Private myBackground As New frmBackground ' show level,number of enemies,
                                          ' rockets and game score.
Private myRocket As frmRocket ' for making new Rockets
Private myExplode As frmExplode  'for making new explodes
Private WithEvents myPlanes As frmPlanes ' for making new airplanes

2.

Private Sub frmMain_Load(ByVal sender As System.Object,
    ByVal e As System.EventArgs) Handles MyBase.Load
    Randomize()
    myShowLevel.ShowDialog() ' show level of game
    myBackground.Show() ' show information screen
    ' location of your fighter at the first run
    Me.Location = New Point(myMaxWidth / 2, myMaxHeight - Me.Height - 20)     ReStart()
End Sub

This is myShowLevel.ShowDialog()

And the following is myBackground.Show()

3.

' when click "Restart" or Game over or new level, it reset game.
Private Sub ReStart()
    Call KillAll()
    .
    .
    .
End Sub

' remove all objects from screen and collections 
Private Sub KillAll()
    For Each myPlane As frmPlanes In myPlanesCollection 'remove all airplanes
        myPlanesCollection.Remove(1)
        myPlane.Dispose()
    Next
    For Each myxExplode As frmExplode In myExplodesCollection 'remove all explodes
        myExplodesCollection.Remove(1)
        myxExplode.Dispose()
    Next
    For Each myRocket As frmRocket In myRocketsCollection 'remove all rockets
        myRocketsCollection.Remove(1)
        myRocket.Dispose()
    Next
End Sub

4.

' when click "Restart" or Game over or new level, it reset game.
Private Sub ReStart()
    Call KillAll()
    myLevelScore = 0
    myTotalRockets = 50 + myLevel * 5 + IIf(myLevel Mod 2 = 0, 0, 15) 'some levels are easier
    myRemainEnemies = 5 + myLevel * 5
    mySpeed = 300 + Rnd(1) * 200 + IIf(myLevel Mod 2 = 0, 0, 200)
    ''Debug.WriteLine("mySpeed : " & mySpeed)
    addPlanes(myRemainEnemies)
    myBackground.RefreshData()
    Me.BringToFront()
End Sub

5.

' This part adds planes to your game
Private Sub addPlanes(ByVal myCount As Integer)
    Static myPlanesNo As Integer

    For i As Integer = 1 To myCount
        myPlanes = New frmPlanes
        myPlanesNo = myPlanesNo + 1
        myPlanes.Tag = "F" & myPlanesNo ' for control a special plane in a collectin
        myPlanesCollection.Add(myPlanes, "F" & myPlanesNo)
        myPlanes.Show()
        myRemainEnemies -= 1
        If myPlanesCollection.Count >= 5 Then Exit For ' you have only 5 active airplane
                                                       ' on screen. 
                                                       '( more planes need faster CPU )
    Next
    myEnemies = myRemainEnemies + myPlanesCollection.Count
    myBackground.RefreshData()
End Sub

I used 5 different types of airplanes and helicopters as enemy

6.

'timer for moving airplanes on screen, when planes are out of screen,
' they will placed in new location at top of screen
Private Sub tmrPlane_Tick(ByVal sender As System.Object,
    ByVal e As System.EventArgs) Handles tmrPlane.Tick

    For Each myPlane As frmPlanes In myPlanesCollection
        If (myPlane.Location.X > myMaxWidth * 1.2 OrElse myPlane.Location.Y >
            myMaxHeight) AndAlso myPlane.planeType Mod 2 = 0 Then
            'airplane is out of screen at right
            myPlane.planeSize = Int(Rnd(1) * 25) + 5  ' random size at new location
            ' when I want to change location to new area at left, size of 
            ' plane is too big and make a bad effect.
            myPlane.Size = New Size(1, 1) 
            Application.DoEvents()
            ' new location at left
            myPlane.Location = New Point(Int(Rnd(1) * myMaxWidth / 4) - 100, -50)
        ElseIf myPlane.Location.X < -myMaxWidth *
            0.2 OrElse myPlane.Location.Y > myMaxHeight Then
            'airplane is out of screen at left
            myPlane.planeSize = Int(Rnd(1) * 25) + 5 ' random size at new location
            ' new location at right
            myPlane.Location = New Point(myMaxWidth + Int(Rnd(1) * myMaxWidth / 4), -50)
        End If

        myPlane.planeSize += (mySpeed / 800)
        If myPlane.planeSize > 200 Then myPlane.planeSize = 200
        myPlane.picPlanes.Size = New Size(myPlane.planeSize,
            myPlane.planeSize * 0.5)
        myPlane.Size = myPlane.picPlanes.Size
        myPlane.Location = New Point(myPlane.Location.X + IIf(myPlane.planeType Mod 2 = 0,
            1, -1) * (myPlane.Width / 20), myPlane.Location.Y + mySpeed / 500)
    Next
End Sub

7.

When you click on your fighter, following procedure launchs a rocket.

Private Sub PicHunter_MouseUp(ByVal sender As Object,
    ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicHunter.MouseUp
    canMoveHunter = False
    If e.Button = Windows.Forms.MouseButtons.Left Then
        Call Shoot()
    End If
End Sub

You can also shoot rockets by keyboard.

'this is for controlling fighter by keyboard
Private Sub frmMain_KeyDown(ByVal sender As Object,
    ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    Dim myNewx As Integer

    Select Case e.KeyCode
        Case Keys.Left ' move your fighter to left
            myNewx = Me.Location.X - 12 : If myNewx < -Me.Width / 2 Then myNewx =
                -Me.Width / 2
            Me.Location = New Point(myNewx, Me.Location.Y)
        Case Keys.Right ' move your fighter to right
            myNewx = Me.Location.X + 12 : If myNewx > 
                myMaxWidth - Me.Width / 2 Then myNewx = myMaxWidth - Me.Width / 2
            Me.Location = New Point(myNewx, Me.Location.Y)
        Case Keys.Up
            mySpeed = mySpeed + 10
            If mySpeed > 800 Then mySpeed = 800
            myBackground.RefreshData()
        Case Keys.Down
            mySpeed = mySpeed - 10
            If mySpeed < 200 Then mySpeed = 200
            myBackground.RefreshData()
        Case Keys.Space, Keys.ControlKey    ' you can shoot by keyboard
            Call Shoot()
        Case Keys.Escape ' exit
            Call plzEnd()
    End Select
    Application.DoEvents()
End Sub

8.

' Launch a rocket
Private Sub Shoot()
    Static RocketNo As Integer
    Static myWing As Boolean  ' rockets launch from left and right of your fighter 
    Static IamBusy As Boolean ' preventing of running again when last rocket is
                              ' still launching

    If Not IamBusy Then
        IamBusy = True
        If myTotalRockets > 0 Then
            ' Note: VS2005 uses another way to play sound, you must remark following
            ' line and active second line
            If playSound Then sndPlaySound("Rocket.wav", 1) ' This is for VS 2003
            'If playSound Then My.Computer.Audio.Play("Rocket.wav",
                AudioPlayMode.Background) ' This is for VS 2005
            myWing = Not myWing
            myTotalRockets -= 1
            RocketNo += 1
            myRocket = New frmRocket ' make new one
            myRocket.Top = Me.Location.Y + Me.Height / 3
            myRocket.Left = IIf(myWing, Me.Location.X + Me.Width / 3.2,
                Me.Location.X + Me.Width / 1.8)
            myRocket.Tag = "R" & RocketNo
            myRocketsCollection.Add(myRocket, "R" & RocketNo)
            myRocket.Show()
            myBackground.RefreshData()
            Me.BringToFront()
        End If
        IamBusy = False
    End If
End Sub

9.

'timer for moving rockets to top of screen
Private Sub tmrRocket_Tick(ByVal sender As System.Object,
    ByVal e As System.EventArgs) Handles tmrRocket.Tick
    For Each myRocket As frmRocket In myRocketsCollection
        If myRocket.Top < 0 Then
            ' when a rocket is out of screen at top, it must remove.
            ''Debug.WriteLine("Rocket " & myRocket.Tag & " disposed " & myRocket.Top)
            myRocketsCollection.Remove(myRocket.Tag)
            myRocket.Dispose()
        Else
            myRocket.Location = New Point(myRocket.Location.X, myRocket.Location.Y - 8)
        End If
    Next
End Sub

10.

' important part: timer for control hits and crashes
Private Sub tmrMain_Tick(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles tmrMain.Tick
    Dim myRocketX As Single
    Dim myRocketY As Single
    Dim myPlanesX1 As Single
    Dim myPlanesX2 As Single
    Dim myPlanesY1 As Single
    Dim myPlanesY2 As Single
    Static myExplodeNo As Integer
    .
    .
    .
        
End Sub

11.

    .
    .
    .
    'check rockets status
    For Each myRocket As frmRocket In myRocketsCollection
        myRocketX = myRocket.Location.X + myRocket.Width / 2
        myRocketY = myRocket.Location.Y
        If myRocketY > 20 Then
            ' check position of airplanese and check for contact with rocket
            For Each myPlanes As frmPlanes In myPlanesCollection
                ' only center of airplane is important for crash
                myPlanesX1 = myPlanes.Location.X + myPlanes.Width / 4
                myPlanesX2 = myPlanes.Location.X + myPlanes.Width / 4 * 3
                myPlanesY1 = myPlanes.Location.Y - 10
                myPlanesY2 = myPlanes.Location.Y + myPlanes.Height

                If myRocketX > myPlanesX1 AndAlso myRocketX <
                        myPlanesX2 AndAlso myRocketY > myPlanesY1 AndAlso myRocketY <
                        myPlanesY2 Then
                    ' create an explode form, replace it with airplane form and also
                    ' remove rocket from screen
                    ' Note: VS2005 uses another way to play sound, you must remark
                    ' following line and activate second line
                    If playSound Then sndPlaySound("explode.wav", 1) ' This is for VS 2003 
                    'If playSound Then My.Computer.Audio.Play("explode.wav",
                    '    AudioPlayMode.Background) ' This is for VS 2005
                    myLevelScore += 
                        ' if you hunt an enemy in top of screen, its score is 
                        ' more then in middle or bottom of screen.
                        Int((myMaxHeight - myPlanesY2) / myMaxHeight * 50) * 20 
                    myExplodeNo += 1
                    myExplode = New frmExplode ' create new one
                    Application.DoEvents()
                    myExplode.Top = myPlanes.Location.Y
                    myExplode.Left = myPlanes.Location.X
                    myExplode.Tag = "X" & myExplodeNo
                    myExplode.Text = "OK"
                    myExplodesCollection.Add(myExplode, "X" & myExplodeNo)
                    myExplode.Show() ' show explode form
                    myExplode.Size = myPlanes.Size
                    Me.BringToFront()
                    '
                    'Debug.WriteLine("planes " & myPlanes.Tag & " crashed  " & myPlanesY1)
                    myPlanesCollection.Remove(myPlanes.Tag) ' remove plane from collection
                    myPlanes.Dispose()
                    'Debug.WriteLine("Rocket " & myRocket.Tag & " exploded " & myRocket.Top)
                    myRocketsCollection.Remove(myRocket.Tag) ' remove rocket from collection
                    myRocket.Dispose()
                    myEnemies = myRemainEnemies + myPlanesCollection.Count
                    myBackground.RefreshData()
                    .
                    .
                    .

12.

12A.

                    .
                    .
                    .
                    ' if there is reserved airplane, show one of them.
                    If myRemainEnemies > 0 Then addPlanes(1) 
                    .
                    .
                    .

12B.

                    .
                    .
                    .
                    If myPlanesCollection.Count = 0 Then ' check for end of level
                        'remaining rockets have score
                        myTotalScore += 1000 + myLevelScore + myTotalRockets * 100
                        Call KillAll()
                        myLevel += 1
                        myShowLevel.ShowDialog() ' go to the next level
                        ReStart()
                    End If
                    Me.BringToFront()
                    Exit For
                    End If
                    .
                    .
                    .

12C.

    .
    .
    .
    ' when you lose all rockets but airplanes remained, game is over.
    If myTotalRockets <= 0 AndAlso myRocketsCollection.Count = 
        0 AndAlso myPlanesCollection.Count > 0 Then
        ' show game over form, maybe user want to exit.
        If myGameOver.ShowDialog() = Windows.Forms.DialogResult.Cancel Then plzEnd()
        ReStart()
    End If
    .
    .
    .

This is the "Game Over" window:

Points of Interest

You can add a background to the game or use new airplanes and more levels.

History

This is the first upload.  

 

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here