Sprite-Draw Problem
-
Hallo zusammen,
Compiler : Visual Studio 2010
WINAPI + DirectX 9ich möchte ein kleines 2D Spiel erstellen. Hierfür ist es notwendig Bilder mit Transparenz darzustellen. Genau dies will partout nicht funktionieren. Die SuFu habe ich benutzt, sieht aber ,im Prinzip, so aus wie bei mir (oder ich hab Tomaten auf den Augen). Google quäle ich auch schon seit einer Woche.
Hier ein Teil meines Codes:
Globale Variabeln
//Bilder LPDIRECT3DSURFACE9 OffScreen = NULL; LPDIRECT3DSURFACE9 BackBuffer = NULL; LPD3DXSPRITE sprite = NULL; LPDIRECT3DTEXTURE9 sprite_texture = NULL; D3DXIMAGE_INFO sprite_bildinfo = {NULL}; //SpritVariablen D3DXVECTOR3 dreh_punkt(64.0f, 64.0f, 1.0f); float rotation = 0.0f; D3DXVECTOR3 position(0.0f, 400.0f, 1.0f); D3DCOLOR mod_color = 0xFFFFFFFF;
Erstellen des Surfaces und eines Sprites (In der BOOL InitInstance(...)):
void Create_OffScreen_Sprites() { Device->CreateOffscreenPlainSurface(640, 480, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &OffScreen, 0); D3DXCreateSprite(Device, &sprite); D3DXGetImageInfoFromFile("Data\\HUD.png", &sprite_bildinfo); D3DXCreateTextureFromFileEx(Device, "Data\\HUD.png", sprite_bildinfo.Width, sprite_bildinfo.Height, 1, NULL, sprite_bildinfo.Format, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, NULL, NULL, NULL, &sprite_texture); }
Zeichnen des Hintergrundes:
void Zeichnen_Hintergrund() { static RECT hintergrund = { 0, 0, 640, 400}; static RECT herzen_weiß = {17, 422, 217,458}; static RECT hud = {0, 400, 640, 480}; static RECT leben_akt1 = {17, 422, 47, 440}; static RECT leben_akt2 = {17, 440, 17, 458}; static RECT leben_max1 = {77, 422, 217, 440}; static RECT leben_max2 = {17, 440, 217, 458}; D3DXLoadSurfaceFromFile(OffScreen, NULL, &hintergrund, "Data\\Hintergrund.png", NULL, D3DX_DEFAULT, NULL, NULL); mögliche_bewegungen(); Device->ColorFill(OffScreen, &herzen_weiß, weiß); Device->ColorFill(OffScreen, &leben_akt1, rot); Device->ColorFill(OffScreen, &leben_akt2, rot); // D3DXLoadSurfaceFromFile(OffScreen, NULL, &hud, "Data\\HUD.png", NULL, D3DX_DEFAULT, NULL, NULL); sprite->Begin(D3DXSPRITE_ALPHABLEND); if(FAILED(sprite->Draw(sprite_texture, NULL, NULL, &position, mod_color))) MessageBox(NULL, "Fehler beim Anzeigen des Sprites", "Fehler", 0); sprite->End(); Device->ColorFill(OffScreen, &leben_max1, braun); Device->ColorFill(OffScreen, &leben_max2, braun); }
Ja das Bild ist am richtigen Ort mit D3DXLoadSurfaceFromFile ist es darstellbar nur ohne Transparenz. FAILED habe ich überall als Test eingefügt, leider nirgends eine Fehlermeldung. Die restliche Darstellung funktioniert einwandfrei nur die Sache mit den Sprites mag nicht so wie ich.
Sollte ich eine wichte Info vergessen haben, bitte nachfragen.
Danke und Gruß
Ombre
-
Nachrichtentext (die ersten 500 Zeichen):
Hast Du schon Erfahrung mit der Spieleprogrammierung? Falls nicht empfehle ich Dir das Buch "3D-Spiele-Programmierung" von David Scherfgen. Da steht auch was über 2D-Sprites drin. Es wird eine eigene Engine entwickelt auf Basis von DirectX 9. Damit ist es etwas einfacher zu Resultaten zu kommen, als wenn man es mit direktem DX Ansatz versucht. Auch Effekte wie Transparenz werden da ausführlich besprochen
-
Hi! Danke für die Antwort ...
Ich habe das spiel in GdiPlus schon einmal fertig programmiert. GdiPlus ist leider zu langsam, weshalb ich auf DX umgestiegen bin. Ein freund hat mir ein Buch geliehen Namens "jetzt lerne ich directX 9 und visual c++". Das ist leider schon eteas älter und ich kann nicht mehr alle funtionen übernehmen. Eigentlich sollte es ein leichtes sein ein Bild mit transparenz anzeigen zu lassen aber scheinbar ist das ein größerer Akt.
Ich verstehe einfach nicht das keiner mir sagen kann : Dummkopf Augen und Ohren auf du hast "das und das" falsch gemacht.Ich bin Fachinformatiker zwar nicht für Anwendungsentwicklung aber ich programmiere mit C++ seit 6 Jahren wenn auch nur Konsole. Bin natürlich kein Profi aber auch kein blutiger Anfänger mehr.
Danke schonmal überhaupt fürs Antworten!
-
Also wenn ich dich richtig verstanden habe möchtest du das Bild Hintergrund.png laden, welches dann transparent über irgendwelchen anderen Objekten liegt. Oder sollen die Sprites transparent vor dem Hintergrund bewegt werden? Ich habe das Problem noch nicht richtig verstanden?
-
Es soll ein Bild einer Figur geladen werden. Erstmal nur stehen nachher verändere ich die X und Y Koordinaten und bewege so die Figur. Aber eins nach dem anderen wenn die Darstellung erstmal klappt ist das mit dem bewegen nicht mehr so schwer. Tasten abfragen umd Variabeln verändern kann ich bereits.
-
Evtl. hab ich was, was dir weiterhelfen könnte. Am besten du schickst mir eine Nachricht mit deiner Mailadresse, dann sende ich dir das ganze Projekt zu. Den ganzen Quellcode hier anzuzeigen wäre ein bißchen lang
-
Hab dir ne Mail geschickt.
Danke und Gruß
Ombre
-
Antwort ist unterwegs...
Viel Erfolg
-
Ich könnt mir selber in den Arsch beißen ...
Danke für den Code, da ist mir ein Licht aufgegangen!Ich hatte, nur von der Reihenfolge, den Code so:
sprite->End(); Device->EndScene(); Device->StretchRect(OffScreen, NULL, BackBuffer, 0, D3DTEXF_NONE);
So wird aber nur das ausgegeben, was sich im OffScreen befindet (SurFace). Dreht man die Reihenfolge leicht um,... :
Device->StretchRect(OffScreen, NULL, BackBuffer, 0, D3DTEXF_NONE); sprite->End(); Device->EndScene();
... wird ALLES ausgegeben.
Hab das Buch gerade nicht zur Hand aber ich meine dort war es auch verkehrt herum.
Jetzt verstehe ich übrigens auch deine Frage:
lazer:
Also wenn ich dich richtig verstanden habe möchtest du das Bild Hintergrund.png laden, welches dann transparent über irgendwelchen anderen Objekten liegt. Oder sollen die Sprites transparent vor dem Hintergrund bewegt werden? Ich habe das Problem noch nicht richtig verstanden?Den das Sprite ist jetzt IMMER die "oberste Schicht" etwas über dem Sprite zu zeichnen, ist nicht mehr möglich. Durch Zufall eine Idee welchen Parameter ich hierfür verändern müsste?
Danke nochmal für den Code
So long
Ombre