2D Spiel - Problem mit dem Nachladen der Waffe



  • Hey,
    bei meinem 2D-Shooter, den ich mit der MS-XNA programmiere, habe ich momentan ein Problem mit dem Nachladen der Waffe.
    Der Code sieht wie folgt aus

    public void Update (GameTime gameTime)
    {
         reloadTimer += (int)gameTime.ElapsedGameTime.TotalSeconds;
    
         if (weaponList[currentWeapon].checkAmmu() == true)
                {
                    weaponList[currentWeapon].isReloading = true;
                    weaponList[currentWeapon].leftBullets = weaponList[currentWeapon].magazineSize;
    
                    reloadTimer = 0;
    
                    if (reloadTimer >= 3)
                    {
                        weaponList[currentWeapon].isReloading = false;
                    }
    
                }
    
                // Schuss
                if (mouseState.LeftButton == ButtonState.Pressed)
                {
                    if (!weaponList[currentWeapon].isReloading)
                    {                
                        Shoot();
                    }
                }
       }
    
       public bool checkAmmu()
            {
                if (leftBullets == 0)
                {
                    return true;                
                }
                else
                {
                    return false;
                }
            }
    

    Erklärung:
    Die Methode checkAmmu() kontrolliert, ob noch Patronen im Magazin sind; Sind keine mehr drin so returnt sie "true".
    Ist also keine Munition mehr in der Waffe wird "isReloading" auf "true" gesetzt, wodurch der Spieler nichtmehr schießen kann.
    Die Patronen im Magazin (leftBullets) werden dann wieder auf das Maximum gesetzt (magazineSize).
    Um den ganzen Prozess nicht sofort ablaufen zu lassen habe ich den "reloadTimer" eingebaut der am Anfang auf 0 gesetzt wird.
    Eigentlich müsste er jetzt bis 3 zählen, da er ja die vergangene Zeit misst (reloadTimer += (int)gameTime.ElapsedGameTime.TotalSeconds; ).

    Starte ich das ganze, lädt der Spieler zwar nach, aber kann nichtmehr schießen.
    Das Problem liegt also irgendwo im Timer.

    Danke für die Hilfe.



  • ...



  • Neben dem was Swordfish schon angemerkt hat:

    D.J. schrieb:

    Eigentlich müsste er jetzt bis 3 zählen, da er ja die vergangene Zeit misst (reloadTimer += (int)gameTime.ElapsedGameTime.TotalSeconds; ).

    Ist das so? Wenn der Code das tut, was er besagt, dann misst er nicht die vergangene Zeit, sondern irgendeinen Unsinnswert. Wenn die Funktion 60 mal pro Sekunde aufgerufen wird und das Spiel schon eine Stunde läuft, sind für deinen Timer ganze 60 Stunden vergangen.



  • Ich muss mich verbessern, trotz den irreführenden Bezeichnern macht der Code vermutlich das gewünschte, zumindest wenn du nicht nach int casten würdest.
    So ist es eher so, dass für deinen Timer gar keine Zeit vergeht (selbst wenn du ihn nicht wie jetzt sofort wieder manuell auf 0 setzt), weil aller Wahrscheinlichkeit nach bei keinem Aufruf schon eine ganze Sekunde vergangen ist.
    Naja egal, hab keine Ahnung von XNA, überlass ich lieber anderen.



  • Danke für die Antworten erstmal! 🙂

    Habe das mal ausgetestet und dabei herausgefunden, dass das Problem ist, dass mein reloadTimer immerwieder auf 0 gesetzt wird wärhend ich keine Munition mehr habe.
    D.h. die ganze if-Anweisung wird immerwieder durchgeführt und dadurch kann sich mein Timer nie erhöhen.

    Hätte jemand vielleicht einen Lösungsansatzdafür, wie ich den Timer nur Anfangs auf 0 setzen kann, wenn die Munition 0 ist?

    if (weaponList[currentWeapon].checkAmmu())
                {
                    weaponList[currentWeapon].isReloading = true;
                    weaponList[currentWeapon].leftBullets = weaponList[currentWeapon].magazineSize;
    
                    reloadTimer = 0;
    
                    if (reloadTimer >= 3)
                    {
                        weaponList[currentWeapon].isReloading = false;
                    }
    
                }
    


  • M.E. müßtest du zuerst prüfen, ob er am "Reloaden" ist (und dann den Timer erhöhen) und nur wenn nicht, dann die Ammu prüfen (und dann ggbf. das "Reloaden" setzen).



  • M.E. müßtest du zuerst prüfen, ob er am "Reloaden" ist (und dann den Timer erhöhen) und nur wenn nicht, dann die Ammu prüfen (und dann ggbf. das "Reloaden" setzen).

    if (weaponList[currentWeapon].checkAmmu())
                {
                    weaponList[currentWeapon].isReloading = true;
                    weaponList[currentWeapon].leftBullets = weaponList[currentWeapon].magazineSize;
    
                    reloadTimer = 0;
                }
    
                if (reloadTimer >= 3)
                {
                    weaponList[currentWeapon].isReloading = false;
                }
    

    Habe das ganze jetzt getrennt und es funktioniert.
    Danke für den Gedankenanstoß! 👍 🙂


Log in to reply