C# Problem mit foreach-Schleife



  • Ich habe eine enemy und eine bullet-Klasse gemacht die beide fast identisch aussehen. Das Ganze läuft auch, jedoch nicht so wie es eigentlich gedacht war.
    Jeder Gegner soll in gleichmäßigen Abständen Kugeln schießen. Deshalb habe ich die float Variablen fNextShoot und fShootFreq erstellt. Erst wenn fNextShoot größer als fShootFreq ist soll ein neuer Schuss gestartet werden.
    Im Moment ist es aber so dass nur der erste Gegner Kugeln schießen kann. Außerdem fliegen die Kugeln am Anfang diagonal nach unten rechts, einige Zeit später fliegen sie auf einmal nur noch diagonal nach oben links und der zeitliche Abstand zwischen den Kugeln ist auch nicht mehr derselbe wie am Anfang.
    Ich gehe davon aus dass der Fehler in der ersten foreach-Schleife der Update-Methode liegt. Ich weiß aber nicht was ich an Schleife ändern soll.
    Was soll ich an dem Code ändern damit jeder Gegner in gleichmäßigen Abständen schießt?

    public class map
    {
            Texture2D myEnemy, myBullet, hintergrund;
    player Player;
    List<enemy> enemieslist = new List<enemy>();
    List<bullet> bulletslist = new List<bullet>();
    
            float fNextShoot = 0.0f;float fShootFreq = 1.0f;
    float fNextEnemy = 0.0f;
    float fEnemyFreq = 2.0f;
    
            Vector2 Startposition = new Vector2(200, 200);
    Vector2 AktuelleGegnerPos;
    
            GraphicsDeviceManager graphicsDevice; 
    
        public map(GraphicsDeviceManager device) 
        { 
    graphicsDevice = device; 
        } 
    
            public void Load(ContentManager content)
        {
        myEnemy = content.Load<Texture2D>("gegner");
        myBullet = content.Load<Texture2D>("kugel"); 
        hintergrund = content.Load<Texture2D>("background");
        Player = new player(graphicsDevice);
        Player.Load(content);
        }
    
            public void Update(GameTime gameTime)
            {
                this.fNextShoot += (float)gameTime.ElapsedGameTime.TotalSeconds;
                foreach (enemy enemies in enemieslist)
                {
                    enemies.Update(gameTime, this.graphicsDevice, Player.spielershape.Position);
                    AktuelleGegnerPos = enemies.Kugelstartposition;
                    if (this.fNextShoot > fShootFreq)
                    {
                        Vector2 vShootMove;
                        vShootMove = Vector2.Normalize(Player.spielershape.Position - AktuelleGegnerPos) * 200f;
                        bullet bullets = new bullet(AktuelleGegnerPos, vShootMove, Player.spielershape.Position);
                        bulletslist.Add(bullets);
                     this.fNextShoot -= fShootFreq; 
                    }
                }
    
                List<enemy> tempenemylist = new List<enemy>();
    
                foreach (enemy enemies in enemieslist)
                {
                    if (!enemies.bRemove)
                  {
                        tempenemylist.Add(enemies);
                    }
                }
    
                enemieslist = tempenemylist;
    this.fNextEnemy += (float)gameTime.ElapsedGameTime.TotalSeconds;
                if (this.fNextEnemy > fEnemyFreq)
                {
                    Vector2 vShootMove;
                    vShootMove = Vector2.Normalize(Player.spielershape.Position - Startposition) * 100f;
    enemy enemies = new enemy(Startposition,
    vShootMove, Player.spielershape.Position);
                   enemieslist.Add(enemies);
                    this.fNextEnemy -= fEnemyFreq;
                }
    
                foreach (bullet bullets in bulletslist)
                {
    bullets.Update(gameTime, this.graphicsDevice);
                }
    
                List<bullet> tempbulletlist = new List<bullet>();
    
                foreach (bullet bullets in bulletslist)
                {
                    if (!bullets.bRemove)
                    {
                       tempbulletlist.Add(bullets);
                    }
                }
    
                bulletslist = tempbulletlist;
            }
    


  • Erstmal so im voraus,

    A bist du hier glaub flasch du machst ja XNA und Spieleprogrammierung
    B Der Titel ist Recht irreführend

    Was solldas spiel denn machen? Wohin sollen die Kugeln denn eigendlich fliegen?

    vShootMove = Vector2.Normalize(Player.spielershape.Position - Startposition) * 100f;
    

    Bewegt das deine Kugel? Schätze mal Player.spielershape.Position ist
    kleiner als Startposition weshalb die kugel wohl nach unten links fliegt.

    Und deine erst foreach wird ja erstmal garnicht betreten
    erst bei

    if (this.fNextEnemy > fEnemyFreq)
    

    fürgst du einen enemy hinzu.
    und ziehst dann 2 ab

    Jetzt geht der erst in deine erste foreach
    dann steht da

    if (this.fNextShoot > fShootFreq)
    

    fNextShoot ist jetzt schon über 2 du zieht aber nur 1 ab
    fNextEnemy ist bei > 0 wird ausgelassen und der geht aber wieder in
    die erste foreach da sie ja über 1 ist....

    Lass dir mal mehr ausgaben mit console writeline machen.

    Was in den Update methoden deiner klassen passiert kein plan...


Anmelden zum Antworten