[VB] Kollisionsabfrage von 2 Shapes

Ich hab das mal versuch wie du es mir geschrieben hast. Also wenn er an die wand kommt setzt es die variable wall auf 1 und im bewegungstimer hab ich folgendes geschrieben:

Code:
Private Sub tim_links_Timer()
If wall = 0 Then
    If shp_pacman.Left > 0 Then
        a = 10
        shp_pacman.Left = shp_pacman.Left - a
    End If
    If wall = 1 Then
        If shp_pacman.Left < 4320 Then
            a = 10
            shp_pacman.Left = shp_pacman.Left + a
        End If
        wall = 0
    End If
    
End If
End Sub

er bleibt zwar stehen sobald er eine wand berühert aber er löst sich auch nicht wieder .... theoretisch müsste er ja in die andere richtung davon laufen wenn ich vbkeyleft nochmals drücke, oder?

// edit:

Hänge hier als anhang mal das komplette Projekt an. Weil ich es vielleicht doch bissel schlecht beschrieben habe :)
 

Anhänge

  • Game.zip
    2,1 KB · Aufrufe: 38
Zuletzt bearbeitet:
Ich hatte sowas auch mal gemacht, ich hab das so gelöst, das ich bei einer Collision einfach sozusagen die Richtung wo die Wand ist gesperrt habe und nur die anderen Richtungen waren dementsprechend frei :)

So würde ich das mal versuchen ;)
 
also müsst ich rausfinden an welcher seite der wand, in diesem fall ein würfel er anstossen würde? Mhh ich hab zwar ne Kollisionsabfrage geschrieben aber ich blick da irgendwie selber kaum durch ;) Deshalb hier mal der Code der Kollisionsabfrage kurz:

Code:
For anz_w = shp_wall.LBound To shp_wall.UBound
    If shp_pacman.Left + shp_pacman.Width >= shp_wall(anz_w).Left _
    And shp_pacman.Left - shp_wall(anz_w).Width <= shp_wall(anz_w).Left _
    And shp_pacman.Top + shp_pacman.Height >= shp_wall(anz_w).Top _
    And shp_pacman.Top - shp_wall(anz_w).Height <= shp_wall(anz_w).Top Then
        shp_wall(anz_w).BorderColor = vbRed
    Else
        shp_wall(anz_w).BorderColor = vbGreen
    End If
Next

Die Tastenerkennung hab ich per Form_keydown bzw. Form_keyup gemacht (Pfeiltasten) und die Bewegungabläufe jeweils in ein Timer, für unten, oben .. usw.
 
Sorry, hab leider grade keine zeit um den Code durchzusehen :(

Aber, mach es doch so, dass wenn Left des Spielers größer als Left des Shapes ist (also des blockenden shapes) ist er rechts, wenn kleiner dann links :)
Das selbe kannst du ganz einfach auf oben und unten übertragen :)
 
habs mir nochmal anders überlegt und um das ganze nen bissel schwerer zu machen, darf man die wände nicht berühern udn wnen doch startet es neu. Das bekomm ich wenigstens hin :) naja ich versuch dein tip trotzdem mal. thx udn ich denke es hat sich jetzt alles erledigt.
 
Hey.
Hab sowas jetzt grade auch mal für die Schule gemacht, ich habs so gelöst:
Code:
Private Sub player_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyRight Then
        player.Picture = LoadPicture(App.Path & "\gfx\tank_black_right.bmp")
        For i = 0 To (block.Count - 1) Step 1
            If block(i).left > player.left Then
                If player.Top = block(i).Top Then
                    If (player.left + player.Width) < block(i).left Then
                        colli = False
                    Else
                        colli = True
                        Exit For
                    End If
                Else
                    colli = False
                End If
            Else
                colli = False
            End If
        Next i
        If colli = False Then
            If player.left < (Level1.Width - player.Width) Then pmove = 1
        End If
    End If
    
    If KeyCode = vbKeyLeft Then
        player.Picture = LoadPicture(App.Path & "\gfx\tank_black_left.bmp")
        For i = 0 To (block.Count - 1) Step 1
            If block(i).left < player.left Then
                If player.Top = block(i).Top Then
                    If (player.left - player.Width) > block(i).left Then
                        colli = False
                    Else
                        colli = True
                        Exit For
                    End If
                Else
                    colli = False
                End If
            Else
                colli = False
            End If
        Next i
        If colli = False Then
            If player.left > 0 Then pmove = 2
        End If
    End If
    
    If KeyCode = vbKeyDown Then
        player.Picture = LoadPicture(App.Path & "\gfx\tank_black_down.bmp")
        For i = 0 To (block.Count - 1) Step 1
            If block(i).Top > player.Top Then
                If player.left = block(i).left Then
                    If (player.Top + player.Height) < block(i).Top Then
                        colli = False
                    Else
                        colli = True
                        Exit For
                    End If
                Else
                    colli = False
                End If
            Else
                colli = False
            End If
        Next i
        If colli = False Then
            If player.Top < (Level1.Height - player.Height) Then pmove = 3
        End If
    End If
    
    If KeyCode = vbKeyUp Then
        player.Picture = LoadPicture(App.Path & "\gfx\tank_black_up.bmp")
        For i = 0 To (block.Count - 1) Step 1
            If block(i).Top < player.Top Then
                If player.left = block(i).left Then
                    If (player.Top - player.Height) > block(i).Top Then
                        colli = False
                    Else
                        colli = True
                        Exit For
                    End If
                Else
                    colli = False
                End If
            Else
                colli = False
            End If
        Next i
        If colli = False Then
            If player.Top > 0 Then pmove = 4
        End If
    End If
End Sub
Das sieht aus wie Spagetti mit Soße :p
 

Neue Beiträge

Zurück