| |
chrische5 Member
Anmeldedatum: 10.11.2007 Beiträge: 1062
|
Verfasst 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 |
|

|
goldenboy Member
Anmeldedatum: 28.06.2008 Beiträge: 25
|
Verfasst 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 |
|

|
qriz Member
Anmeldedatum: 06.10.2008 Beiträge: 123
|
Verfasst 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 |
|

|
goldenboy Member
Anmeldedatum: 28.06.2008 Beiträge: 25
|
Verfasst 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 |
|

|
qriz Member
Anmeldedatum: 06.10.2008 Beiträge: 123
|
Verfasst 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 |
|

|
Queri Member
Anmeldedatum: 29.08.2008 Beiträge: 232
|
Verfasst 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 |
|

|
goldenboy Member
Anmeldedatum: 28.06.2008 Beiträge: 25
|
Verfasst 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 |
|

|
qriz Member
Anmeldedatum: 06.10.2008 Beiträge: 123
|
Verfasst am: 28.01.2009, 19:25 Titel: |
|
| Code: | | base.Update(gameTime) |
Dir fehlt es an Grundwissen..  _________________ arr, ich bin ein Pirat.
korregieren sie mich wenn das nicht stimmt, Herr Schäuble! |
|
| Nach oben |
|

|
goldenboy Member
Anmeldedatum: 28.06.2008 Beiträge: 25
|
Verfasst 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 
Zuletzt bearbeitet von goldenboy am 08.02.2009, 01:50, insgesamt einmal bearbeitet |
|
| Nach oben |
|

|
chrische5 Member
Anmeldedatum: 10.11.2007 Beiträge: 1062
|
Verfasst am: 28.01.2009, 20:06 Titel: |
|
Hallo
Wenn sie futsch wäre, könnte du la Polymorphie komplett vergessen.
chrische |
|
| Nach oben |
|

|
|
|
|