ProfilProfil
 Registrieren
 Login
Bild der WocheBild der Woche

(von Backslider)
Kommentare (0)
****

Weitere
User onlineBenutzer online
Gäste online: 11
Mitglieder online: SteveKr
Registrierte Mitglieder: 2117
Neustes Mitglied: vitapen

Grundlegende OOP in XNA für Einsteiger

Neue Antwort erstellen

Kommentare zu Grundlegende OOP in XNA für Einsteiger

Kommentare zum Artikel Grundlegende OOP in XNA für Einsteiger.
 

 

Autor Nachricht
 
 
chrische5
Member


Anmeldedatum: 10.11.2007
Beiträge: 1062

Antworten mit Zitat
BeitragVerfasst am: 26.07.2008, 10:00    Titel:

Hallo

Wenn du schon Unterstriche für Member nimmst, was ich persönlich für Unsinn halte, dann solltest du das wenigstens überall machen. Ansonsten eine gute Übersetzung, die sicher einigen absoluten Anfänger helfen wird.

chrische
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


goldenboy
Member


Anmeldedatum: 28.06.2008
Beiträge: 25

Antworten mit Zitat
BeitragVerfasst am: 27.01.2009, 19:22    Titel: OOP - Problem

Hallo, habe folgendes Problem:



Ich habe eine Basisklasse "Sprite", und zwei untergeordnete Klassen "Animiertes Sprite" und "Meteorit".
Die Klasse "Meteorit" erbt von "Animiertes Sprite" und "Animiertes Sprite" erbt widerum von der Klasse "Sprite".
Die Klasse "Animiertes Sprite" enthält einen Konstruktor, eine Update-Methode um zum nächsten Frame eines Sprite-Sheets zu springen und eine Draw-Methode um den neuen Frame zu zeichnen.
Erstelle ich in der Game-Klasse eine Instanz von der "Meteorit-Klasse", wird mein Sprite auch ordnungsgemäß animiert.
Aber wie füge ich in der "Meteorit-Klasse" zusätzlich noch eine Methode ein, um das animierte Sprite auch noch zu bewegen ?

Code:

public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Meteorit cMeteorit;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            cMeteorit = new Meteorit(10, 2, 20);
            cMeteorit.Position = new Vector2(100, 200);
            base.Initialize();
        }
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            cMeteorit.Texture = Content.Load<Texture2D>("Sprites/asteroid");
        }
        protected override void Update(GameTime gameTime)
        {
            cMeteorit.Update(gameTime);
            base.Update(gameTime);
        }
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();
            cMeteorit.Draw(spriteBatch);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }//ENDE Game1.cs

 public class Sprite
    {
        private Texture2D texture;
        protected Vector2 position;

        public Texture2D Texture
        {
            get{ return texture; }
            set{ texture = value;}
        }
        public Vector2 Position
        {
            get{ return position;}
            set{ position = value;}
        }
        public virtual void Update(GameTime gametime)
        {
        }
        public virtual void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, new Vector2(position.X, position.Y), Color.White);
        }
    }//ENDE Sprite.cs

  public class AnimiertesSprite : Sprite
    {   
        //protected : abgeleitete Klassen Zugriff erlaubt
        protected int anzahlSpalten;
        protected int anzahlReihen;
        protected float bilderProSekunde;
        private float gesamtZeit;
        protected int aktuelleSpalte;   
        protected int aktuelleReihe;   

        //Konstruktor
        public AnimiertesSprite(int anzahlSpalten, int anzahlReihen, float bilderProSekunde)
        {
            aktuelleSpalte = 0;
            aktuelleReihe = 0;
            gesamtZeit = 0;
            this.anzahlReihen = anzahlReihen;
            this.anzahlSpalten = anzahlSpalten;
            this.bilderProSekunde = bilderProSekunde;

            this.bilderProSekunde = 1 / bilderProSekunde;
        }

        public override void Update(GameTime gametime)
        {
            gesamtZeit = gesamtZeit + (float)gametime.ElapsedGameTime.TotalSeconds;

            if (gesamtZeit > bilderProSekunde)
            {
                gesamtZeit -= bilderProSekunde;
                aktuelleSpalte += 1;

                if (aktuelleSpalte >= anzahlSpalten)
                {
                    aktuelleSpalte = 0;
                    aktuelleReihe += 1;
                }

                if (aktuelleReihe >= anzahlReihen)
                    aktuelleReihe = 0;
            }
        }

        public override void Draw(SpriteBatch spritebatch)
        {
            spritebatch.Draw(Texture, new Vector2 (position.X, position.Y), new Rectangle(aktuelleSpalte * (Texture.Width/anzahlSpalten), aktuelleReihe * (Texture.Height/anzahlReihen), (Texture.Width/anzahlSpalten), Texture.Height/anzahlReihen), Color.White);
        }
    }//ENDE AnimiertesSprite.cs

  public class Meteorit : AnimiertesSprite
    {
       public Meteorit(int tAnzahlSpalten, int tAnzahlReihen, int tBilderProSekunde) : base(tAnzahlSpalten, tAnzahlReihen, tBilderProSekunde) {}
    }//ENDE Meteorit.cs
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


qriz
Member


Anmeldedatum: 06.10.2008
Beiträge: 123

Antworten mit Zitat
BeitragVerfasst am: 27.01.2009, 19:45    Titel:

Huch, wozu eine neue Methode, wenn du einfach den Vector2 Position verändern kannst??
_________________
arr, ich bin ein Pirat.
korregieren sie mich wenn das nicht stimmt, Herr Schäuble!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer


goldenboy
Member


Anmeldedatum: 28.06.2008
Beiträge: 25

Antworten mit Zitat
BeitragVerfasst am: 27.01.2009, 19:55    Titel:

naja, wenn ich in der meteorit-Klasse den Vector2 Position verändere, dann wird das Sprite nicht mehr animiert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


qriz
Member


Anmeldedatum: 06.10.2008
Beiträge: 123

Antworten mit Zitat
BeitragVerfasst am: 28.01.2009, 17:25    Titel:

naja, die Updatemethode muss natürlich trotzdem noch weiter aufgerufen werden...
_________________
arr, ich bin ein Pirat.
korregieren sie mich wenn das nicht stimmt, Herr Schäuble!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer


Queri
Member


Anmeldedatum: 29.08.2008
Beiträge: 232

Antworten mit Zitat
BeitragVerfasst am: 28.01.2009, 17:34    Titel:

Noch ein Tipp:

spriteBatch.Draw(texture, new Vector2(position.X, position.Y), Color.White);

warum "new Vector2" ? Dies tuts auch und ist Resourcenschonender und damit auch schneller:

spriteBatch.Draw(texture, position, Color.White);
_________________
Tutorials zu XNA und Farseer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


goldenboy
Member


Anmeldedatum: 28.06.2008
Beiträge: 25

Antworten mit Zitat
BeitragVerfasst am: 28.01.2009, 19:04    Titel:

Zitat:


naja, die Updatemethode muss natürlich trotzdem noch weiter aufgerufen werden...


Jo, aber wie ruft man die Update-Methode auf ? Wenn ich Sie override, überschreibt sie ja "Update" von der übergeordneten Klasse "AnimiertesSprite.cs", und das Sprite wird logischerweise auch nicht animiert.
Wenn ich sie einfach nur mit public void Update (Gametime gametime) { position.X +=1; } aufrufe dann wird der Meteorit auch nicht animiert und der Compiler spuckt mir ne Warnung aus.


Code:

public class Meteorit : AnimiertesSprite
    {
       public Meteorit(int tAnzahlSpalten, int tAnzahlReihen, int tBilderProSekunde) : base(tAnzahlSpalten, tAnzahlReihen, tBilderProSekunde)
       {
       }

//überschreibt "Update" von übergeordneter Klasse "AnimiertesSprite.cs", Sprite wird demnach logischerweise auch nicht animiert
public override void Update(GameTime gametime)
        {
            position.X += 1;
        }


    }//ENDE Meteorit.cs




Zitat:

warum "new Vector2" ? Dies tuts auch und ist Resourcenschonender und damit auch schneller:


Joa stimmt Query hatte ich übersehen, danke für den Tipp.


Zuletzt bearbeitet von goldenboy am 28.01.2009, 19:27, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


qriz
Member


Anmeldedatum: 06.10.2008
Beiträge: 123

Antworten mit Zitat
BeitragVerfasst am: 28.01.2009, 19:25    Titel:

Code:
base.Update(gameTime)


Dir fehlt es an Grundwissen.. Wink
_________________
arr, ich bin ein Pirat.
korregieren sie mich wenn das nicht stimmt, Herr Schäuble!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen ICQ-Nummer


goldenboy
Member


Anmeldedatum: 28.06.2008
Beiträge: 25

Antworten mit Zitat
BeitragVerfasst am: 28.01.2009, 20:01    Titel:

hmm. hab gedacht das wenn ich ne Methode einer übergeorneten Klasse override, diese Methode dann auch sozusagen unwiderruflich futsch ist... Muss mir mal das mit der Vererbung nochmal anschaun. Jedenfalls vielen dank für deine Geduld Wink

Zuletzt bearbeitet von goldenboy am 08.02.2009, 01:50, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


chrische5
Member


Anmeldedatum: 10.11.2007
Beiträge: 1062

Antworten mit Zitat
BeitragVerfasst am: 28.01.2009, 20:06    Titel:

Hallo

Wenn sie futsch wäre, könnte du la Polymorphie komplett vergessen.

chrische
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden


Beiträge der letzten Zeit anzeigen:   
 
Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de