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

04.04.2013, 14:50

[C++ DirectX]Terrain erstellen

Hi,
ich versuche im Moment eine Terrain Klasse mit C++ und DirectX9 zu erstellen.
Die Init Methode sieht bis jetzt folgendermaßen aus:

Quellcode

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
void Area::Init(LPDIRECT3DDEVICE9 D3DDEV,D3DXVECTOR3 position,const D3DXVECTOR3 size,float gradient)
{
    d3ddev = D3DDEV;
    sizeX = floor(size.x);
    sizeZ = floor(size.z);
    CUSTOMVERTEX vertices[4];
    for(int x = 0;x < sizeX;x++)
    {
        for(int z = 0;z < sizeZ;z++)
        {
            vertices[x + z * 2].x = x;
            vertices[x + z * 2].y = 0;
            vertices[x + z * 2].z = z;
            vertices[x + z * 2].Color = D3DCOLOR_XRGB(255,255,255);
        }
    }

    D3DDEV->CreateVertexBuffer(2 * 2*sizeof(CUSTOMVERTEX),0,D3DFVF_XYZ | D3DFVF_DIFFUSE,D3DPOOL_DEFAULT,&v_buffer,NULL);

    VOID* pVoid;

    v_buffer->Lock(0,0,(void**)&pVoid,0);
    memcpy(pVoid,vertices,sizeof(vertices));
    v_buffer->Unlock();

    short indices[] =
    {
        0,1,2,
        2,1,3,
    };
    D3DDEV->CreateIndexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&i_buffer,NULL);

    i_buffer->Lock(0,0,(void**)&pVoid,0);
    memcpy(pVoid,indices,sizeof(indices));
    i_buffer->Unlock();
}


Nun will ich die Größe des Terrains mit einen Parameter festlegen(D3DXVECTOR3 size).

Wenn ich nun

Quellcode

1
CUSTOMVERTEX vertices[4]

in den folgenden Code ändere

Quellcode

1
CUSTOMVERTEX vertices[(int)(floor(size.x) * floor(size.z))]

dann wird

Quellcode

1
(int)(floor(size.x) * floor(size.z))

rot unterstrichen.

Um Das unterstrichene wegzubekommen habe ich das Problem folgendermaßen gelöst:

Quellcode

1
CUSTOMVERTEX* vertices = new CUSTOMVERTEX[(int)(floor(size.x) * floor(size.z))]


Nun wird nichts mehr unterstrichen, aber so wird das Terrain nichtmehr gezeichnet.
Kann mir da jemand helfen? :(
mfg BreakBlack

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

04.04.2013, 15:00

Erstens: mit dem "CUSTOMVERTEX vertices[4]" erstellst Du ein lokales Array aus Vertex-Strukturen. Deren Größe muss schon beim Kompilieren feststehen, sonst gibt es Fehler. Den Fehler hättest Du Dir ruhig mal durchlesen können, damit Du ihn später wiedererkennst. Einfach mal kompilieren, dem Compiler tut das nix und die roten Linien sind nicht immer zuverlässig.

Zweitens: Du hast bereits die richtigen Schlüsse gezogen und das Array nun dynamisch auf dem Heap allokiert. Allerdings überschreibst Du dann die Vertizes in der Schleife teilweise wieder. Schau Dir nochmal genau die Berechnung des Array-Index in der Schleife an. Nachdem das erste Mal die innere Schleife durchgelaufen ist, wieviele Vertizes hast Du da geschrieben? Und wieviele nach dem zweiten Schleifendurchlauf? Das sollte Dir einen Hinweis geben, wie Du das Problem lösen kannst. Mal Dir ruhig mal den Vorgang auf einem Blatt Papier auf und zähle durch.

Drittens: Lerne, den Debugger zu benutzen. Der ist ein wirklich wichtiges Werkzeug, und kann Dir bei diesem und vielen anderen Problemen weiterhelfen.

Viertens: wenn Du mit new[] ein Array auf dem Head anlegst, musst Du es am Ende auch mit delete[] wieder löschen. Oder Du nimmst stattdessen std::vector und erfreust Dich an der gewonnenen Sicherheit und Bequemlichkeit, ohne einen Takt Rechenzeit einzubüßen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

04.04.2013, 15:26

Danke für die Hilfe :)

das Problem bim Schleifendurchgang habe ich gefunden:
Nach dem zweiten Schleifendurchgang sollte der Index 1 kommen, aber da kam der Index 2 raus.Hab das nun so gelöst:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
    CUSTOMVERTEX* vertices = new CUSTOMVERTEX[4];
    for(int x = 0;x < 2;x++)
    {
        for(int z = 0;z < 2;z++)
        {
            vertices[z + x * 2].x = x;
            vertices[z + x * 2].y = 0;
            vertices[z + x * 2].z = z;
            vertices[z + x * 2].Color = D3DCOLOR_XRGB(255,255,255);
        }
    }


delete[] habe ich am Ende auch eingefügt.

Quellcode

1
delete[] vertices;


Leider wird das Terrain immer noch nicht gerendert.

Das Problem liegt irgendwie daran, aber ich weiß nicht warum.

Quellcode

1
CUSTOMVERTEX vertices[4];
Terrain wird gezeichnet

Quellcode

1
CUSTOMVERTEX* vertices = new CUSTOMVERTEX[4]
Terrain wird nicht gezeichnet

mfg BreakBlack

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BreakBlack« (04.04.2013, 19:22)


Werbeanzeige