JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem mit Sprites

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
cito
Mini JLI'ler



Anmeldedatum: 24.03.2005
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 15:49    Titel: Problem mit Sprites Antworten mit Zitat

Hi allerseits!
Ich bin wirklich am verzweifeln, mein Code funktioniert nicht wie er soll.

Code:
CPP:
bool cInferno::blit(const char *src, const char *dest, RECT *srcrect, RECT *destrect)
{
   if (srcrect == NULL)
   {
      srcrect = new RECT;
      srcrect->left = 0;
      srcrect->top = 0;
      srcrect->bottom = mImages[*src]->imageInfo.Height;
      srcrect->right = mImages[*src]->imageInfo.Width;
   }

   if (destrect == NULL)
   {
      destrect = new RECT;
      destrect->left = 0;
      destrect->top = 0;
      destrect->bottom = mSurfaces[*dest]->imageInfo.Height;
      destrect->right = mSurfaces[*dest]->imageInfo.Height;
   }





//
//  Ab hier wirds wichtig
//
   D3DXVECTOR3 center(0,0,0);
   D3DXVECTOR3 position(destrect->left,destrect->top,0);
   D3DCOLOR modulateColor = D3DCOLOR_XRGB(255,255,255);

   
   if(FAILED(lpD3DDevice->SetRenderTarget(NULL,mSurfaces[*dest]->surface)))
   {
      MessageBox(0,"Fehler: Konnte nicht SetRenderTarget aufrufen", "Kritischer Fehler", MB_OK | MB_ICONEXCLAMATION);
      PostQuitMessage(0);
      return false;
   }

   D3DXMATRIX scale;
   D3DXMATRIX rotation;
   D3DXMATRIX SpriteMatrix;

   // skalierungs-matrix
   D3DXMatrixScaling(&scale, (float)(destrect->right-destrect->left)/(srcrect->right-srcrect->left), (float)(destrect->bottom-destrect->top)/(srcrect->bottom-srcrect->top), 1.0f);   

   // rotations-matrix
   D3DXMatrixRotationZ(&rotation, 0);

   // matrizen multiplizieren
   D3DXMatrixMultiply(&SpriteMatrix, &scale, &rotation);

   mySprite->SetTransform(&SpriteMatrix);


   mySprite->Begin(NULL);
   if (FAILED(mySprite->Draw(mImages[*src]->texture,
                        srcrect,
                        NULL,
                        &position,
                        modulateColor)))
   {
      MessageBox(0,"Fehler bei Draw", "Kritischer Fehler", MB_OK | MB_ICONEXCLAMATION);
      PostQuitMessage(0);
      return false;
   }


//
//  Ab hier wirds unwichtig
//

   mySprite->End();

   // skalierungs-matrix
   D3DXMatrixScaling(&scale, 1.0f, 1.0f, 1.0f);   

   // rotations-matrix
   D3DXMatrixRotationZ(&rotation, 0);

   // matrizen multiplizieren
   D3DXMatrixMultiply(&SpriteMatrix, &scale, &rotation);

   mySprite->SetTransform(&SpriteMatrix);



   lpD3DDevice->GetBackBuffer(0,
               0,
               D3DBACKBUFFER_TYPE_MONO,
               &backbuffer);


   if (FAILED(lpD3DDevice->SetRenderTarget(NULL,backbuffer)))
   {
      MessageBox(0,"Fehler: Konnte nicht SetRenderTarget aufrufen", "Kritischer Fehler", MB_OK | MB_ICONEXCLAMATION);
      PostQuitMessage(0);
      return false;
   }



   return true;
}



Wenn ich jetzt NULL, NULL als rects uebergebe, funktioniert alles wie geplant, die komplette srctextur wird auf die komplette destSurface geblittet. Wenn ich allerdings z.B. als src NULL angebe und als destrect {189,0,192,3}, wird die textur an irgendeine komische Stelle der Surface geblittet, bei {50,0,192,3} sieht man sogar gar nichts... Neutral

Bitte nichts ueber den Programmierstil sagen, ich hab noch nicht aufgeraeumt Very Happy Ist erstmal nur ein Test.


Zuletzt bearbeitet von cito am 27.03.2005, 17:01, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 16:36    Titel: Antworten mit Zitat

Zitat:
Ich bin wirklich am verzweifeln, mein Code funktioniert nicht wie er soll.


Wie soll er den funktionieren?

Glaubst du wirklich, jemand liest sich einfach so 2 Seiten Code durch, wenn der, der die Frage stellt, keine Mühe zeigt selbst das Problem zu lösen?

Bitte lies dir mal das durch:
Wie man Fragen richtig stellt

Ich sehe schon ich mutiere zum Patrick Very Happy
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cito
Mini JLI'ler



Anmeldedatum: 24.03.2005
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 16:54    Titel: Antworten mit Zitat

PeaceKiller hat Folgendes geschrieben:
wenn der, der die Frage stellt, keine Mühe zeigt selbst das Problem zu lösen?


*ehem*

Ich sitze seit 3 Tagen da dran und verusche eine Loesung zu finden...

Wie auch immer, ich dachte, dass was der Code koennen sollte waere alleine aus der Funktionsdeklaration schon zu ersehen:

Er soll eine QuellTextur (Eine Map mImages, auf die mit einem char zugegriffen wird und die u.A. eine texture enthaelt) den Teil der mit srcrect uebergeben wird nehmen, und ihn auf eine ZielOberflaeche (Wieder eine Map, mSurfaces, wieder mit char zugriff und enthaelt y.A. eine IDIRECT3DSURFACE9), besser gesagt auf den Teil der Zieloberflaeche, der mit destrect uebergeben wird, blitten.

Dazu rechnet die Funtkion zuallererst einmal aus, wie die Textur skaliert werden muss, damit die RECTs uebereinanderpassen, und benutzt dann die Funktion Draw() des In der Klasse cInferno enthaltenen Sprite-Objekts...

Der Teil, der nicht funktioniert, liegt meiner meinung nach mitten im Code, da wo die ganzen Matrix-Makros kommen, durch die ich nicht ganz durchblicke...

Hoffe jetzt ist alles klar! Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 16:56    Titel: Antworten mit Zitat

Erstmal danke Wink

Werden die Matrixen richtig multipliziert? (kenne mich mit D3D nicht so gut aus?)
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
cito
Mini JLI'ler



Anmeldedatum: 24.03.2005
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 17:00    Titel: Antworten mit Zitat

Wie gesagt, der MatrizenTeil gefaellt mir auch nich, hab diese Loesung hier im Forum gefunden, aber so wie es da stand muesste das hier richtig sein...

Wenn ich als Rects NULL, NULL uebergebe klappts ja auch => Er blittet die gesamte srcTextur auf die gesamte DestSurface... Also muesste es ja sostimmen, oder?!?

Neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 17:11    Titel: Antworten mit Zitat

Schau dir am besten mal Patricks Textur-Tutorial an. Dann kommst du auch gleich von dem D3DX kram weg.

PS: der wichtige Teil ist in der Datei: gamestates/intro.cpp->intro::restore

edit: nein, des war jetzt doch nicht genau das was du suchst, aber schau's dir am besten trotzdem an.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 17:16    Titel: Antworten mit Zitat

PeaceKiller
Man danke Alter, vielen dank! Jemand hat mein Tutorial weiter empfohlen. *schnief* Danke, das hab ich mir immer gewünscht *schnief vor freude*
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 20:45    Titel: Antworten mit Zitat

@cito
Zu deinem Problem. Versuch mal die beiden Matritzen andersherum zu multiplizieren.

Also statt:
CPP:
   // matrizen multiplizieren
   D3DXMatrixMultiply(&SpriteMatrix, &scale, &rotation);


das:
CPP:
   // matrizen multiplizieren
   D3DXMatrixMultiply(&SpriteMatrix, &rotation, &scale);


Das Problem wurde schon ein paar mal hier im Forum behandelt.
Zum Beispiel hier: Spriteskalierung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
cito
Mini JLI'ler



Anmeldedatum: 24.03.2005
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 22:07    Titel: Antworten mit Zitat

Also, erst mal: Die Matrizen andersherum multiplizieren bringts nicht (haette mich auch gewundert... 2x3 = 3x2 ?!) Trotzdem danke.
[edit] oh sorry KI hab nciht gewusst dass matrix multiplikation nicht kommutativ ist... Geht trotzdem nicht besser [/edit]

Patrick, deine Tutorials sind mir ein wenig zu kompliziert Very Happy
Nichts gegen dich aber ich steig halt noch nicht durch. Ich werds in ein paar Monaten nochmal probieren.

Nichtsdestotrotz muesste es doch auch mit normalen Sprites so funktionieren wie ich es haben will?! Hmm... Noch jemand andere Vorschlaege parat?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 27.03.2005, 23:04    Titel: Antworten mit Zitat

Mmh. Schade das es nich daran lag... thinking Das wär auch einfach zu schön gewesen. Wink
Mir fällt jetzt auf Anhieb nichts ein.
Du kannst mir aber mal ein Minimalbeispielprojekt mit dem Fehler schicken, wenn du willst.
Ich werd es mir dann mal angucken um den Fehler ausfindig zu machen.

martin(at)shadoware.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
cito
Mini JLI'ler



Anmeldedatum: 24.03.2005
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 28.03.2005, 16:37    Titel: Antworten mit Zitat

Vielen Dank fuer das Angebot, KI, weiss ich wirklich sehr zu schaetzen!

Aber ich habe das Problem jetzt doch geloest:
Mit dem Makro D3DXMatrixTransformation2D hats funktioniert... Keine Ahnung warum... Liegt wohl daran dass ich wie gesagt keine Ahnung habe wie Matrixrechnung funktioniert.

Na ja, danke an alle jedenfalls!

frohe Ostern
cito
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 29.03.2005, 09:35    Titel: Antworten mit Zitat

cito hat Folgendes geschrieben:
Also, erst mal: Die Matrizen andersherum multiplizieren bringts nicht (haette mich auch gewundert... 2x3 = 3x2 ?!)
Das Kommutativgesetz gilt nicht bei Matrizen!!!
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
cito
Mini JLI'ler



Anmeldedatum: 24.03.2005
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 29.03.2005, 14:43    Titel: Antworten mit Zitat

cito hat Folgendes geschrieben:
Also, erst mal: Die Matrizen andersherum multiplizieren bringts nicht (haette mich auch gewundert... 2x3 = 3x2 ?!) Trotzdem danke.
[edit] oh sorry KI hab nciht gewusst dass matrix multiplikation nicht kommutativ ist... Geht trotzdem nicht besser [/edit]


Ach nee?!?
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 -> DirectX, OpenGL 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