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

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

19.12.2005, 21:51

D3DERR_INVALIDCALL! Finde den Fehler nicht ...

Tja, ich bin immernoch beim Dreieck, das ist der Fehler laut dem Log:

Zitat

FEHLER: Der Aufruf von g_pD3DDevice -> DrawPrimitiveUP verursachte den DirectX-Fehler D3DERR_INVALIDCALL! Beschreibung: Invalid call


Lässt sich alles ohne Fehler kompilieren, Probleme treten erst zur Laufzeit auf. Laut Log ist die Funktion bei Zeile 67, ich hab diese Stelle extra mit einem //Fehler? gekennzeichnet, ihr sollt ja nich ewig suchen ^^

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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
// Kapitel 2

// Beispielprogramm 02

// ===================

// Auflisten aller Direct3D-Optionen und anschließende Erstellung

// einer Geräteschnittstelle (IDirect3DDevice9).

// Zu den Optionen gehören unter anderem:

// - Adapter und Gerätetyp

// - Videomodi

// - Multi-Sampling-Typen und -Qualitätsstufen

// - Hardware- oder Softwareverarbeitung?


#include <Windows.h>
#include <TriBase.h>
#include "InitWindow.h"
#include "Direct3DEnum.h"
#include "InitDirect3D.h"
#include "Resource.h"

// ******************************************************************

// Strukturen

struct sVertex
{
    tbVector3 vPosition; // Position des Vertex

    DWORD     dwColor;   // Farbe des Vertex

};

// ******************************************************************

// Globale Variablen

SDirect3DParameters g_Direct3DParameters;   // Direct3D-Parameter

float               g_fTime = 0.0f;         // Globale Time Variable+

sVertex             g_aTriangleVertex[3];
HRESULT             hResult;

// ******************************************************************

// Render-Funktion

tbResult Render(float fNumSecsPassed)
{
    HRESULT hResult;
    // Rotations- und Translationsmatrix für das Dreieck erzeugen

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

    // Beide Matrizen kombinieren und als Weltmatrix einsetzen

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

    // Den Bildpuffer und den zBuffer leeren

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

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

    // Szene beginnen

    g_pD3DDevice -> BeginScene();

    // Nun das Dreieck zeichnen

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

                                                        1,                  //1 Dreieck

                                                        g_aTriangleVertex,  //Vertizes

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

    {
        // Fehler beim Zeichnen

        //Fehler? Nja, wohl eher in der Funktion drüber ...

        TB_ERROR_DIRECTX("g_pD3DDevice -> DrawPrimitiveUP", hResult, TB_STOP);
    }
    
    g_pD3DDevice->EndScene();
    g_pD3DDevice->Present(NULL,NULL,NULL,NULL);

    return TB_OK;
}

// ******************************************************************

// Move-Funktion

tbResult Move(float fNumSecsPassed)
{
    g_fTime += fNumSecsPassed;
    return TB_OK;
}

// ******************************************************************

// InitScene

tbResult InitScene()
{
    HRESULT     hResult;
    tbMatrix    mRotation;      // Rotationsmatrix

    tbMatrix    mTranslation;   // Translationsmatrix

    tbMatrix    mWorld;         // Vereinende Weltmatrix


    // Vertexformat setzen - Positions und Farbangaben

    if(FAILED(hResult = g_pD3DDevice -> SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)));
    {
        // Fehler beim Setzen des Vertexformats

        TB_ERROR_DIRECTX("g_pD3DDEVICE->SetFVF", hResult, TB_ERROR);
    }

    // Beleuchtung und Culling ausschalten, Dithering aktivieren

    g_pD3DDevice -> SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice -> SetRenderState(D3DRS_DITHERENABLE, TRUE);

    // Das Bildschirmseitenverhältnis berechnen

    float fAspect = (float)(g_Direct3DParameters.VideoMode.Width) /
                    (float)(g_Direct3DParameters.VideoMode.Height);

    // Die Projektionsmatrix erzeugen

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

                                              fAspect,              // Bildseitenverhältnis

                                              0.1f,                 // Nahe  Clipping Ebene

                                              100.0f);              // Ferne Clipping Ebene


    // Projektionsmatrix einsetzen

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

    // Initialisieren des Dreiecks

    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;
}

// ******************************************************************

// Windows-Hauptfunktion

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCmdLine,
                   int iShowCmd)
{
    SDirect3DParameters Direct3DParameters;
    tbResult            Result;


    // TriBase-Engine initialisieren

    tbInit();

    // Direct3D-Optionen abfragen (vom Benutzer gewählt)

    Result = GetDirect3DParameters(&Direct3DParameters);
    if(Result == TB_ERROR)
    {
        // Es trat ein Fehler auf!

        MessageBox(NULL, "Fehler beim Abzählen!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        tbExit();
        return 1;
    }
    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(Direct3DParameters.VideoMode.Width,
                  Direct3DParameters.VideoMode.Height,
                  "Beispielprogramm Nr. 2: Direct3D-Abzählung",
                  LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        // Fehler beim Erstellen des Fensters!

        MessageBox(NULL, "Fehler beim Erstellen des Fensters!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        tbExit();
        return 1;
    }

    // Direct3D mit den abgefragten Einstellungen initialisieren

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

        MessageBox(g_hWindow, "Fehler beim Initialisieren von Direct3D!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        ExitWindow();
        tbExit();
        return 1;
    }

    // Nachrichtenschleife

    tbDoMessageLoop(Render, Move);

    // Direct3D und Fenster herunterfahren

    ExitDirect3D();
    ExitWindow();

    // Engine herunterfahren

    tbExit();

    return 0;
}

// ******************************************************************


Code genommen aus nem vorigen Beispiel und dann eben modifiziert.

DarkFitzi

Alter Hase

Beiträge: 608

Wohnort: Eisenberg, Thüringen

Beruf: Schüler, 10te Klasse

  • Private Nachricht senden

2

19.12.2005, 21:57

aus der MSDN: D3DERR_INVALIDCALL
The method call is invalid. For example, a method's parameter may have an invalid value.

Debug mal zur Laufzeit und überpfüfe die Werte der Parameter von DrawPrimitiveUP
Ich würde die Welt gern verbessern, doch Gott gibt mir den Sourcecode nicht! :-(

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

20.12.2005, 11:27

äh nur sone frage, aber was macht das global hResult da? ???

leo

Frischling

  • Private Nachricht senden

5

20.12.2005, 11:39

Geh mal in der Systemsteuerung auf DirectX und stell da bei Direct3D auf Debug.

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

6

20.12.2005, 13:40

Zitat von »"Sk!p"«

äh nur sone frage, aber was macht das global hResult da? ???

Hm, auf jeden Fall nix sinnvolles xD, bringt aber keine Änderung ...


Zitat von »"leo"«

Geh mal in der Systemsteuerung auf DirectX und stell da bei Direct3D auf Debug.

Gut, und weiter? Sorry, bin echt absoluter Neuling bei DirectX ... Falls das Programm nun aber gehen sollte, nein, tut es nicht :crying:

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

20.12.2005, 14:34

hehe ist dir mal in den Sinn gekommen, InitScene() auszuführen, bevor du tbDoMessageLoop aufrufst?^^


Mein 666. Beitrag }>

(Link)

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

8

20.12.2005, 14:54

Zitat

hehe ist dir mal in den Sinn gekommen, InitScene() auszuführen, bevor du tbDoMessageLoop aufrufst?^^

Hmmm, ich hatte da plötzlich diese Eingebung :angel: Danke, immerhin den Fehler bin ich nun los, jetzt wird zwar das Dreieck nicht gerendert (also es ist nicht sichtbar ...) aber ich find bestimmt noch mal n paar Fehler ^^

baba_melone

Frischling

Beiträge: 62

Wohnort: 66879 Obermohr

Beruf: Schüler

  • Private Nachricht senden

9

23.12.2005, 18:01

Wieso stopfst du Fensteraufbau usw in die Main-Funktion? Das trägt nicht gerade zur Übersichtlichkeit deines Codes bei. Verwende doch wie im Buch eine Funktion wie InitApplication(). Tipp: Ich habe mir die Funktion InitApplication() so geschrieben, dass sie für jedes Spiel verwendbar ist. Als Argumente dient die InitScene-Funktion und eine Struktur, die alle sonstigen (wichtigen) Parameter übernimmt.

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

10

25.12.2005, 13:33

Zitat von »"baba_melone"«

Wieso stopfst du Fensteraufbau usw in die Main-Funktion? Das trägt nicht gerade zur Übersichtlichkeit deines Codes bei. Verwende doch wie im Buch eine Funktion wie InitApplication(). Tipp: Ich habe mir die Funktion InitApplication() so geschrieben, dass sie für jedes Spiel verwendbar ist. Als Argumente dient die InitScene-Funktion und eine Struktur, die alle sonstigen (wichtigen) Parameter übernimmt.


Stimmt! Ich hab mein Problem immer noch nicht gefunden ... Ich schreib das alles mal neu denk ich mal so :)

Edit:

Aber soweit wie du geh ich dann erstmal dochnich, man will ja mit kleinen Dingen anfangen ^^

Werbeanzeige