0

I am making a two dimensional game where the user is able to shoot enemies and gain points. So far I have added borders to the level as well as the collision detection between the Player and said borders. When the player presses "w" the user shoots a bullet. Without me setting the boundaries, the bullet appears at the centre of the players sprite. With the boundaries set, the bullets appear to increase height from the player when spawned; when the player moves to the left of the screen. Vice Versa when the player moves to the right.

The first Class:

Public Class Bullet
Inherits PictureBox 'this class is a variation of a picture box
Public Sub New() 'every time bullet is accessed it will access this sub as well
    With Me 'refers back to anything in the class
        .Height = 5
        .Width = 2
        .Location = PlayScreen.PlayerShip.Location 'sets the bullets start point to the ship
        .BackColor = Color.White
        .SetBounds(x:=PlayScreen.PlayerShip.Left, y:=PlayScreen.PlayerShip.Left, height:=5, width:=2)
    End With
End Sub

Public Sub ShootUp()
    Me.Top -= 10 'Males the bullet move upwards
End Sub
End Class

The Rest of my Code:

Public Class PlayScreen
    Public Shared PlayerShip As New PictureBox 'defines the ship as a picture box
    Dim WallNorth As New PictureBox
    Dim WallSouth As New PictureBox
    Dim WallEast As New PictureBox 'these will be given collision detection to check if the player is trying to exit the boundires of the level
    Dim WallWest As New PictureBox

    Dim Bullets(-1) As Bullet 'makes the array have nothing in it
    Dim BulletCounter As Integer 'used to make new bullets


    Dim MoveRight As Boolean = False
    Dim MoveLeft As Boolean = False 'Making movement based upon boolean factors allows for more user friendly controls
    Dim MoveUp As Boolean = False
    Dim MoveDown As Boolean = False

    Dim PUHealth As New PictureBox

    Dim Health As Integer
    Dim Score As Integer

    Private Sub PlayScreen_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        MovementTimer.Start()
        PUHealthTimer.Start()

        Health = 3
        HealthLbl.Text = "Health: " & Health

        Score = 0
        ScoreLbl.Text = "Score: " & Score

        Me.Controls.Add(PUHealth)
        PUHealth.Width = 25
        PUHealth.Height = 25
        PUHealth.BorderStyle = BorderStyle.FixedSingle
        PUHealth.BackColor = Color.Yellow
        PUHealth.Top = Me.Height / 2 - 100
        PUHealth.Left = Me.Width / 2 - 100
        PUHealth.SetBounds(x:=Me.Height / 2 - 100, y:=Me.Width / 2 - 100, height:=25, width:=25)


        Me.Controls.Add(PlayerShip) 'imports the picture box onto the PlayScreen
        PlayerShip.Width = 40
        PlayerShip.Height = 40 'Dimensions of the player ship
        PlayerShip.BorderStyle = BorderStyle.FixedSingle 'adds a border to the picturebox
        PlayerShip.BackColor = Color.White 'adds colour to the ship background
        PlayerShip.SetBounds(x:=Me.Left, y:=Me.Top, height:=40, width:=40)





        Me.Controls.Add(WallNorth)
        WallNorth.Width = 750
        WallNorth.Height = 5
        WallNorth.BorderStyle = BorderStyle.FixedSingle 'this is defining the wall at the top of the screen, setting its positions as well as its bounds
        WallNorth.BackColor = Color.Green
        WallNorth.Top = 1
        WallNorth.Left = 1
        WallNorth.SetBounds(x:=1, y:=1, height:=5, width:=750)

        Me.Controls.Add(WallEast)
        WallEast.Width = 5
        WallEast.Height = 750
        WallEast.BorderStyle = BorderStyle.FixedSingle 'This defines the wall at the right of the screen, setting its position as well as its bounds
        WallEast.BackColor = Color.Green
        WallEast.Top = 1
        WallEast.Left = 545
        WallEast.SetBounds(x:=545, y:=1, width:=5, height:=750)

        Me.Controls.Add(WallSouth)
        WallSouth.Width = 750
        WallSouth.Height = 5
        WallSouth.BorderStyle = BorderStyle.FixedSingle
        WallSouth.BackColor = Color.Green
        WallSouth.Top = 574
        WallSouth.Left = 1
        WallSouth.SetBounds(x:=1, y:=573, width:=750, height:=5)

        Me.Controls.Add(WallWest)
        WallWest.Width = 5
        WallWest.Height = 750
        WallWest.BorderStyle = BorderStyle.FixedSingle
        WallWest.BackColor = Color.Green
        WallWest.Top = 1
        WallWest.Left = 1



    End Sub

    Private Sub PlayScreen_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        Select Case e.KeyValue
            Case Keys.Right
                MoveRight = True
            Case Keys.Left
                MoveLeft = True  'This edits the boolean value of the varibales when the correct key is pressed
            Case Keys.Up
                MoveUp = True
            Case Keys.Down
                MoveDown = True
            Case Keys.W
                ReDim Preserve Bullets(BulletCounter) 'allows the array to expand more efficiently
                Dim Bullet1 As New Bullet 'creates new bullet
                Controls.Add(Bullet1) 'adds bullet to the screen
                Bullets(BulletCounter) = Bullet1 'the new space created in the array is saved as the new bullet made
                BulletCounter += 1
                ShootUpTimer.Start() 'starts the shoot timer



        End Select

        While WallNorth.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Top += 5
        End While

        While WallEast.Bounds.IntersectsWith(PlayerShip.Bounds) 'I have to check if the player has collided with the wall when the key is down
            PlayerShip.Left -= 5
        End While

        While WallSouth.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Top -= 5
        End While

        While WallWest.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Left += 5
        End While


        If PUHealth.Bounds.IntersectsWith(PlayerShip.Bounds) Then 'checks if the player has collided with the the power up
            If PUHealth.Visible() Then 'This stops a bug where the player could go to the spot where the power up use to be and collect health
                Health += 1 'increaeses the players health by one
                HealthLbl.Text = "Health: " & Health 'displays the new player health
                PUHealth.Hide() 'hides the power up
            End If
        End If
    End Sub

    Private Sub PlayScreen_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        Select Case e.KeyValue
            Case Keys.Right
                MoveRight = False
            Case Keys.Left
                MoveLeft = False 'This edits the boolean value when the key has been lifted
            Case Keys.Up
                MoveUp = False
            Case Keys.Down
                MoveDown = False
        End Select

        While WallNorth.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Top += 5
        End While

        While WallEast.Bounds.IntersectsWith(PlayerShip.Bounds) 'i have to check if the player collides with a wall while the key is down
            PlayerShip.Left -= 5
        End While

        While WallSouth.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Top -= 5
        End While


        If PUHealth.Bounds.IntersectsWith(PlayerShip.Bounds) Then
            If PUHealth.Visible() Then
                Health += 1
                HealthLbl.Text = "Health: " & Health
                PUHealth.Hide()
            End If
        End If
    End Sub

    Private Sub MovementTimer_Tick(sender As Object, e As EventArgs) Handles MovementTimer.Tick


        If MoveRight = True Then
            PlayerShip.Left += 5
        End If
        If MoveLeft = True Then
            PlayerShip.Left -= 5
        End If
        If MoveUp = True Then
            PlayerShip.Top -= 5 ' I use a timer to tick every 10 milliseconds ato check the states of each key, this statement controlls the execution of the direction
        End If
        If MoveDown = True Then
            PlayerShip.Top += 5
        End If

        While WallNorth.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Top += 5
        End While

        While WallEast.Bounds.IntersectsWith(PlayerShip.Bounds) 'i check if the player is collided with the wall whilst the timer ticks because the player could not collide with the wall every 20 milliseconds
            PlayerShip.Left -= 5
        End While

        While WallSouth.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Top -= 5
        End While

        While WallWest.Bounds.IntersectsWith(PlayerShip.Bounds)
            PlayerShip.Left += 5
        End While

        If PUHealth.Bounds.IntersectsWith(PlayerShip.Bounds) Then
            If PUHealth.Visible() Then
                Health += 1
                HealthLbl.Text = "Health: " & Health
                PUHealth.Hide()
            End If
        End If
    End Sub

    Private Sub PUHealthTimer_Tick(sender As Object, e As EventArgs) Handles PUHealthTimer.Tick
        If PUHealth.Visible() Then 'checks if the health power up i visible
        Else 'if not the coordinates are randomised and then displayerd
            PUHealth.Top = ((500 * Rnd()) + 10)
            PUHealth.Left = ((500 * Rnd()) + 10)
            PUHealth.Show()
        End If
    End Sub

    Private Sub ShootTimerUp_Tick(sender As Object, e As EventArgs) Handles ShootUpTimer.Tick
        For x = 0 To Bullets.Length - 1 'to check every position within the array apart from the newest
            Bullets(x).ShootUp()
        Next
    End Sub

    End Class

What do i need to change to get the bullets to shoot from the middle, of the top, of the ship.

Brian M Stafford
  • 8,483
  • 2
  • 16
  • 25
  • 1
    You can edit your question by clicking the edit in the "share edit follow close flag" group. You should add the information you provided as an answer to your question and delete the answer. – Mary Apr 22 '20 at 04:21

1 Answers1

0

In the Public Class I declared the X and Y location both as the x location