8
votes

Supprimer un objet quand dans A pour chaque boucle

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


1 commentaires

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


3 Réponses :


1
votes

.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 en boucle pour en boucle si vous envisagez de supprimer des éléments de la collection comme celle-ci.


0 commentaires

15
votes

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:

lstEnemy.RemoveAll(Function(enemy) enemy.enemy.Left < 0)
  • Ajouter li>
  • CLEAR LI>
  • insérer li>
  • INSERTRANGE LI>
  • supprimer li>
  • REMOVERANGE LI>
  • Removeat LI>
  • inverse li>
  • [le setter indexer] li>
  • Trier li> ul>

    Une autre option consiste à utiliser un pour la boucle code> et la boucle en arrière: p> xxx pré>

    Cela ne posera pas cette erreur mais Ce n'est pas aussi lisible. Vous devez partir de 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>

    dernier mais non le moindre, vous pouvez utiliser 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
    


1 commentaires

Une autre option est d'utiliser un certain temps. très bonne réponse



0
votes

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--;
    }
}


0 commentaires