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

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

1

25.06.2007, 21:36

Wieder Problem mit Dreieck(indirekt)

Ich habe ein indirektes Problem mit dem Dreieck-Beispiel.
Ich habe den Code eigentlich gründlich abgeglichen, aber, wenn man die Grafikeinstellungen vorgenommen hat, und Ok drückt, wird die Anwendung sofort geschlossen...kann ich mir eigentlich nicht erklären :(

Hier mal der Code:

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <windows.h>
#include <tribase.h>
#include "InitWindow.h"
#include "Direct3DEnum.h"
#include "InitDirect3D.h"
#include "Resource.h"





struct SVertex
{
    tbVector3 vPosition;
    DWORD dwColor;
};


//Globale Variablen anlegen

SDirect3DParameters g_D3DParameters;
SVertex g_aTriangleVertex[3];
float g_time = 0.0f;



tbResult initSzene()
{
    HRESULT hResult;

    //Vertexformat setzen - Position- und Farbangabe

    if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }

    

    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, false);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, true);
    //Seitenverhältnis berechnen

    float aspect = static_cast<float>(g_D3DParameters.VideoMode.Width) / static_cast<float>(g_D3DParameters.VideoMode.Height);
    
    //Projectionspatrix erzeugen

    tbMatrix mProjection = tbMatrixProjection(
                                TB_DEG_TO_RAD(90.0f),               // Sichtfeld: 90° (180°)

                                aspect,                             // Seitenverhältnis

                                0.1f,                               // Nahe Clipping-Ebene

                                100.0f);                            // ferne Clipping-Ebene


    //Projektionsmatrix einsetzen

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));

    //-------------------------------------------------------------------

    g_aTriangleVertex[0].vPosition = tbVector3(0.0f , 1.0f , 0.0f);
    g_aTriangleVertex[1].vPosition = tbVector3(1.0f , -1.0f, 0.0f);
    g_aTriangleVertex[2].vPosition = tbVector3(-1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[1].dwColor   = tbColor(0.0f, 1.0f, 0.0f);
    g_aTriangleVertex[2].dwColor   = tbColor(0.0f, 0.0f, 1.0f); 
    return TB_OK;
}

tbResult render(float seconds)
{
    //Translations- und Rotationsmatrix des Dreiecks erzeugen

    tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_time*90.0f)));
    tbMatrix mTranslation(tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f)));
    HRESULT hResult;

    //Beide Matrizen kombinieren und als Weltmatrix einsetzen

    tbMatrix mWorld(mRotation * mTranslation);
    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));


    // Den Bildpuffer und den Z-Buffer leeren

    if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 63),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!

        MessageBox(g_hWindow, "Fehler beim Leeren der Puffer!", "Fehler", MB_OK | MB_ICONEXCLAMATION);
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    //Szene beginnen

    g_pD3DDevice->BeginScene();

    //Dreieck zeichnen

    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,           // Dreiecksliste

                                                      1,                            // Zahl der Dreiecke

                                                      g_aTriangleVertex,            //Vertizes

                                                      sizeof(SVertex))))            //Vertexgröße

    {
        TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
    }



    //Szene beenden

    g_pD3DDevice->EndScene();
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);


    return TB_OK;
}

tbResult move(float seconds)
{
    g_time += seconds;
    return TB_OK;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pCmdLine, int iShowCmd)
{
    tbInit();


    tbResult Result = GetDirect3DParameters(&g_D3DParameters);
    if(Result == TB_ERROR)
    {
        MessageBox(NULL, "Fehler beim Abzählen!", "Error!", MB_OK | MB_ICONERROR);

        tbExit();
        return 0;
    }
    else if(Result = TB_CANCELED) //Der Dialog wurde abgebrochen

    {
        tbExit();
        return 0;
    }


    //Fenster initialisieren. Die Größe hängt vom gewählten Videomodus ab, der in der Parameterstruktur gespeichert ist.

    if(InitWindow(g_D3DParameters.VideoMode.Width, g_D3DParameters.VideoMode.Height, "Example", LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        //Fehler beim Erstellen des Fensters!

        MessageBox(NULL, "Fehler beim Erstellen des Fensters!", "Error!", MB_OK | MB_ICONERROR);

        tbExit();
        return 0;
    }

    //D3D mit abgefragten Einstellungen initialisieren

    if(InitDirect3D(&g_D3DParameters, g_hWindow))
    {
        //Fehler!

        MessageBox(NULL, "Fehler beim Initialisieren von D3D!", "Error!", MB_OK | MB_ICONERROR);

        ExitWindow();
        tbExit();
        return 0;
    }



    //Nachrichtenschleife

    tbDoMessageLoop(render, move);

    ExitDirect3D();
    ExitWindow();



    tbExit();
    return 0;
}


Hoffe, es sieht jemand den Fehler...

MfG

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

2

25.06.2007, 21:47

hast du schonmal die log datei gecheckt?
und ich meine mich schwach erinnern zu könne, dass InitWindow und InitDirect3D 0 zurückgeben, wenn die funktion geglückt ist.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

25.06.2007, 22:02

Re: Wieder Problem mit Dreieck(indirekt)

Zitat von »"Schnitter"«

Hoffe, es sieht jemand den Fehler...

Jo, da ist er:

Zitat von »"Schnitter"«

C-/C++-Quelltext

1
else if(Result = TB_CANCELED) //Der Dialog wurde abgebrochen

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

4

25.06.2007, 22:02

Die Log-datei sagt überhaupt nichts. Nur eben das übrige hochgefahren, runtergefahren, etc.

Troztdem mal hier:

Zitat


_________ __ _____
/\___ ___\ /\_\ /\ __\
\/__/\ \__/ _ __\/_/_ \ \ \_\\ ____ _____ __
\ \ \ /\`´__\ /\ \ \ \ __\ /\ __\_ /\ __\ /´__`\
\ \ \ \ \ \/ \ \ \ \ \ \_\\\ \\_\ \\ \____\ /\ __/
\ \_\ \ \_\ \ \_\ \ \____\\ \___\ \ \____\\ \____\
\/_/ \/_/ \/_/ \/____/ \/__/ \/____/ \/____/

INFO: TriBase-Engine wird initialisiert... (tribase.cpp, Zeile 86, Funktion tbInit)
INFO: Initialisierung komplett! (tribase.cpp, Zeile 104, Funktion tbInit)
INFO: TriBase-Engine wird heruntergefahren... (tribase.cpp, Zeile 113, Funktion tbExit)
INFO: Alle Speicherbereiche freigegeben! (tbmemory.cpp, Zeile 116, Funktion tbMemExit)
INFO: Herunterfahren abgeschlossen! (tribase.cpp, Zeile 149, Funktion tbExit)





EDIT:
Verdammt! Man, immer solche kleinen Fehler, die ich übersehe :(

Danke, David ;)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

26.06.2007, 00:57

Sowas kann man meistens schon vermeiden, indem man den Warnlevel von MSVS auf 4 stellt - da bemängelt er dann Zuweisungen in if-Bedingungen und viele andere kleine Sachen die einem so unterlaufen...

Schnitter

Treue Seele

  • »Schnitter« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

6

26.06.2007, 16:37

Wieder ein Fehler:
FEHLER: Der Aufruf von g_pD3DDevice->DrawPrimitiveUP verursachte den DirectX-Fehler D3DERR_INVALIDCALL! Beschreibung: Invalid call (main.cpp, Zeile 98, Funktion render)

Wieder Code^^

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <windows.h>
#include <tribase.h>
#include "InitWindow.h"
#include "Direct3DEnum.h"
#include "InitDirect3D.h"
#include "Resource.h"





struct SVertex
{
    tbVector3 vPosition;
    DWORD dwColor;
};


//Globale Variablen anlegen

SDirect3DParameters g_D3DParameters;
SVertex g_aTriangleVertex[3];
float g_time = 0.0f;



tbResult initSzene()
{
    HRESULT hResult;

    //Vertexformat setzen - Position- und Farbangabe

    if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }

    

    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, false);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, true);
    //Seitenverhältnis berechnen

    float aspect = static_cast<float>(g_D3DParameters.VideoMode.Width) / static_cast<float>(g_D3DParameters.VideoMode.Height);
    
    //Projectionspatrix erzeugen

    tbMatrix mProjection = tbMatrixProjection(
                                TB_DEG_TO_RAD(90.0f),               // Sichtfeld: 90° (180°)

                                aspect,                             // Seitenverhältnis

                                0.1f,                               // Nahe Clipping-Ebene

                                100.0f);                            // ferne Clipping-Ebene


    //Projektionsmatrix einsetzen

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));

    //-------------------------------------------------------------------

    g_aTriangleVertex[0].vPosition = tbVector3(0.0f , 1.0f , 0.0f);
    g_aTriangleVertex[1].vPosition = tbVector3(1.0f , -1.0f, 0.0f);
    g_aTriangleVertex[2].vPosition = tbVector3(-1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[1].dwColor   = tbColor(0.0f, 1.0f, 0.0f);
    g_aTriangleVertex[2].dwColor   = tbColor(0.0f, 0.0f, 1.0f); 
    return TB_OK;
}

tbResult render(float seconds)
{
    //Translations- und Rotationsmatrix des Dreiecks erzeugen

    tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_time*90.0f)));
    tbMatrix mTranslation(tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f)));
    HRESULT hResult;

    //Beide Matrizen kombinieren und als Weltmatrix einsetzen

    tbMatrix mWorld(mRotation * mTranslation);
    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));


    // Den Bildpuffer und den Z-Buffer leeren

    if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 63),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!

        MessageBox(g_hWindow, "Fehler beim Leeren der Puffer!", "Fehler", MB_OK | MB_ICONEXCLAMATION);
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    //Szene beginnen

    g_pD3DDevice->BeginScene();

    //Dreieck zeichnen

    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,           // Dreiecksliste

                                                      1,                            // Zahl der Dreiecke

                                                      g_aTriangleVertex,            //Vertizes

                                                      sizeof(SVertex))))            //Vertexgröße

    {
        TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
    }



    //Szene beenden

    g_pD3DDevice->EndScene();
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);


    return TB_OK;
}

tbResult move(float seconds)
{
    g_time += seconds;
    return TB_OK;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pCmdLine, int iShowCmd)
{
    tbInit();


    tbResult Result = GetDirect3DParameters(&g_D3DParameters);
    if(Result == TB_ERROR)
    {
        MessageBox(NULL, "Fehler beim Abzählen!", "Error!", MB_OK | MB_ICONERROR);

        tbExit();
        return 0;
    }
    else if(Result == TB_CANCELED) //Der Dialog wurde abgebrochen

    {
        tbExit();
        return 0;
    }


    //Fenster initialisieren. Die Größe hängt vom gewählten Videomodus ab, der in der Parameterstruktur gespeichert ist.

    if(InitWindow(g_D3DParameters.VideoMode.Width, g_D3DParameters.VideoMode.Height, "Example", LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        //Fehler beim Erstellen des Fensters!

        MessageBox(NULL, "Fehler beim Erstellen des Fensters!", "Error!", MB_OK | MB_ICONERROR);

        tbExit();
        return 0;
    }

    //D3D mit abgefragten Einstellungen initialisieren

    if(InitDirect3D(&g_D3DParameters, g_hWindow))
    {
        //Fehler!

        MessageBox(NULL, "Fehler beim Initialisieren von D3D!", "Error!", MB_OK | MB_ICONERROR);

        ExitWindow();
        tbExit();
        return 0;
    }



    //Nachrichtenschleife

    tbDoMessageLoop(render, move);

    ExitDirect3D();
    ExitWindow();



    tbExit();
    return 0;
}



Nochwas: Wo setze ich das Warnlevel?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

26.06.2007, 16:55

Du rufst deine "initSzene" (denglisch) nirgendwo auf.
Lern mal einen Debugger zu benutzen. Wenn du die Grundlagen noch nicht drauf hast, hat es keinen Sinn, mit 3D-Grafik anzufangen.
Den Warnlevel stellst du irgendwo in den Projekteigenschaften ein.

Werbeanzeige