Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.04.2011, 17:37

Sprite wird nicht dargestellt

Hey zusammen,

ein Freund hat mir ein Buch ausgeliehen, Namens "jetzt lerne ich DirectX 9 und Visual C++". Leider ist dieses schon etwas älter und ich kann die Funktionen nicht 100% übernehmen. Da ich alledings kein Anfänger in Sachen C++ und WINAPI bin, dachte ich mir, dass dies schon reichen würde ... leider weit gefehlt :-(

Ich habe vorher GDIPlus benutzt um Grafiken darzustellen, dummer Weise erwies sich dies als nicht schnell genug, weshalb ich auf directx gekommen bin. Das laden eines normalen Bildes über D3DXLoadSurfaceFromFile funktioniert einwandfrei. Nur scheint es hier keinen Alpha-Kanal zu geben (korregiert mich, falls ich falsch liege). Für dieses Problem, scheint es die Sprites zu geben, welche man auch für Animationen verwenden kann. Die SuFu hat mir leider nicht ausreichend weitergeholfen, weshalb ich mich vertrauenswürdig an euch wende.

Bevor ich weiter rumquatsche hier mal etwas Code:

Globale Variablen (nicht das schönste ich weiß aber zum üben ausreichend)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
  //Bilder
LPDIRECT3DSURFACE9       OffScreen = NULL;
LPDIRECT3DSURFACE9      BackBuffer = NULL;
LPD3DXSPRITE                sprite = NULL;
LPDIRECT3DTEXTURE9  sprite_texture = NULL;
D3DXIMAGE_INFO      sprit_bildinfo = {NULL};
  //SpriteVariablen
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;


Dann die Erstellung des Sprits (Erfolgt in der Funktion: BOOL InitInstance(HINSTANCE hInstance, int nCmdShow))

C-/C++-Quelltext

1
2
3
4
5
6
7
void Create_OffScreen_Sprits()
{
    Device->CreateOffscreenPlainSurface(640, 480, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &OffScreen, 0);
    D3DXCreateSprite(Device, &sprite);
    D3DXIMAGE_INFO bild_info;   D3DXGetImageInfoFromFile("Data\\HUD.png", &bild_info);
    D3DXCreateTextureFromFileEx(Device, "Data\\HUD.png", bild_info.Width, bild_info.Height, 1, NULL, bild_info.Format, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, NULL, NULL, NULL, &sprite_texture);
}


Und dann das zeichnen des Hintergrundes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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); //Keine Transparenz
    sprite->Begin(D3DXSPRITE_ALPHABLEND);
    if(FAILED(sprite->Draw(sprite_texture, NULL, NULL, NULL, mod_color)))
        MessageBox(NULL, "Fehler beim Anzeigen des Sprits", "dooof", 0);
    sprite->End();
    Device->ColorFill(OffScreen, &leben_max1, braun);
    Device->ColorFill(OffScreen, &leben_max2, braun);
}


Im Augenblick habe ich nur in der Draw-Funktion einen FAILED eingebaut. Habe es aber natürlich bei ALLEN getestet. Nirgends eine Fehlermeldung.
Und da es öfters das Problem war, Ja das Bild liegt am richtigen Ort denn wenn ich die auskommentierte Funktion über sprite->Begin() nutze wird die Grafik HUD.png geladen. Nur ohne Transparenz.

Ich hoffe ihr könnt mir helfen und hattet überhaupt Lust bis zum Ende zu lesen ...

Gruß
Ombre