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

17.08.2004, 13:15

Textur wird nicht gezeichnet

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void object::viewPicture(IDirect3DTexture9 *texture, int width, int height, int x, int y, D3DCOLOR vertexColor)
{
    VERTEX* vertices;
    IDirect3DVertexBuffer9* vertexBuffer;
    
    MSGDXERROR("LPDIRECT3DDEVICE9->CreateVertexBuffer()", D3DDevice->CreateVertexBuffer(sizeof(VERTEX) * 4, NULL, D3DFVF_VERTEX, D3DPOOL_MANAGED,
                                  &vertexBuffer, NULL));

    D3DDevice->SetStreamSource (0, vertexBuffer, 0, sizeof(VERTEX));

    MSGDXERROR("LPDIRECT3DVERTEXBUFFER9->Lock()", vertexBuffer->Lock(0, 0, (void**)&vertices, NULL))

    //Vertices setzen

    vertices[0].color = vertexColor;
    vertices[0].x = x;
    vertices[0].y = y;
    vertices[0].z = 0.0f;
    vertices[0].rhw = 1.0f;
    vertices[0].u = 0.0f;
    vertices[0].v = 0.0f;

    vertices[1].color = vertexColor;
    vertices[1].x = x;
    vertices[1].y = y + height;
    vertices[1].z = 0.0f;
    vertices[1].rhw = 1.0f;
    vertices[1].u = 1.0f;
    vertices[1].v = 0.0f;

    vertices[2].color = vertexColor;
    vertices[2].x = x + width;
    vertices[2].y = y;
    vertices[2].z = 0.0f;
    vertices[2].rhw = 1.0f;
    vertices[2].u = 1.0f;
    vertices[2].v = 1.0f;

    vertices[3].color = vertexColor;
    vertices[3].x = x + width;
    vertices[3].y = y + height;
    vertices[3].z = 0.0f;
    vertices[3].rhw = 1.0f;
    vertices[3].u = 0.0f;
    vertices[3].v = 1.0f;

    vertexBuffer->Unlock();

    //textur setzen

    MSGDXERROR("LPDIRECT3DDEVICE9->SetTexture()", D3DDevice->SetTexture(0, texture))

    //zeichnen

    MSGDXERROR("LPDIRECT3DDEVICE9->DrawPrimitive()", D3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2))

}

Wenn ich diese Funktion mit

C-/C++-Quelltext

1
bild01.loadPicture("logo.bmp", NULL, bild1);

aufrufe, wird leider nicht die 'logo.bmp' angezeigt. :(
'bild01' ist hier eine Instanz der Klasse object und Direct3D wurde auch initialisiert. Was ist da falsch? ??? ??? ???

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

2

17.08.2004, 13:57

warum den D3DPT_TRIANGLEFAN?

3

17.08.2004, 14:00

Mehrere Sachen:

1) Ersetze Dinge wie LPDIRECT3DDEVICE9->CreateVertexBuffer() durch IDirect3DDevice9::CreateVertexBuffer(), weil es Syntaktisch einfach falsch ist.

2) Wenn ich für x/y NULL einsätze kommt bei Triangle Fan keine zwei Dreiecke raus. Die Reihenfolge ist falsch und daher kann auch nichts dargestellt werden.

3) SetStreamSource sollte erst dann gesetzt werden wenn der Buffer auch fertig gefüllt ist. Aber daran sollte es eigentlich nicht liegen.

4) Deine Funktion produziert ein haufen Memory Leaks und führt recht schnell zu einem Programmabbruch weil kein Platz mehr da ist. Du hast vergessen deinen erzeugten Vertex-Puffer wieder freizugeben.

5) Einen Vertex-Puffer zur laufzeit zu erstellen ist recht übel für die Performance. Da du Images darstellen willst, ist ein Std. Vertex-Puffer von Vorteil. Der wird dann für alle Images verwendet.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

4

17.08.2004, 16:00

Ups, ich hab vergessen, ein paar Sachen noch dazuzuschreiben und habe aus versehen einen Fehler im ersten Posting eingebaut:
1. Der erste Parameter von dem Makro MSGDXERROR ist nicht der Funktionsaufruf; das ist der zweite.
2. Ich habe beim anzeigen aus versehen erstmal

C-/C++-Quelltext

1
bild01.loadPicture("logo.bmp", NULL, bild1);

geschrieben; das war der Aufruf der LoadMethode - angeziegt sollte das Bild durch

C-/C++-Quelltext

1
bild01.viewPicture(bild1, 300, 110, 0, 0, D3DCOLOR_ARGB(255, 0, 0, 0));

werden.

Was den Vertex-Puffer betrifft: meinst du, man sollte ihn z.B. in einer Init-Methode erzeugen, und nachher in einer Exit-Methode wieder freigeben?

5

17.08.2004, 17:17

Zitat

1. Der erste Parameter von dem Makro MSGDXERROR ist nicht der Funktionsaufruf; das ist der zweite.
Das war mir schon klar. Ist ja ersichtlich. Jedoch sollten die Logeinträge ebenfalls Syntaktisch korrekt sein.


Das mit der falschen Methode war nicht so tragisch :)


Zitat

Was den Vertex-Puffer betrifft: meinst du, man sollte ihn z.B. in einer Init-Methode erzeugen, und nachher in einer Exit-Methode wieder freigeben?
Jup....so in etwa.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

6

31.08.2004, 14:13

Problem gelöst! Ich hab das Bild jetzt als Sprite gezeichnet. :D

Werbeanzeige