JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=a15eba6c1df452cad7cd2beb98adfe22Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Sprite Texturen verwalten

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Loigie
Junior JLI'ler



Anmeldedatum: 29.06.2004
Beiträge: 52
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 19:18    Titel: Sprite Texturen verwalten Antworten mit Zitat

Ich wollte mal nachfragen wie andere die Texturen für Sprites verwalten.

Also ich hatte mir das so vorgestellt das man die einzelnen Animatioms Sequenz unter einem Animations Namen(z.B. WALK_RIGHT) Speicher unter dem dann wiederum die einzelen Texturen in der richtigen Reihenfolge gespeichert werden. So das man nur noch den Animations Namen und die nächste Textur Nummer wissen muss.
Dabei kommt es mir auch darauf an das ich mich nicht festlegen muss wie viele Sequenzen ich werwende.
Also ware es doch am besten mit dar Klasse vector aus der STL zu arbeiten aber wie realisiere ich das Question
Im Buch ist das Thema nur sehr kurz beschrieben.
Ein bischen Code wär nicht schlecht schließlich müsste doch irgendjemand das Problem auch schon mal gehabt haben.

Schon mal danke für alle Antworten im vorraus.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 19:39    Titel: Antworten mit Zitat

Code:

#include <map>
#include <vector>
#include <string>

struct Texture {...};

std::map<std::string, std::vector<Texture*> > Textures;


Sowas in der Art meinst du denk ich Wink

Die Map speichert praktisch immer Vectoren von Texturen...
Wobei jeder Vector eine Animation repräsentiert.
std::list's oder std::slist's wären evt. noch sinnvoller... Smile

Der Zugriff würde mit Vectoren so erfolgen:
Code:
Textures["walk_right"][2].blabla
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

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

Ich mache das so das ich in meiner Sprite klasse
einen vector AnimationsSewuenzen habe un in diesem Vector dann eine Struktur steht mit allen wichtigen daten für die Animationssequenz wie zum beispiel die Texturen dauer verhalten...
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Loigie
Junior JLI'ler



Anmeldedatum: 29.06.2004
Beiträge: 52
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 20:51    Titel: Antworten mit Zitat

Sehe ich richtig das man bei GreveN's code beispiel vorher wissen muss wiefiel Sequenzen ich verwende und dementsprechent die Structuren anlegen muss? Geht das nicht eleganter so das wenn ich eine neue(unbekannte) Sequenze meiner Funktion übergebe diese selbstständig ein neue Structur anlegt?(Würde ja gehen nur wie soll ich den Structur Namen für jede neue Structur ändern?)

FallenAngel84 du müsstest doch wenn du mehrere Sequenzen verwendest auch mehrere vectoren anlegen oder speicherst du von wo bis wo die Texturen einer Sequenz in dem vector gespeichert sind?

Also nicht das das nicht alles funktionieren würde, ich denke halt nur das wenn man mal ein anderes Projekt anfängt wäre es schon wenn man die Sprite Klasse einfach kopieren könnte und nichts mehr an ihrem Code ändern muss. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 21:28    Titel: Antworten mit Zitat

Versteh ich nicht... =/

Hab die struct eigentlich nur angelegt, weil ich nich wusste welche API du nutzt, du musst das natürlich nicht so machen, kannst auch direkt LPD3DTEXTURE's, GLuint's, SDL_Surface's oder was weiß ich speichern, aber oftmals wirst du auf eine Struktur dieser Art zurückkommen, weil du parallel zu der eigentlichen Grafik noch irgendwelche anderen Infos speichern musst...

Du kannst, wenn du das so machst super easy neue "Sequenzen" anlegen...
Code:
Textures["Name der neuen Sequenz"][index] = blabla;


Die Sequenz legt sich natürlich am besten in einer Schleife an, aber das ist ja klar... Wink

[Edit:] Wäre gut, wenn du mal definierst, was genau bei dir eine "Sequenz" ist, ich gehe mal davon aus ein Array, bzw. ein Vector von Sprites... Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 07.12.2004, 21:33    Titel: Antworten mit Zitat

In der CSprite.h Klassendefinition:
Code:
float m_AnimationSpeed;

       float m_AnimationDelay;

       int m_CurrentImage;

      typedef struct tAnimList
      {
         std::string name;
         vector<LPDIRECT3DTEXTURE9> m_AnimationVec;
         int   m_Width;
         int   m_Height;
         bool bKillOnEnd;
         bool bKill;
      };
      vector<tAnimList> m_AnimSet;

      int m_CurrentAnimSet;


In CSprite.cpp:

Code:
void CSprite::AddTexture(LPDIRECT3DTEXTURE9 lpTexture)
{
   if(m_CurrentAnimSet<0 || lpTexture==NULL)
      return;
    // Beschreibung des zu Grunde liegenden Surfaces
    D3DSURFACE_DESC desc;

    lpTexture->GetLevelDesc(0,&desc);
   
    // Breite und Höhe speichern
    m_AnimSet[m_CurrentAnimSet].m_Width  = desc.Width;
    m_AnimSet[m_CurrentAnimSet].m_Height = desc.Height;
   
    // Zeiger auf die Textur speichern
    m_AnimSet[m_CurrentAnimSet].m_AnimationVec.push_back(lpTexture);
}

// Textur für das Sprite laden und festlegen
void CSprite::AddTexture(std::string inTexture)
{
   m_ResManager->AddTexture(inTexture);
   AddTexture(m_ResManager->GetTexture(inTexture));
}

// Textur für das Sprite laden und festlegen
void CSprite::AddTexture(std::string inTexture,int start=0, int end=0)
{
   char files[1024];
   for(int i=start; i<=end; i++)
   {
      sprintf(files,inTexture.c_str(),i);
      m_ResManager->AddTexture(files);
      AddTexture(m_ResManager->GetTexture(files));
   }
   if(end-start>1)
      PlayAnimation(true);
}
void CSprite::AddTextureSet(std::string setName)
{
   //suchen
   int a=-1;
   if((a=FindAnimSet(setName))>=0)
   {
      m_CurrentAnimSet=a;
      return;
   }
   //Neues Animationsset erstellen mit Namen und so
    tAnimList newPack;
   newPack.name=setName;
   newPack.bKillOnEnd=false;
   newPack.bKill=false;
   
   //Das Teil zur liste hinzufügen
   m_AnimSet.push_back(newPack);
   //Wenn es das erste seiner art ist wird es als aktuelles Set gewählt
   if(m_CurrentAnimSet<0)
      m_CurrentAnimSet=0;
}

void CSprite::SetAnimSet(int animSet)
{
   //Das Aktuelle Animationsset festlegen
    m_CurrentAnimSet = animSet;
}

int CSprite::FindAnimSet(std::string animSet)
{
   //Ein Animationsset aus der Liste per Namen suchen
   for(int i=0; i<m_AnimSet.size(); i++)
      if(animSet==m_AnimSet[i].name)
         return i;
   //Wurde nichts gefunden dann gebe -1 als Fehlercode zurück
   return -1;
}


Weiss jezz nicht ob noch was dabei fehlt.

Verwenden tu ich das dann so:

Code:
CSprite sprite;
sprite.AddTextureSet("Laufen"); //Animationsset mit den Namen Laufen erstellen
sprite.AddTexture("Laufen%d.tga,0,10); //Dazugehörige Texturen erzeugen wenn nötig und dann verweis speichern

_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Loigie
Junior JLI'ler



Anmeldedatum: 29.06.2004
Beiträge: 52
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 07.12.2004, 21:34    Titel: Antworten mit Zitat

Sorry mein fehler hatte mich vertan, manchmal dauert es halt länger bis man was versteht Rolling Eyes


Dann Probierich das doch mal gleich aus Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum