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

Harry222

Alter Hase

  • »Harry222« ist der Autor dieses Themas

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

1

20.07.2010, 18:58

Fehler beim Rendern von tbModel - Programm hängt sich offenbar auf!

Hi Leute!
Ich habe hier ein merkwürdiges Problem! Ich bin gerade dabei ein Vier-Gewinnt 3D-Spiel zu programmieren! leider treten da schon beim Intro Fehler auf.
Für das Intro werden ein paar Modelle, per tbModel-Klasse geladen. Die Modelle werden in der Load-Funktion der CIntro-Klasse geladen und in der Unload-Funktion wieder entladen. Wenn ich nun in der Render-Funktion ein Modell rendern will, hängt sich das Programm anscheinend auf. Wenn ich das Programm dann beende und mir die VisualStudio-Ausgaben und die Log-Datei ansehe, finde ich keinerlei Fehlermeldungen!
Ich habe dann probiert, nicht die Modelle, sondern einen kleinen Text, per tbFont-Klasse zu rendern. Was mich sehr verwundert hat ist, dass das Programm gestartet ist und ohne weitere Macken den Text angezeigt hat.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Harry222« (22.07.2010, 12:08)


2

20.07.2010, 19:04

Willkommen erstmal! ;)

Etwas Quellcode wäre nicht schlecht.
fka tm

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

3

20.07.2010, 21:08

Vielleicht stimmen deine Transformations- bzw. Kameraeinstellungen nicht, so dass die Modelle nicht sichtbar sind.

Etwas Quellcode wäre nicht schlecht.

Dem stimme ich zu.

Harry222

Alter Hase

  • »Harry222« ist der Autor dieses Themas

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

4

20.07.2010, 21:11

Dankeschön für die Willkommensgrüße!

Ich hoffe, dass der folgende Quellcode und die Erkärungen ausreichen:

Zur Erklärung:
Das Intro soll so aussehen, dass dort das Levelmodell gerendert wird und sich ein paar Pins (Die kleinen Scheiben, die man in das Spielbrett wirft, habe ich Pins genannt) in dem Spielfeld sind. man hätte auch einfach ein Bild machen können, aber ich dachte mir, es sähe ganz schön aus, wenn die Kamera dann um das Levelmodell herumfährt.
Für die Pins habe ich eine klasse entworfen, die die Pinmodelle lädt und diese dann auch verwaltet. Man kann dort mit der Funktion "int CPin::GetNextFreePlace()" einen Platz für einen neuen Pin suchen und mit "tbResult AddPin(int Place, int Zeile, int Spalte)" einen Pin hinzufügen.
Die Parameter der AddPin()-Funktion bedeuten übrigens:
int Place : Freier Platz, der von GetNextFreePlace() zurückgegeben wurde und den der neue Pin belegen kann.
int Zeile, int Spalte : Ich habe mich entschieden, das Feld in Zeilen und Spalten zu unterteilen.

Hier sind erst einmal die Load(), Unload(), sowie die Render()-Funktion der CPin-Klasse:

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
tbResult CPin::Load(){
    //Modelle laden
    if(m_vPinModelWhite1.Init("PinWhite1.tbm")){
        //Fehler!
        TB_ERROR("Das weisse Pinmodel 1 konnte nicht geladen werden!", TB_ERROR);
        return TB_ERROR;
    }
    if(m_vPinModelWhite2.Init("PinWhite2.tbm")){
        //Fehler!
        TB_ERROR("Das weisse Pinmodel 2 konnte nicht geladen werden!", TB_ERROR);
        return TB_ERROR;
    }
    if(m_vPinModelBlack1.Init("PinBlack1.tbm")){
        //Fehler!
        TB_ERROR("Das schwarze Pinmodel 1 konnte nicht geladen werden!", TB_ERROR);
        return TB_ERROR;
    }
    if(m_vPinModelBlack2.Init("PinBlack2.tbm")){
        //Fehler!
        TB_ERROR("Das schwarze Pinmodel 2 konnte nicht geladen werden!", TB_ERROR);
        return TB_ERROR;
    }

    return TB_OK;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tbResult CPin::Unload(){
    //Pin Modelle entladen
    if(m_vPinModelWhite1.Exit()){
        TB_ERROR("Das weisse Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
    }
    if(m_vPinModelWhite2.Exit()){
        TB_ERROR("Das weisse Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
    }
    if(m_vPinModelBlack1.Exit()){
        TB_ERROR("Das schwarze Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
    }
    if(m_vPinModelBlack2.Exit()){
        TB_ERROR("Das schwarze Pinmodel 1 konnte nicht entladen werden!", TB_ERROR);
    }

    return TB_OK;
}


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
tbResult CPin::Render(float fTime){
    //Direct3D
    tbDirect3D &D3D = tbDirect3D::Instance();

    //Variablen
    tbMatrix mOldWorld;
    tbMatrix mWorld;

    //Alte Weltmatrix speichern
    mOldWorld = D3D.GetTransform(D3DTS_WORLD);

    for(int i=0;i<=34;i++){
        //Neue Weltmatrix einsetzen
        mWorld = tbMatrixTranslation(m_vPosition[i]) * m_vPin1Matrix[i];
        D3D.SetTransform(D3DTS_WORLD, mWorld);

        //Pin zeichnen
        if(m_bColor[i] == TRUE){
            m_vPinModelWhite1.Render();
        }
        else{
            m_vPinModelBlack1.Render();
        }

        //Neue Weltmatrix einsetzen
        mWorld = tbMatrixTranslation(m_vPosition[i]) * m_vPin2Matrix[i];
        D3D.SetTransform(D3DTS_WORLD, mWorld);

        //Pin zeichnen
        if(m_bColor[i] == TRUE){
            m_vPinModelWhite2.Render();
        }
        else{
            m_vPinModelBlack2.Render();
        }
    }

    //Alte Weltmatrix einsetzen
    D3D.SetTransform(D3DTS_WORLD, mOldWorld);
    return TB_OK;
}



Ich hoffe hier sind keine weiteren Erklärungen nötig.

Und hier sind die Load(), Unload(), sowie die Render()-Funktion der CIntro-Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
tbResult CIntro::Load(){
    //Modelle laden
    if(m_vLevelModel.Init("Model.tbm")){
        //Fehler!
        TB_ERROR("Das Levelmodel konnte nicht geladen werden!", TB_ERROR);
    }

    return TB_OK;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
tbResult CIntro::Unload(){
    //Modelle entladen
    if(m_vLevelModel.Exit()){
        //Fehler!
        TB_ERROR("Das Levelmodel konnte nicht entladen werden!", TB_ERROR);
    }

    return TB_OK;
}


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
tbResult CIntro::Render(float fTime){
    //Direct3D
    tbDirect3D &D3D = tbDirect3D::Instance();

    //Es Gibt ein Lichter
    D3DLIGHT9 m_pLight;

    //Material
    D3DMATERIAL9 xMaterial;

    D3D->BeginScene();

    //Sichtmatrix setzen
        tbMatrix mView = tbMatrixTranslation(tbVector3(0.0f, 2.0f, -3.0f)) * 
        tbMatrixRotationY(90.0f * m_fTime);
    D3D.SetTransform(D3DTS_VIEW, mView);

    // Die Projektionsmatrix erzeugen und einsetzen.
        tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(70.0f), 
        tbDirect3D::Instance().GetAspect(), 0.1f, 100.0f);
        tbDirect3D::Instance()->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));

    //Sichtmatrix setzen
    tbMatrix mWorld = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 0.0f));
    D3D.SetTransform(D3DTS_WORLD, mWorld);

    //Weiße Hintergrundbeleuchtung
    D3D.SetRS(D3DRS_FILLMODE, D3DFILL_SOLID);
    D3D.SetRS(D3DRS_AMBIENT, tbColor(1.0f, 1.0f, 1.0f));
    D3D.SetRS(D3DRS_LIGHTING, TRUE);
    D3D.SetRS(D3DRS_CULLMODE, D3DCULL_NONE);
    D3D.SetRS(D3DRS_ZENABLE, TRUE);
    D3D.SetRS(D3DRS_ZWRITEENABLE, TRUE);
    D3D.Capture();

    ZeroMemory(&m_pLight, sizeof(D3DLIGHT9));
    m_pLight.Type = D3DLIGHT_POINT;
    m_pLight.Diffuse = tbColor(1.0f, 1.0f, 1.0f);
    m_pLight.Ambient = tbColor(1.0f, 1.0f, 1.0f);
    m_pLight.Specular = tbColor(1.0f, 1.0f, 1.0f);

    m_pLight.Position = tbVector3(0.0f, 2.0f, -3.0f);
    m_pLight.Range = 1000.0f;
    m_pLight.Attenuation0 = 0.0f;
    m_pLight.Attenuation1 = 0.25f;
    m_pLight.Attenuation2 = 0.0f;

    D3D->SetLight(0, &m_pLight);
    D3D->LightEnable(0, TRUE);

    xMaterial.Diffuse = tbColor(0.75f,0.75f,0.75f);
    xMaterial.Ambient = tbColor(0.25f,0.25f,0.25f);
    xMaterial.Emissive = tbColor(0.0f,0.0f,0.0f);
    xMaterial.Specular = tbColor(0.25f,0.25f,0.25f);
    xMaterial.Power = 5.0f;
    D3D->SetMaterial(&xMaterial);

    m_vLevelModel.Render();

    CPin::Instance().Render(fTime);

    D3D->EndScene();

    return TB_OK;
}


Ich hoffe dass auch hier alles klar ist!
Die Move()-Funktionen zum Beispiel habe ich erst einmal weggelassen, da sie nichts tun, was mit der Grafik direkt zusammenhängt!
Falls noch mehr Code benötigt wird, einfach schreiben!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Harry222« (20.07.2010, 21:27)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

20.07.2010, 21:14

Bitte Editier das und füge Code-Tags ein, so ist das echt unleserlich.

Harry222

Alter Hase

  • »Harry222« ist der Autor dieses Themas

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

6

20.07.2010, 21:15

Aber wie macht man das?

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

20.07.2010, 21:24

Geh auf Editieren und füge [ cpp] vor deinem Code und [ /cpp] nach deinem Code ein (ohne Leerzeichen in der eckigen Klammer!)

Harry222

Alter Hase

  • »Harry222« ist der Autor dieses Themas

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

8

20.07.2010, 21:29

Vielen Dank!

Hab meinen Text korrigiert. ist jetzt viel besser lesbar!

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

9

20.07.2010, 21:42

Ah sind schöner aus :D

Wo vermutest du den Fehler, was passiert? Stürzt das Programm ab oder zeigt es nur nichts an?

Harry222

Alter Hase

  • »Harry222« ist der Autor dieses Themas

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

10

20.07.2010, 21:46

Der Bildschirm ist schwarz! Man sieht allerdings noch die Taskleiste!
Ich vermute, dass sich das Programm beim ersten rendern aufhängt, da man halt noch die Taskleiste sieht!

Ich sehe morgen früh nochmal rein! Danke und tschuss!

Werbeanzeige