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

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

1

18.08.2009, 22:16

Fehler beim Laden von mehreren Meshes

Hallo

Ich bin daran eine Klasse zu schreiben, damit man danach mehrere Meshes einfügen kann. Doch nun wenn ich auf den Butten Sphere im Programm klicke, wird die Kugel zwar gerendet. Doch wenn ich nun ein zweites Mal auf den Sphere-Button klicke, wird die zweite Kugel nicht angezeigt.

Hier ist ein Codeausschnitt:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// D3DRenderObject.h

//

#ifndef D3DRENDEROBJECT_HPP
#define D3DRENDEROBJECT_HPP

#include "D3D.h"

#define g_pD3DRenderObject CD3DRenderObject::Get()

// Create a class, called CD3DRenderObject

//

class CD3DRenderObject : public TSingleton<CD3DRenderObject>
{
public:

    // Memeberfunctions

    //

    void InitObject();
    bool InitObject(char * filename);
    void Update();
    void IsClicked();
    void RenderObject();
    void ClearObject();

    bool        bRenderObject[50];
    int         RenderObjectCount;

private:

    // Membervariables

    //

    LPD3DXMESH  pObject[50];
};

#endif



// D3DRenderObject.cpp

//

#include "D3DRenderObject.h"


void CD3DRenderObject::InitObject()
{
    RenderObjectCount += 1;
    bRenderObject[RenderObjectCount] = false;
}

bool CD3DRenderObject::InitObject(char * filename)
{
    HRESULT hResult;

    InitObject();

    Update();

    if(FAILED(hResult = D3DXLoadMeshFromX(filename,
                                          D3DXMESH_SYSTEMMEM,
                                          g_pD3D->d3ddev,
                                          NULL,
                                          NULL,
                                          NULL,
                                          NULL,
                                          &pObject[RenderObjectCount])))
    {
        MessageBox(NULL, "Failed, load a mesh!", "Error",
                   MB_OK | MB_ICONEXCLAMATION);

        return(false);
    }

    return(true);
}

void CD3DRenderObject::RenderObject()
{
    pObject[RenderObjectCount]->DrawSubset(0);
}

void CD3DRenderObject::Update()
{
    if(bRenderObject[RenderObjectCount])
    {
        RenderObject();
    }
}

void CD3DRenderObject::IsClicked()
{
    bRenderObject[RenderObjectCount] = true;
}

void CD3DRenderObject::ClearObject()
{
    pObject[RenderObjectCount]->Release();
}


Kann mir jemand sagen, wo der Fehler liegt?


Gruss Patrick

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

2

18.08.2009, 22:29

Vielleicht könntest du deinen Code (bzw. das Design) bischen erläutern, ich blick da grade auf Anhieb nicht ganz durch, etwa warum ein renderbares Objekt ein Singleton ist.

Edit: Kann sein, dass ich falsch liege, weil ich immernoch nicht den Durchblick hab, aber so wie ich es sehe, ist das Design ziemlich fragwürdig und verworren. Du machst renderbare Objekte zu einem Singleton, das wiederrum intern aber alle renderbaren Objekte einzeln verwaltet. Warum??

Ausgehend von dem Code würde ich erwarten, dass immer nur das zuletzt geladene Mesh gerendert wird.
<< an dieser Stelle ist eine Signatur verstorben >>

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

3

18.08.2009, 22:48

Also das Singleton benötige ich um bei anderen Code-Dateien, wie z.B. D3D.cpp oder D3DRender.cpp die Funktion von der Klasse CD3DRenderObject aufzurufen. Ich habe nur einen Codeausschnitt hineingestellt, deshalb weisst du nichts von D3D.cpp und D3DRender.cpp.


Erklährung:

Ich probiere eine Mesh-Klasse zu erstellen, die mir die Funktionen gibt, zum Laden, Rendern und zum Löschen. Ich initialisere das Object mit der Funktion InitObject(char * filename). Ich rufe diese Funktion in der InitGraphics-Funktion von der Datei D3DRender.cpp auf. Danach habe ich die Render-Funktion RenderObject(). Diese rufe ich in der Funktion Update auf, diese habe ich ebenfalls in der Klasse CD3DRenderObject deklariert. Die Update-Funktion rufe ich dann in der Hauptrender Funktion auf, RenderGraphics() diese ist in der Datei D3DRender.cpp. Nun will ich überprüfen, ob der Sphere-Button geklickt worden ist, mit der Funktion IsClicked(). Wenn diese Funktion ausgeführt wird, in der Callback-Funktion, dann setze ich bRenderObject[AnzahlObject] auf true. Somit wird dann in der Update-Funktion gerendert. Nun wenn ich jetzt allerdings ein neues Object laden will, dann wird es danach nicht in der Szene angezeigt. Ich habe die Funktion InitObject() geschrieben, diese soll den Index um 1 vergrössern. RenderObjectCount += 1 und habe das neue Object nicht sichtbar gemacht, bRenderObject[AnzahlObject] = false.

Ich hoffe die Erklährung kannst du verstehen.

Hast du mir ein Tipp, wie ich es besser machen kann?

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

4

19.08.2009, 11:50

Mir ist noch immer völlig unklar, warum du hier mit einem Singleton arbeitest. Um die Funktionen deiner Klasse auch in anderen Code-Dateien aufrufen zu können? Warum geht das bei normalen Objekten nicht?
<< an dieser Stelle ist eine Signatur verstorben >>

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

5

19.08.2009, 12:13

wie the[V]oid schon gesagt hat du renderst nur das zuletzt erstellte Objekt:

ich denk mal bei update fehlt da ne for-Schleife um jedes Objekt durchzugehen und zu rendern
New Project: Operation CityRacer

Werbeanzeige