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

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

1

28.01.2008, 09:24

New oder this - Problem

Hallo

Ich habe ein etwas seltsames Problem.

Ich habe eine Sprite Klasse, welche ich Renderen möchte.
Nun die "Nicht-Zeiger" Varianten haben immer funktioniert.

Als ich jetzt aber einen Zeiger für das Objekt benutzt habe wird es nicht mehr gerendert.
Ich habe mal das Objekt Global erzeugt:

C-/C++-Quelltext

1
CSprite* spr = 0;


Dann habe ich es per new mit einem gültigen Zeiger versehen:

C-/C++-Quelltext

1
spr = new CSprite;


Dann lade ich das ganze. Er lädt korrekt, dass heisst, dass die Textur und anderen Werte stimmen. (Im Debugger gesehen)

Wenn ich es aber Rendern will erscheint nichts mehr auf dem Screen.
Die Position stimmt, wenn ich den Zeiger mit einem normalen Objekt wechsle und die new und delete weglasse und den Punktoperator benutze funktioniert das ganze ohne andere Änderungen.

Nun, meine Vermutung ist, dass etwas mit dem Rendern nicht funktioniert.
Ich rendere es so, dass ich einer anderen Klasse den this - Zeiger übergebe und da dort irgendwie das Problem ist.

C-/C++-Quelltext

1
CSpriteEngine::Render (this);


Compilerfehler bekomme ich keine. Und im einfacherem Umfeld konnt eich den Fehler leider nicht nachvollziehen. :(

Ich hoffe, dass jemand da ne gute Idee hat, an was das liegen könnte, wei l das mit dem this Zeiger bin ich nicht so überzeugt, war aber meine letzte Idee..

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

28.01.2008, 09:32

Die Definition der Renderfunktion wäre vermutlich nicht uninteressant.
@D13_Dreinig

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

28.01.2008, 09:45

Hmm. Da passiert nicht viel.

Ich transformiere dort lediglich die Vertices und fülle dann den Vertexbuffer
mit den Vertex, sowie Farb und Texturdaten.

Drawprimitve wird in CSpriteEngine::End (PDIRECT3DTEXTURE9 tex)
aufgerufen.

Und so rufe ich es auf:

C-/C++-Quelltext

1
CSpriteEngine::End(sprTree->GetTexture ());

GetTexture gibt den richtigen Zeiger zurück.

Wie gesagt, wenn ich einfach keinen Zeiger neheme, dann funktioniert alles genauso, wie ich es gemacht habe. Alleine der Wechsel auf den Zeiger, new, delete und die Pfeiloperator funktioniert nicht..

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

28.01.2008, 13:48

Ich bin noch auf etwas gestossen...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        CPlayer e;

    ene2.Load ("player.tga"); 
    ene2.Scal (0.3f);
    ene2.SetTo ( vec (3.2f,2.5f,0.0f));
    ene2.Enemy ();

    e.Load ("player.tga"); 
    e.Scal (0.3f);
    e.SetTo ( vec (3.2f,2.5f,0.0f));
    e.Enemy ();

    m_lEnemys.push_back (e); //Verhält sich nicht normal

        m_lEnemys.push_back (ene2); //Verhält sich normal


m_lEnemys ist eine Liste von CPlayer.
ene2 ist eine Memberelement vom Typ CPlayer.

Eigentlich müsste es doch auch bei dem gehen, dass ein lokales e (CPlayer) in die Liste schiebt, oder habe ich da jetzt einen völligen Denkfehler? Es wird ja das ganze Objekt in die Liste geschoben und nicht nur irgendein Teil, also müsste das Objekt später in der Liste auch normal ansprechbar sein, oder?

5

28.01.2008, 14:57

Debuggen roxs!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

28.01.2008, 14:59

Zitat von »"drakon"«

Es wird ja das ganze Objekt in die Liste geschoben und nicht nur irgendein Teil, also müsste das Objekt später in der Liste auch normal ansprechbar sein, oder?


Solang du einen entsprechenden Kopierkonstruktor und/oder Zuweissungsoperator bereitsstellst, mit Sicherheit.
@D13_Dreinig

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

28.01.2008, 15:00

Zitat von »"Deviloper"«

Debuggen roxs!


Jo, das ist mir schon klar, das habe ich seit heute Morgen um 8 Uhr auch gemacht, aber es ist wirklich komisch.
Im Debugger sehe ich nichts ungewöhnliches..

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

28.01.2008, 15:01

Zitat von »"David_pb"«

Zitat von »"drakon"«

Es wird ja das ganze Objekt in die Liste geschoben und nicht nur irgendein Teil, also müsste das Objekt später in der Liste auch normal ansprechbar sein, oder?


Solang du einen entsprechenden Kopierkonstruktor und/oder Zuweissungsoperator bereitsstellst, mit Sicherheit.

:idea:
DAS könnte es sein.. Habe keine speziellen Zuweisungsoperatoren oder einen Kopierkonstruktor angegeben... :roll:

EDIT:

An dem kann es nicht gelegen haben.

Nochmal kurz:
Ich habe jetzt mal ein Sprite normal und eines als Zeiger erstellt.
Alles genau gleich gemacht, ausser hald new/delete beim Zeiger und anstatt . den -> Operator. Keine Kopien, oder sonst wo einfügen. Einfach statisch so erstellt und die Zeigerversion geht nicht. Die andere schon.
Ich bin am verzweifeln... :(

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
                m_pVertBuff->Lock (0,0,(void**)&m_pData,D3DLOCK_DISCARD );
                sTexInfo tinf;

                tinf = GetTextureInfos ();
                
                //Vertexposition bestimmen und Transformieren

                D3DXVECTOR3 posUL       = D3DXVECTOR3(-0.5f,0.5f,0.0f);
                D3DXVECTOR3 posUR       = D3DXVECTOR3(0.5f,0.5f,0.0f);
                D3DXVECTOR3 posBL       = D3DXVECTOR3(-0.5f,-0.5f,0.0f);
                D3DXVECTOR3 posBR       = D3DXVECTOR3(0.5f,-0.5f,0.0f);

                D3DXVec3TransformCoord  (&posUL,&posUL,&tinf.mMatrix);
                D3DXVec3TransformCoord  (&posUR,&posUR,&tinf.mMatrix);
                D3DXVec3TransformCoord  (&posBL,&posBL,&tinf.mMatrix);
                D3DXVec3TransformCoord  (&posBR,&posBR,&tinf.mMatrix);

                //Texturposition bestimmen und Transformieren

                D3DXVECTOR2 texUL       = D3DXVECTOR2 (0.0f,0.0f);
                D3DXVECTOR2 texUR       = D3DXVECTOR2 (1.0f,0.0f);
                D3DXVECTOR2 texBL       = D3DXVECTOR2 (0.0f,1.0f);
                D3DXVECTOR2 texBR       = D3DXVECTOR2 (1.0f,1.0f);

                D3DXVec2TransformCoord  (&texUL,&texUL,&tinf.mTextureMatrix);
                D3DXVec2TransformCoord  (&texUR,&texUR,&tinf.mTextureMatrix);
                D3DXVec2TransformCoord  (&texBL,&texBL,&tinf.mTextureMatrix);
                D3DXVec2TransformCoord  (&texBR,&texBR,&tinf.mTextureMatrix);

                //Vertex und Texturinformationen einfügen

                int m_iCount = 0;
                m_pData[0+(m_iCount*6)].vPos        = vec (posUL.x, posUL.y, posUL.z);
                m_pData[0+(m_iCount*6)].vtex        = vec (texUL.x, texUL.y, 0.0f   );
                m_pData[0+(m_iCount*6)].dwColor     = m_dwColor;

                m_pData[1+(m_iCount*6)].vPos        = vec (posUR.x, posUR.y, posUR.z);
                m_pData[1+(m_iCount*6)].vtex        = vec (texUR.x, texUR.y, 0.0f   );
                m_pData[1+(m_iCount*6)].dwColor     = m_dwColor;

                m_pData[2+(m_iCount*6)].vPos        = vec (posBL.x, posBL.y, posBL.z);
                m_pData[2+(m_iCount*6)].vtex        = vec (texBL.x, texBL.y, 0.0f   );
                m_pData[2+(m_iCount*6)].dwColor     = m_dwColor;

                m_pData[3+(m_iCount*6)].vPos        = vec (posUR.x, posUR.y, posUR.z);
                m_pData[3+(m_iCount*6)].vtex        = vec (texUR.x, texUR.y, 0.0f   );
                m_pData[3+(m_iCount*6)].dwColor     = m_dwColor;

                m_pData[4+(m_iCount*6)].vPos        = vec (posBL.x, posBL.y, posBL.z);
                m_pData[4+(m_iCount*6)].vtex        = vec (texBL.x, texBL.y, 0.0f   );
                m_pData[4+(m_iCount*6)].dwColor     = m_dwColor;

                m_pData[5+(m_iCount*6)].vPos        = vec (posBR.x, posBR.y, posBR.z);
                m_pData[5+(m_iCount*6)].vtex        = vec (texBR.x, texBR.y, 0.0f   );
                m_pData[5+(m_iCount*6)].dwColor     = m_dwColor;

                m_pVertBuff->Unlock ();
                m_pDevice->SetFVF (Svert::dwFvF);
                m_pDevice->SetTexture (0,m_pTexture);
                m_pDevice->SetStreamSource (0,m_pVertBuff,0,sizeof(Svert));
                m_pDevice->DrawPrimitive (D3DPT_TRIANGLELIST,0,2);
                //_________________________________________________________________


Effektiv sieht das jetzt so,wie oben aus. Ich habe mit dem Debugger geschaut, aber alle Werte sind genau gleich. Der einzige Unterschied ist, dass eimal von einem "normalen" Objekt aufgerufen wurde und das andere mal über einen Zeiger.

drakon

Supermoderator

  • »drakon« ist der Autor dieses Themas

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

29.01.2008, 12:09

Habe (oder besser dot hat) den Fehler gefunden.

Ich habe vergessen einen Vektor zu initialisieren... :oops:

Das hatte die Wirkung, dass die normalen Objekte dennoch auf 0 gesetzt worden sind, aber die mit den Zeigern hald nicht..

Auf eine Art bin ich froh, dass ich kein Verständnissfehler gehabt habe, aber anderseits ist mir das jetzt ziemlich peinlich, weil ich gestern ca. 10 Stunden gesucht habe... :roll:

Naja.. Danke nochmals an dot für die Hilfe und die Einweisung in zusätzliche Debugtools.. :D

Werbeanzeige