JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

[Kapitel 20] Sprite wird nicht angezeigt
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pc-dau2
Mini JLI'ler



Anmeldedatum: 26.05.2007
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 26.05.2007, 19:27    Titel: [Kapitel 20] Sprite wird nicht angezeigt Antworten mit Zitat

Hi,

kämpfe nun schon seit einigen Wochen mit Sprites rum aber ich weiss einfach nicht was ich falsch mach. Hab diesbezüglich schon einiges im Forum gefunden aber keine Hilfe führte zur Lösung. Daher bitte ich euch mir ne kleine Hilfestellung zu geben! Wink

Code:

objD3D.BeginScene();
                  lpD3DDevice = objD3D.getD3DDevice();

         D3DXCreateTextureFromFile(lpD3DDevice, L"R:\\JLI Beispiele\\MEDIA\\SPRITE.PNG",
                                 &lpSpriteTexture);

         D3DXCreateSprite(lpD3DDevice, &lpSprite);

         D3DXVECTOR3 vScaling(1.0f, 1.0f, 1.0f);
         D3DXVECTOR3 vRotationCenter(128.0f, 128.0f, 0.0f);
         float Rotation = 0.0f;

         D3DXVECTOR3 vPosition(128.0f, 128.0f, 0.0f);
         D3DCOLOR ModulateColor = 0xFFFFFFFF;

         lpSprite->Draw(lpSpriteTexture, NULL, &vRotationCenter, &vPosition, ModulateColor);
            
         
         objD3D.EndScene();


thx & cu
pc-dau2
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 08:13    Titel: Antworten mit Zitat

Wenn du ein Sprite renderst musst du das Sprite Objekt zuerst "starten":
Code:
lpSprite->Begin(D3DXSPRITE_ALPHABLEND);
Dann kannst du seine Drawfunktion aufrufen
Code:
lpSprite->End();
nicht vergessen Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 15:38    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
Wenn du ein Sprite renderst musst du das Sprite Objekt zuerst "starten":
Code:
lpSprite->Begin(D3DXSPRITE_ALPHABLEND);
Dann kannst du seine Drawfunktion aufrufen
Code:
lpSprite->End();
nicht vergessen Wink

Das kann man machen, muss man aber nicht (afaik). Bringt glaub ich nur einen geschwindigkeitsvorteil wenn man das sprite öfter zeichnet.

pc-dau2
Was passiert denn? Lässt es sich nicht compilieren, stürzt das Programm ab oder wird einfach nur nichts angezeigt?

edit: Ok muss man jetzt wohl doch machen...
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren


Zuletzt bearbeitet von 51m0n am 27.05.2007, 15:41, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pc-dau2
Mini JLI'ler



Anmeldedatum: 26.05.2007
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 15:39    Titel: Antworten mit Zitat

Vielen Dank Otscho - jetzt klappts! Very Happy

Ist dieses Begin und End für Sprites erst neu hinzugekommen? Denn im Buch hab ich davon nix gefunden.

@51m0n:

Der Code liess sich kompilieren, das Programm liess sich starten aber entweder erschien nur ein schwarzer Bildschirm und das Programm lief weiter oder es wurde kurz ein maximiertes Fenster angezeigt und dann gings back 2 Desktop.

Hab DX SDK October06 installiert und arbeite unter W2K. Vielleicht hängts damit zusammen, denn das SDK wollte sich unter W2K schon gar ned installieren lassen - musste dazu erst im Installer rumpfuschen ums überhaupt installieren zu können! Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 15:56    Titel: Antworten mit Zitat

Ich habs grad noch mal schnell bei mir ausprobiert und bei mir muss ich auch begin/end aufrufen. Wurde wohl mit nem Update geändert denn früher war das glaub ich nicht nötig. (Hab auch Oktober 06)

Wenn Patrik noch hier wäre gäbs wieder eine riesen Diskussion über D3DX^^
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 17:44    Titel: Antworten mit Zitat

Kein Problem

Also mein Buch ist afaik von 2006 und da steht das ganz klar drinnen mit dem begin() und end() Laughing

Zitat:
Wenn Patrik noch hier wäre gäbs wieder eine riesen Diskussion über D3DX^^
Wer ist das eigentlich? Man hört hier im Forum ja so einiges von diesem "Patrick". Ist das eine Fantasiegestalt oder ein Gespenst ?
Klärt mich mal auf.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jones
Senior JLI'ler


Alter: 33
Anmeldedatum: 03.03.2005
Beiträge: 208
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 18:08    Titel: Antworten mit Zitat

Patrick war ein langjähriges Mitglied, der sehr rege an Diskussionen teilgenommen hat, was nicht immer friedlich ablief(jede Seite bei den Diskussionen trug einen Teil dazu bei). Irgendwann hatte er dann keine Lust mehr und hat seinen Account löschen lassen(womit auch einige gute Tutorials gelöscht worden(ähnliches lief auch in anderen Foren ab wo er angemeldet war)).
Ich glaub das war so mal grob gesagt wer Patrick ist Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pc-dau2
Mini JLI'ler



Anmeldedatum: 26.05.2007
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 19:02    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
Also mein Buch ist afaik von 2006 und da steht das ganz klar drinnen mit dem begin() und end() Laughing


Aso, dann basiert das Buch wohl auf nem aktuelleren SDK, mein Buch ist von 2003 und da gabs dann begin und end wohl noch ned!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pc-dau2
Mini JLI'ler



Anmeldedatum: 26.05.2007
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 09:40    Titel: Antworten mit Zitat

Hallo nochmal,

ich schreibe einfach mal hier weiter weil ich nicht viel weiter gekommen bin bzw ned versteh was mir die DX-Doku sagen will! Wink

Ich versuche nun das Sprite rotieren lassen. Sprite wird angezeigt, lässt sich auch verschieben nur rotieren tuts ned. Drücke ich die Taste fürs rotieren verschwindet das Sprite einfach vom Bildschirm.

Hier mal mein Code:
Code:
D3DXVECTOR3 vRotationCenter(64.0f, 64.0f, 128.0f);
           
D3DXMatrixRotationX(&d3dMatrix,Rotation*D3DX_PI/180);
           
D3DXVECTOR3 vPosition(g_x, g_y, 128.0f);
D3DCOLOR ModulateColor = 0xFFFFFFFF;
lpSprite->Begin(D3DXSPRITE_ALPHABLEND);
lpSprite->SetTransform(&d3dMatrix);
lpSprite->Draw(lpSpriteTexture, NULL, &vRotationCenter, &vPosition, ModulateColor);



Bei der Variablen Rotation handelt es sich um ein Float mit Defaultwert 0.0, drückt man ne Taste wird dieser Wert um 0.1f erhöht. Aber wie gesagt, sobald man die Taste drückt ist das Sprite weg!

Wäre über nen Tipp sehr dankbar!

thx & cu
pc-dau
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 10:22    Titel: Antworten mit Zitat

Ich bin mir nicht sicher, aber ist D3DXMatrixRotationX() nicht für 3D-objekte gedacht. Wenn du ein Sprite drehst, dann drehst du es doch normalerweiße um die "Y-Achse"(=Achse von vorn nach hinten) .Wenn dus um die X-Achse(=Achse von links nach rechts) drehst, dann müsste ein 2D-Objekt streng genommen in der Höhe skaliert werden, aber ich glaub kaum, dass das Direct3D so handhabt.
Versuch doch einfach die D3DXMatrixTransformation2D()- Methode. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 15:24    Titel: Antworten mit Zitat

Also.
Eigentlich kümmert sich ein D3DX Sprite selber ums rotieren. Du musst gar nicht SetTransform aufrufen, sonder bei der lpSprite->Draw Methode RotationCenter und Rotation angeben.
Mach mal das MatrixRotationX und das SetTransform weg, und guck, was dann passiert. Eigentlich müsste im Buch aber auch Code stehen, mit dem das Sprite gedreht wird, musste dir halt mal anschauen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pc-dau2
Mini JLI'ler



Anmeldedatum: 26.05.2007
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 16:23    Titel: Antworten mit Zitat

Ich Buch stehts ja drinne - aber wie vorher schon mal gesagt, mein Buch ist von 2003 und das damalige SDK hatte noch ne Draw-Methode welche 7 Parameter umfasste. Seit SDK Dez 06 (welches ich ja installiert hab) wurde Scaling und Rotation aus der Draw-Methode ausgelagert und muss jetzt über Matrix-Manipulation realisiert werden. Aber die DX-Doku bringt mich diesbezüglich nicht weiter.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 16:49    Titel: Antworten mit Zitat

oh, sorry. Ich hab lange nix mehr mit D3DX Sprites gemacht^^
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 16:55    Titel: Antworten mit Zitat

Schreib mal einfach
Code:
D3DXVECTOR2 vRotationCenter =  D3DXVECTOR2(64.0f, 64.0f);
D3DXVECTOR2 vScale = D3DXVECTOR2(1.0f, 1.0f);
D3DXVECTOR2 vPosition =  D3DXVECTOR2(g_x, g_y);

D3DXMatrixTransformation2D(&d3dMatrix, &vRotationCenter, 0.0f, &vScale, &vRotationCenter, Rotation, &vPosition);
D3DCOLOR ModulateColor = 0xFFFFFFFF;
 
lpSprite->Begin(D3DXSPRITE_ALPHABLEND);
lpSprite->SetTransform(&d3dMatrix);
lpSprite->Draw(lpSpriteTexture, NULL, NULL, NULL, ModulateColor);
...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 09.06.2007, 21:32    Titel: Antworten mit Zitat

Ich denke, wenn du die Rotationsmatrix erstellst und als Weltmatrix setzt, wird das nicht viel bringen, da eine Weltmatrix im Endeffekt so aufgebaut wird:

Alle geometrischen Operationen, die an dem Sprite ausgeführt werden, werden in seiner Weltmatrix gespeichert. Meist sind diese jeweils aus einzelnen Matrizen zusammengefasst: 1 für die Rotation, 1 für die Translation usw... Für die Weltmatrix werden diese in einer (sehr wichtigen!!) Reihenfolge miteinander multipliziert:
Code:
 Weltmatrix = Skalierungsmatrix * Rotationsmatrix * Translationsmatrix(=Verschiebungs-)
Eine einelne Rotationsmatrix als Weltmatrix zu setzen heißt dann also, dass Skalierung und Translation nicht berücksichtigt werden Arrow Dein Sprite befindet sich in (0,0,0), wo du es nicht sehen kannst. Wenn du diese Multiplikationen nicht selbst nachhalten möchtest, kannst du auch die Methode von Otscho nehmen, da da alle Schritte automatisch schon drinstecken

BTW: ich hab auch noch im Kopf, dass die ID3DXSprites da eine seperate Funktion für haben... Aber wenns im Buch steht words schon stimmen Cool

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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