[VB] Kollisionsabfrage von 2 Shapes

roeb

Mitglied

Hallo,

ich habe per index circa 150 shapes angelegt. mit folgender funktion:

Code:
x = x + 200
If x >= 4440 Then
x = 120
y = y + 200
End If
anz = anz + 1
Load shp_enemy(anz)
shp_enemy(anz).Visible = True
shp_enemy(anz).Left = x
shp_enemy(anz).Top = y

If anz = 153 Then
tim_shapeaufbau.Enabled = False
End If

Dann hab ich noch ein weiteres shape welches ich per pfeiltaste bewege. was auch super geht. es soll sobald es über eins der shapes fährt es auf visible=false setzten. Allder dings hab ich ein prob mit den index da er immer nur das dhape auf visible=false setzt welches ich zu lezte erstellt habe (höhsten index). Hier der Code um die shapes auf visible true zu stellen.

If shp_pacman.Left + shp_enemy(anz).Width >= shp_enemy(anz).Left And shp_pacman.Left - shp_enemy(anz).Width <= shp_enemy(anz).Left And shp_pacman.Top + shp_enemy(anz).Height >= shp_enemy(anz).Top And shp_pacman.Top - shp_enemy(anz).Height <= shp_enemy(anz).Top Then
shp_enemy(0 - 150).Visible = False
End If

wie kann ich es anstellen das er auf alle shapes reagiert und nicht nur auf das zuletzt erstellte? is sehr wichtig.

bye roeb
 
Zuletzt bearbeitet:
Du musst bei deinem Code nurnoch eine Schleife einbauen, die deinen Code für alle Shapes anwendet:
Code:
For anz=shp_enemy.Lbound to shp_enemy.Ubound

If shp_pacman.Left + shp_enemy(anz).Width >= shp_enemy(anz).Left _
And shp_pacman.Left - shp_enemy(anz).Width <= shp_enemy(anz).Left _
And shp_pacman.Top + shp_enemy(anz).Height >= shp_enemy(anz).Top _
And shp_pacman.Top - shp_enemy(anz).Height <= shp_enemy(anz).Top Then
shp_enemy(0 - 150).Visible = False

Next
 
Code:
For anz = shp_enemy.Lbound To shp_enemy.Ubound

If shp_pacman.Left + shp_enemy(anz).Width >= shp_enemy(anz).Left _
And shp_pacman.Left - shp_enemy(anz).Width <= shp_enemy(anz).Left _
And shp_pacman.Top + shp_enemy(anz).Height >= shp_enemy(anz).Top _
And shp_pacman.Top - shp_enemy(anz).Height <= shp_enemy(anz).Top Then
shp_enemy(anz).Visible = False
End If
Next

Da kommt bei mir folgender fehler ... vll könnt ihr mir helfen. Bin am verzweifeln:

Runtime Error 340:
Control array element '1' doesnt exist.
 
Bist du sicher das jedes Shape eine Nummer hat?
Die Fehlermeldung muss der Logik nach bedeuten das das Shape mit der Nummer 1 einfach nicht existiert ;)
Versuch mal
Code:
On Error Resume Next
einfach einzubauen, das sollte helfen :)

/€dit:
Code:
For anz = shp_enemy.Lbound To shp_enemy.Ubound
On Error Resume Next
If shp_pacman.Left + shp_enemy(anz).Width >= shp_enemy(anz).Left _
And shp_pacman.Left - shp_enemy(anz).Width <= shp_enemy(anz).Left _
And shp_pacman.Top + shp_enemy(anz).Height >= shp_enemy(anz).Top _
And shp_pacman.Top - shp_enemy(anz).Height <= shp_enemy(anz).Top Then
shp_enemy(anz).Visible = False
End If
Next
So sollte das gehen :)
 
Ich habe noch eine frage:

ich bewege das eine Shape mit Keydown, und sobald KeyUp hör es sich auf zu bewegen. Jetzt will ich das er sobald er gg ein anderes shape kommt stehen bleibt. also nicht in das shape "reinlaufen" kann. Eine Kollisionsbfrage ist alles vorhanden. Ich weis bloss nicht wie ich das shape anhalten bzw. für sorgen soll das es nicht in das andere shape reinläuft.

Der Code zum bewegen des shapes:
Code:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

    ' Wenn man die Taste drückt, bewegt sich das shape
    If KeyCode = vbKeyUp Then
        tim_oben.Enabled = True
    End If

    If KeyCode = vbKeyDown Then
        tim_unten.Enabled = True
    End If

    If KeyCode = vbKeyLeft Then
        tim_links.Enabled = True
    End If

    If KeyCode = vbKeyRight Then
        tim_rechts.Enabled = True
    End If
End Sub

Der Code im Timer zum bewegen:
Code:
Private Sub tim_oben_Timer()
    If shp_pacman.Top > 120 Then
        a = 10
        shp_pacman.Top = shp_pacman.Top - a
    End If
End Sub

Den code gibt es dann noch für links, recht und unten.
 
vielleicht hab ich mich bissel kompliziert ausgedrückt. Ich möchte nicht das er stehen bleibt wenn er an die wände des shapes kommt sondenr einfach das er nicht in das shape "reinläuft" ... mein ziel ist es eine art pacman zu machen und mir geht es jetzt um die hinternisse im spielfeld.
 
Mein Vorschlag:
Code:
Dim at_wall As Integer
Nun in die Collisionsabfrage einbauen
Code:
If collision... Then
    ...
    at_wall = 1
End If
In den Timer
Code:
Private Sub tim_oben_Timer()
    If at_wall = 0 Then
        If shp_pacman.Top > 120 Then
            a = 10
            shp_pacman.Top = shp_pacman.Top - a
        End If
     End If
End Sub
Ist nur so ne kleine Idee :)

/€dit:
Natürlich musst nun noch gucken, in welche Richtung er sich von der Wand löst!
Dafür musst dann at_wall wieder auf 0 setzen, damit er sich wieder bewegen kann!
 

Neue Beiträge

Zurück