C# Problem mit Animation in XNA

Cartman999

Lieutenant
Registriert
Aug. 2007
Beiträge
822
Ich habe eine XML Datei erstellt in der Informationen über Sprites gespeichert sind. Es handelt sich dabei um 3 Items, jedoch benutze ich nur 2 verschiedene png Dateien. "light" ist ein normales Bild und "aniii" die Animation. In meiner Sprite-Klasse wird jetzt die XML Datei ausgelesen und jedem Sprite seine Werte zugeteilt. Bei normalen Bildern klappt auch alles wunderbar, jedoch funktionieren Animationen noch nicht richtig. Das Problem ist dass Animationen nicht Bild für Bild(die Animation besteht aus 21 Bildern) abgespielt werden, in einer Sekunde wird ein paar mal die gesamte Animationsdatei angezeigt und anschließend sofort wieder ausgeblendet. Ich verstehe aber nicht was falsch ist:( Die Variable "animationframes" gibt an aus wie vielen Bildern eine Animation besteht. Außerdem habe ich vor dem eigentlichen Animationscode noch diese Zeile geschrieben: if (animationframes > 0) Ich bin mir nicht sicher ob ich die Zeile überhaupt brauche, ich wollte nur prüfen ob es sich bei dem Sprite überhaupt um eine Animation handelt, denn wenn die Variable "animationframes" den Wert 0 hat handelt es sich nur um ein normales Bild.
Die beiden Variablen "Z" und "wave" musste ich einbauen da am Anfang nicht alle Sprites geladen werden sollen, einige Sprites dürfen erst zu einem späteren Zeitpunkt erscheinen.
Ich bekomme nirgends eine Fehlermeldung, das einzige was nicht richtig funktioniert sind Animationen.
Ich habe das komplette Projekt hier hochgeladen: http://depositfiles.com/files/heydec05b
 
Zuerst ein Tipp unabhängig vom Ausgangsproblem: Man kann hier Anhänge erstellen. Und potenzielle Helfer hassen es erstmal von einem One-Click-Hoster kleine Dateien herunterladen zu müssen, wenn man sie stattdessen auch einfach hier hochladen kann.

Ich habe mir das Projekt mal angesehen. Ich habe es schonmal getan, und werde es dir nochmal sagen, auch in diesem Thread:
Da du offensichtlich keine Ahnung von Programmierung im Allgemeinen, objektorientierte Programmierung und überhaupt hast, kann ich dir nur dringenst dazu raten, erstmal Grundlagen zu lernen.
http://openbook.galileocomputing.de...01_001.htm#mj961be4cf36ccf494944afbc70445efdc
Ansonsten ist das kurz- und langfristig für die Katz und eine ziemliche Aufwandsverschwendung.
 
Hier der Code der Sprite-Klasse. Meiner Meinung nach ist es besser das komplette Projekt runter zu laden, da man den Fehler so schneller findet weil man sofort sieht was mit der Animation nicht stimmt.
Code:
namespace SharedContent
{
    public class Sprite
{
    private MouseState oldState;
    int animIndex = 0;
    int animLast = 0;
    int Z = 0;

    int texID;
    int wave;
    int speed;
   
        
    Vector2 position;
    int animationframes;
    float rotation;
    Vector2 scale;

    string textureAsset;
    Texture2D texture;
    SpriteFont leben;

    int health;


    public int TexID
    {
        get { return texID; }
        set { texID = value; }
    }


    public int Wave
    {
        get { return wave; }
        set { wave = value; }
    }

    public int Speed
    {
        get { return speed; }
        set { speed = value; }
    }

   public Vector2 Position
    {
        get { return position; }
        set { position = value; }
    }

   public int Animationframes
   {
       get { return animationframes; }
       set { animationframes = value; }
   }

    public float Rotation
    {
        get { return rotation; }
        set { rotation = value; }
    }

    public Vector2 Scale
    {
        get { return scale; }
        set { scale = value; }
    }

    public string TextureAsset
    {
        get { return textureAsset; }
        set { textureAsset = value; }
    }

    public int Health
    {
        get { return health; }
        set { health = value; }
    }
 

    [ContentSerializerIgnore]
     public Texture2D Texture
     {
        get { return texture; }
     }
    
    [ContentSerializerIgnore]
    public SpriteFont Leben
    {
        get { return leben; }
    }
   

    public void Load(ContentManager content)
    {
        texture = content.Load<Texture2D>(textureAsset);
        leben = content.Load<SpriteFont>("Arial");

       
    }

        public void Update(GameTime gameTime)
    {     
        MouseState newState = Mouse.GetState();      
        Z += 1;
        if (Z >= wave)
        {
        position.X += speed;

          if (animationframes > 0)
          {
             animLast += gameTime.ElapsedGameTime.Milliseconds;
             if (animLast >= 60)
             {
             animIndex++;
               if (animIndex == animationframes) 
               {
               animIndex = 0;
               animLast = 0;
               }
             }
          }
        } 
        
        if (newState.LeftButton == ButtonState.Pressed && oldState.LeftButton == ButtonState.Released)
        {          
            health -= 1;           
        }
        oldState = newState;           
    }

    public void Draw(SpriteBatch batch)
    {
        if ( Z > wave)
{
        batch.Draw(
            texture, 
            position, 
            new Rectangle(animIndex * texture.Width,0,texture.Width,texture.Height),
            Color.White, 
            rotation, 
            Vector2.Zero,
            scale,
            SpriteEffects.None, 
            0f);

       batch.DrawString(leben,health.ToString(), new Vector2(position.X, position.Y+20), Color.White);
}
        }
    }
}
 
Ja das ist toll und ist es auch, aber das war gar nicht Teil meiner ersten Aussage.
 
KamehamehaX10 schrieb:
Ja das ist toll und ist es auch, aber das war gar nicht Teil meiner ersten Aussage.
Wenn du so ein toller Programmierer bist weißt du doch sicher wo der Fehler liegt und könntest mich darauf hinweisen so dass ich es nächstes Mal besser machen könnte. Oder weißt du es selbst nicht???
 
Ich habe Interesse daran dir bestmöglich zu helfen. Wenn ich dir das korrigiere (in diesem Fall übrigens Plural, "die Fehler") hast du absolut gar nichts davon, und den fertigen Code wird dir hier aus gutem Grund auch niemand liefern.
Möchtest du das können bzw. erlernen, ja oder nein? Wenn ja, dann lies dich dringenst in die Grundlagen ein, danach wirst du dir dann selbst an den Kopf fassen, wenn du deine Projekte siehst.
Das ist halt der einzige Weg. Wenn du selbst weder was lernen, noch machen willst, wieso bist du dann hier?

Kein Grund persönlich zu werden, aber daran erkennt man, dass Hopfen und Malz verloren sind.
 
Zuletzt bearbeitet:
Einen kleinen Tipp könnte man aber wenigstens geben. Wenn ich z.B. wüsste dass die Fehler nur in der Update Methode der Sprite Klasse liegen dann bräuchte ich nur diesen Teil genauer zu analysieren.
 
In der Logik und der Aufgabenteilung, im Stil und in der Sauberkeit, und in der Update- und der Draw-Methode.

Tu dir doch bitte den Gefallen und sieh ein, dass du erstmal die Grundlagen lernen solltest. Du fängst beim Häuserbau ja auch nicht beim Dach an.
 
Zurück
Oben