 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
cito Mini JLI'ler
Anmeldedatum: 24.03.2005 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 27.03.2005, 15:49 Titel: Problem mit Sprites |
|
|
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...
Bitte nichts ueber den Programmierstil sagen, ich hab noch nicht aufgeraeumt Ist erstmal nur ein Test.
Zuletzt bearbeitet von cito am 27.03.2005, 17:01, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 27.03.2005, 16:36 Titel: |
|
|
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  _________________ »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 |
|
 |
cito Mini JLI'ler
Anmeldedatum: 24.03.2005 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 27.03.2005, 16:54 Titel: |
|
|
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!  |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 27.03.2005, 16:56 Titel: |
|
|
Erstmal danke
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 |
|
 |
cito Mini JLI'ler
Anmeldedatum: 24.03.2005 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 27.03.2005, 17:00 Titel: |
|
|
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?!?
 |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 27.03.2005, 17:11 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 27.03.2005, 17:16 Titel: |
|
|
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 |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.03.2005, 20:45 Titel: |
|
|
@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 |
|
 |
cito Mini JLI'ler
Anmeldedatum: 24.03.2005 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 27.03.2005, 22:07 Titel: |
|
|
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
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 |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 27.03.2005, 23:04 Titel: |
|
|
Mmh. Schade das es nich daran lag... Das wär auch einfach zu schön gewesen.
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 |
|
 |
cito Mini JLI'ler
Anmeldedatum: 24.03.2005 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 28.03.2005, 16:37 Titel: |
|
|
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 |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 29.03.2005, 09:35 Titel: |
|
|
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 |
|
 |
cito Mini JLI'ler
Anmeldedatum: 24.03.2005 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 29.03.2005, 14:43 Titel: |
|
|
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 |
|
 |
|
|
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
|