Je fais un jeu de survie et j'essaie de supprimer un objet lorsqu'il sort de l'écran. Voici le code:
Public Sub tmrEnemyMove_Tick(sender As Object, e As EventArgs) Handles tmrEnemyMove.Tick
Dim koopaAnimation As Boolean
For Each enemy As enemy In lstEnemy
enemy.enemy.Left = enemy.enemy.Left - 20
If enemy.enemy.Tag = "koopa" Then
enemy.enemy.Image = Image.FromFile(Application.StartupPath + "\Graphics\koopa" + Trim(Str(koopaPosition)) + ".png")
If koopaAnimation = False Then
If koopaPosition = 0 Then
koopaPosition = 1
Else
koopaPosition = 0
End If
End If
koopaAnimation = True
End If
If picMario.Left < enemy.enemy.Left AndAlso enemy.enemy.Left < picMario.Right Or picMario.Left < enemy.enemy.Right AndAlso enemy.enemy.Right < picMario.Right Then
If picMario.Top < enemy.enemy.Top AndAlso enemy.enemy.Top < picMario.Bottom Or picMario.Top < enemy.enemy.Bottom AndAlso enemy.enemy.Bottom < picMario.Bottom Then
'MsgBox("Collision")
End If
End If
If enemy.enemy.Left < 0 Then
lstEnemy.Remove(enemy)
Me.Controls.Remove(enemy.enemy)
End If
Next
End Sub
3 Réponses :
.net ne l'aime vraiment pas lorsque vous modifiez une collection lorsque vous êtes au milieu de l'énumération de son contenu. Vous pouvez essayer de modifier votre foreach code> en boucle code> pour code> en boucle si vous envisagez de supprimer des éléments de la collection comme celle-ci. P>
Vous ne pouvez pas supprimer un objet d'une collection lors de l'énumération. Vous ne pouvez pas du tout modifier la collection. Cela provoquera une erreur ( la collection a été modifiée; l'opération de dénombrement peut ne pas exécuter em>). Mais vous pouvez ajouter les objets que vous souhaitez supprimer / supprimer à une autre collection: Une autre option consiste à utiliser un Cela ne posera pas cette erreur mais Ce n'est pas aussi lisible. Vous devez partir de dernier mais non le moindre, vous pouvez utiliser lstEnemy.RemoveAll(Function(enemy) enemy.enemy.Left < 0)
pour la boucle code> et la boucle en arrière: p> list.count - 1 code> à 0 code> car vous souhaitez supprimer des éléments qui modifieraient la propriété comptent code> et un index qui était Disponible avant que l'élément ait été supprimé des causes maintenant un argumentoutofrangeException code>. p> list.removeall code> : p> For i As Int32 = lstEnemy.Count - 1 To 0 Step -1
Dim enemy = lstEnemy(i)
' ... '
If enemy.enemy.Left < 0 Then
lstEnemy.Remove(enemy)
Me.Controls.Remove(enemy.enemy)
End If
Next
Une autre option est d'utiliser un certain temps. très bonne réponse
Un exemple avec cadre d'entité (Elementat (I)):
for (int i = 0; i < db.Itens.Count(); i++)
{
Item item = db.Itens.ElementAt(i);
if (item.Id == 0) // put a condition
{
db.Itens.Remove(item);
i--;
}
}
Vous ne pouvez pas changer la collection comme celle-ci tout en bouclant, pour des raisons évidentes si vous y réfléchissez. Obtenez une référence à l'objet lors de la boucle, puis supprimez ensuite