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

1

20.11.2011, 16:01

Simples Direct3D-Programm funktioniert nicht

Hey Leute,
ich lese im moment das Buch "3D-Spieleprogrammierung mit DirectX9 und C++". Da ich mich nicht nur auf die vorgefertigten Funktionen der
TriBase-Engine verlassen wollte, habe ich ein bisschen mit den Initialisierungen herumprobiert. Dann war es soweit: Ich habe ein einfaches Fenster geschrieben, das mit Hilfen von IDirect3DDevice::Clear() mit einer beliebigen Farbe gefüllt werden kann. Es ließ sich problemlos kompilieren (sowohl mit STRG + F5 als auch mit STRG + ALT + F7), doch als ich die Anwendung gestartet habe kam die Fehlermeldung "DirectXProgramm.exe funktioniert nicht mehr". Ich habe schon viel versucht(Google...), bin aber zu keinem Ergebnis gekommen, deshalb möchte ich euch hier jetzt den Sourcecode schickem ( Vorweg: Ich weiß, der Stil ist nicht der beste ; Der Fehler tritte irgendwo in der Direct3D::Render() Funktion auf ; ich benutze VC++2010 express edition ;wenn ich diese Funktion auskommentiere und das Programm ausführe und das Fenster schließe bleibt das Programm bestehen (im Taskmanager gesehen). Hier 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
//main.cpp

#include "declarations.h"
#include "Direct3D.h"
#include "Resource.h"
#include "WindowProc.h"

Direct3D D3DClass;

int InitWindow(HINSTANCE hInst, char* WindowName)
{
int x, y;
x = 800;
y = 550;

WindowClass.cbClsExtra = NULL;
WindowClass.cbSize = sizeof(WNDCLASSEX);
WindowClass.cbWndExtra = NULL;
WindowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WindowClass.hCursor = LoadCursor(hInst, IDI_APPLICATION);
WindowClass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICONWINDOW));
WindowClass.hIconSm = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICONWINDOW));
WindowClass.hInstance = hInst;
WindowClass.lpfnWndProc = WindowProc;
WindowClass.lpszClassName = WindowName;
WindowClass.lpszMenuName = NULL;
WindowClass.style = CS_HREDRAW | CS_VREDRAW;

D3DClass.Init(g_hWindow);

RegisterClassEx(&WindowClass);

g_hWindow = CreateWindowEx(NULL, WindowName, WindowName, WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN) / 2 - x / 2,
  GetSystemMetrics(SM_CYSCREEN) / 2 - y / 2,
  x, y, NULL, NULL, hInst, NULL);

return 0;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iShowCmd)
{

MSG message;

InitWindow(hInstance, "Erstes Fenster, Uhuhuh!");
ShowWindow(g_hWindow, iShowCmd);
UpdateWindow(g_hWindow);

while(TRUE)
{
while(PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
if(message.message == WM_QUIT)
{
D3DClass.Quit();
UnregisterClass("Direct3D window", hInstance);
return (int)message.wParam;
}

D3DClass.Render();
}


D3DClass.Quit();
UnregisterClass("Direct3D window", hInstance);



return (int)message.wParam;
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
//declarations.h

#include <Windows.h>
#include <D3D9.h>

#pragma once

WNDCLASSEX WindowClass;
HWND g_hWindow;

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
//WindowProc.h

#include "declarations.h"

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT Paint;

    switch(message)
    {
    case WM_CREATE:
        break;
    case WM_DESTROY:
        {
        PostQuitMessage(0);
        return 0;
        }break;
    case WM_PAINT:
        {
            BeginPaint(hWnd, &Paint);
            FillRect(Paint.hdc, &Paint.rcPaint, (HBRUSH)(GetStockObject(BLACK_BRUSH)));
            EndPaint(hWnd, &Paint);
        }break;

    case WM_CLOSE:
        {
            DestroyWindow(hWnd);
            PostQuitMessage(0);
        }break;

    default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Direct3D.h

#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>

class Direct3D
{
public:
    int Init(HWND hWnd);
    int Quit();
    int Render();
private:
    PDIRECT3D9 D3D;
    D3DPRESENT_PARAMETERS D3DParams;
    PDIRECT3DDEVICE9 D3DDevice;
};

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
//Direct3D.cpp

#include "Direct3D.h"

int Direct3D::Init(HWND hWnd)
{
    CoInitialize(NULL);
    D3D = Direct3DCreate9(D3D_SDK_VERSION);

    ZeroMemory(&D3DParams, sizeof(D3DParams));

    D3DParams.Windowed = TRUE;
    D3DParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
    D3DParams.hDeviceWindow = hWnd;
    D3DParams.AutoDepthStencilFormat = D3DFMT_D24S8;
    D3DParams.BackBufferCount = 1;
    D3DParams.BackBufferFormat = D3DFMT_A2R10G10B10;
    D3DParams.BackBufferWidth = 1600;
    D3DParams.BackBufferHeight = 900;
    D3DParams.EnableAutoDepthStencil = TRUE;
    D3DParams.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    D3DParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    D3DParams.MultiSampleQuality = 100;
    D3DParams.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES;
    D3DParams.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

    D3D->CreateDevice(D3DADAPTER_DEFAULT,  D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3DParams, &D3DDevice);
    return 0;
}

int Direct3D::Quit()
{
    D3D->Release();
    D3DDevice->Release();
    return 0;
}

int Direct3D::Render()
{
    D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(100, 170, 100), 1.0f, 0);
    D3DDevice->BeginScene();
    D3DDevice->EndScene();
    D3DDevice->Present(NULL, NULL, NULL, NULL);
    return 0;
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//Resource.h

#define IDI_ICONWINDOW 9001


//Resource.rc

#include <windows.h>
#include "Resource.h"

IDI_ICONWINDOW ICON "C:\\Bilder\\Icon1.ico"

Was mache ich falsch?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

20.11.2011, 16:15

Was mache ich falsch?

Du hast deinen Debugger nicht benutzt.
Außerdem prüfst du nirgendwo, ob deine Direct3D-Initialisierung eigentlich geklappt hat.
Ich tippe(!) mal darauf, dass D3DFMT_A2R10G10B10 nicht unterstützt wird. Ist ein exotisches Format.

Dein ganzer Eintrag hier im Forum ist aber unnötig, da du mit Hilfe deines Debuggers herausfinden kannst, wo der Fehler liegt.

FSA

Community-Fossil

  • Private Nachricht senden

3

20.11.2011, 17:52

Und wenns mit F5 ( Debuggen ) Nich klappt mach halt mal F10 oder F11 ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige