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

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

41

08.11.2007, 20:06

ups^^
das mit den parametern sollte ich mir nochmal durchlesen...

Ich probiere mall nun meine ReInit Funktion aus^^
die sieht eig so wie die normale init aus, nur das die davor tbDirect3D vorher mit tbDirect3D::Exit(); runterfährt und dan halt den werten hight und width eigene Parameter übergibt...

mfg
BRWeiden
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

42

08.11.2007, 21:19

so habs TB kompilieren lassen :
kein Problem!

habs Breakanoid kompiliern lassen:
bis zum Punkt, wo ich die Auflösung wählen konnte war alles in Ordnung nur dann...

1.) Shwarzer Bildschirm, konnte nichts machen (kein Taskmanager, alt + F4, alt+ tab etc.)
2.) musst PC abschmieren lassen (Strom raus)
3.)nachm einschalten musst c++ für die erste Verwendung vorbereitet werden^^

hier mal meine ReInit:

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
201
202
203
204
205
206
207
208
209
210
// ReInitialisieren

tbResult tbDirect3D::ReInit (tbConfig* pConfig,
                          char* pcWindowTitle,
                          HWND hOwnWindow,      // = NULL

                          HICON hIcon)
{
    tbDirect3D::Exit();

    int game_window_width = 800;
    int game_window_hight = 600;

    if(!hIcon) hIcon = LoadIcon(tb_g_DLLHandle, MAKEINTRESOURCE(TB_IDI_ICON1));

    HRESULT                 hResult;
    D3DPRESENT_PARAMETERS   PresentParams;
    WNDCLASSEX              WindowClass = {sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0, 0,
                                           tb_g_DLLHandle, hIcon, LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)),
                                           NULL, NULL, "TriBase Direct3D Window Class", NULL};


    // Parameter prüfen

    if(!pConfig) TB_ERROR_NULL_POINTER("pConfig", TB_ERROR);


    memset(m_abIsRS, 255, 210 * sizeof(BOOL));
    memset(m_abIsTSS, 255, 33 * sizeof(BOOL));
    memset(m_abIsSS, 255, 14 * sizeof(BOOL));

    m_abIsRS[0] = FALSE;
    m_abIsRS[1] = FALSE;
    m_abIsRS[2] = FALSE;
    m_abIsRS[3] = FALSE;
    m_abIsRS[4] = FALSE;
    m_abIsRS[5] = FALSE;
    m_abIsRS[6] = FALSE;
    m_abIsRS[10] = FALSE;
    m_abIsRS[11] = FALSE;
    m_abIsRS[12] = FALSE;
    m_abIsRS[13] = FALSE;
    m_abIsRS[17] = FALSE;
    m_abIsRS[18] = FALSE;
    m_abIsRS[21] = FALSE;
    m_abIsRS[30] = FALSE;
    m_abIsRS[31] = FALSE;
    m_abIsRS[32] = FALSE;
    m_abIsRS[33] = FALSE;
    m_abIsRS[39] = FALSE;
    m_abIsRS[40] = FALSE;
    m_abIsRS[41] = FALSE;
    m_abIsRS[42] = FALSE;
    m_abIsRS[43] = FALSE;
    m_abIsRS[44] = FALSE;
    m_abIsRS[45] = FALSE;
    m_abIsRS[46] = FALSE;
    m_abIsRS[49] = FALSE;
    m_abIsRS[50] = FALSE;
    m_abIsRS[51] = FALSE;
    for(DWORD dwRS = 61; dwRS <= 127; dwRS++) m_abIsRS[dwRS] = FALSE;
    m_abIsRS[144] = FALSE;
    m_abIsRS[149] = FALSE;
    m_abIsRS[150] = FALSE;
    m_abIsRS[153] = FALSE;
    m_abIsRS[164] = FALSE;
    m_abIsRS[169] = FALSE;
    m_abIsRS[177] = FALSE;
    m_abIsRS[196] = FALSE;
    m_abIsRS[197] = FALSE;
    
    m_abIsTSS[0] = FALSE;
    m_abIsTSS[12] = FALSE;
    m_abIsTSS[13] = FALSE;
    m_abIsTSS[14] = FALSE;
    m_abIsTSS[15] = FALSE;
    m_abIsTSS[16] = FALSE;
    m_abIsTSS[17] = FALSE;
    m_abIsTSS[18] = FALSE;
    m_abIsTSS[19] = FALSE;
    m_abIsTSS[20] = FALSE;
    m_abIsTSS[21] = FALSE;
    m_abIsTSS[25] = FALSE;
    m_abIsTSS[29] = FALSE;
    m_abIsTSS[30] = FALSE;
    m_abIsTSS[31] = FALSE;

    m_abIsSS[0] = FALSE;

    // Eintragen, ob der Benutzer sein eigenes Fenster hat oder nicht.

    // Wenn ja, das eigene Fenster eintragen.

    m_bOwnWindow = hOwnWindow != NULL;
    if(m_bOwnWindow) m_hWindow = hOwnWindow;

    TB_INFO("Die Direct3D-Komponente wird initialisiert...");

    // Muss ein Fenster erstellt werden?

    if(!tb_g_hWindow)
    {
        if(!m_bOwnWindow)
        {
            TB_INFO("Erstellen des Fensters...");
            
            // Die Fensterklasse registrieren

            if(!RegisterClassEx(&WindowClass))
            {
                // Fehler!

                TB_ERROR("Fehler beim Registrieren der Fensterklasse!", TB_ERROR);
            }

            int iWidth = game_window_width;
            int iHeight = game_window_hight;
            RECT Rect;
            SetRect(&Rect, 0, 0, game_window_width, game_window_hight);
            AdjustWindowRect(&Rect, WS_VISIBLE | WS_OVERLAPPEDWINDOW, FALSE);
            iWidth = Rect.right - Rect.left;
            iHeight = Rect.bottom - Rect.top;

            // Fenster erstellen und prüfen, ob es funktioniert hat

            m_hWindow = CreateWindow("TriBase Direct3D Window Class",
                                     pcWindowTitle,
                                     WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                                     GetSystemMetrics(SM_CXSCREEN) / 2 - game_window_width / 2,
                                     GetSystemMetrics(SM_CYSCREEN) / 2 - game_window_hight / 2,
                                     game_window_width,
                                     game_window_hight,
                                     NULL,
                                     NULL,
                                     tb_g_DLLHandle,
                                     NULL);
            if(!m_hWindow)
            {
                // Fehler!

                TB_ERROR("Erstellung des Fensters ist fehlgeschlagen!", TB_ERROR);
            }
        }

        tb_g_hWindow = m_hWindow;
    }
    else m_hWindow = tb_g_hWindow;

    TB_INFO("Initialisierung von Direct3D...");

    // IDirect3D9-Schnittstelle erzeugen

    m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(!m_pD3D)
    {
        // Fehler!

        TB_ERROR("Fehler beim Erstellen der IDirect3D9-Schnittstelle! DirectX 9 oder höher wird benötigt!", TB_ERROR);
    }

    // Präsentationsstruktur ausfüllen

    ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));
    PresentParams.BackBufferWidth               = game_window_width;
    PresentParams.BackBufferHeight              = game_window_hight;
    PresentParams.BackBufferFormat              = pConfig->Direct3D.BackBufferFormat;
    PresentParams.BackBufferCount               = 1;
    PresentParams.MultiSampleType               = pConfig->Direct3D.MultiSamplingType;
    PresentParams.MultiSampleQuality            = pConfig->Direct3D.dwMultiSamplingQuality;
    PresentParams.SwapEffect                    = D3DSWAPEFFECT_DISCARD;
    PresentParams.hDeviceWindow                 = m_hWindow;
    PresentParams.Windowed                      = pConfig->Direct3D.bWindowed;
    PresentParams.EnableAutoDepthStencil        = TRUE;
    PresentParams.AutoDepthStencilFormat        = pConfig->Direct3D.ZStencilBufferFormat;
    PresentParams.Flags                         = pConfig->Direct3D.ZStencilBufferFormat != D3DFMT_D16_LOCKABLE ? D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL : 0;
    PresentParams.FullScreen_RefreshRateInHz    = pConfig->Direct3D.bWindowed ? D3DPRESENT_RATE_DEFAULT : pConfig->Direct3D.VideoMode.RefreshRate;
    PresentParams.PresentationInterval          = pConfig->Direct3D.bVSync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;

    // Und nun die Geräteschnittstelle generieren

    if(FAILED(hResult = m_pD3D->CreateDevice(pConfig->Direct3D.iAdapter,
                                             pConfig->Direct3D.DeviceType,
                                             m_hWindow,
                                             pConfig->Direct3D.dwFlags,
                                             &PresentParams,
                                             &m_pD3DDevice)))
    {
        // Fehler beim Generieren der Schnittstelle!

        TB_ERROR_DIRECTX("m_pD3D->CreateDevice", hResult, TB_ERROR);
    }

    // Parameter eintragen

    m_PresentParams = PresentParams;

    // Die Gerätefähigkeiten abfragen und den aktuellen Status speichern

    m_pD3DDevice->GetDeviceCaps(&m_Caps);
    Capture();

    // Cursor im Vollbildmodus ausblenden

    if(!pConfig->Direct3D.bWindowed) ShowCursor(FALSE);

    // Standardeinstellungen

    SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);
    SetRS(D3DRS_DITHERENABLE, TRUE);
    for(DWORD dwStage = 0; dwStage < m_Caps.MaxTextureBlendStages; dwStage++)
    {
        if(m_Caps.PrimitiveMiscCaps & D3DPTFILTERCAPS_MINFANISOTROPIC) SetSS(dwStage, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
        else SetSS(dwStage, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        if(m_Caps.PrimitiveMiscCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) SetSS(dwStage, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
        else SetSS(dwStage, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        SetSS(dwStage, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
        SetSS(dwStage, D3DSAMP_MAXANISOTROPY, m_Caps.MaxAnisotropy);
    }

    m_vScreenSize.x = (float)(PresentParams.BackBufferWidth);
    m_vScreenSize.y = (float)(PresentParams.BackBufferHeight);

    TB_INFO("Die Initialisierung der Direct3D-Komponente ist abgeschlossen!");

    m_PresentResult = TB_OK;
    m_bInitialized = TRUE;

    return TB_OK;
}

hier mal mein menü in Breakanoid:

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
// Bewegt den Spielzustand

tbResult CMainMenu::Move(float fTime)
{
        tbResult r; 

    r = tbDoConfigDialog(&m_Config); // m_Config musste ich in der header erstellen, da das in der ReInit gebraucht wird...


    if(m_iMenu == 0)
    {
        // Wenn die Taste nach unten/oben gedrückt wurde, muss der Cursor

        // des Hauptmenüs bewegt werden.

        if(g_pbButtons[TB_KEY_UP])
        {
            g_pBreakanoid->m_apSound[0]->PlayNextBuffer();
            m_iCursorM--;
            tbDelay(80);
        }
        if(g_pbButtons[TB_KEY_DOWN])
        {
            g_pBreakanoid->m_apSound[0]->PlayNextBuffer();
            m_iCursorM++;
            tbDelay(80);
        }

        // Cursor in die Grenzen weisen

        if(m_iCursorM < 0) m_iCursorM = 3;
        if(m_iCursorM > 3) m_iCursorM = 0;
    }

    // Wenn die Enter-, Leer- oder Return-Taste gedrückt wurde,

    // dann möchte der Benutzer einen Eintrag auswählen oder

    // den Hilfetext wieder ausblenden.

    if(g_pbButtons[TB_KEY_RETURN] ||
       g_pbButtons[TB_KEY_NUMPADENTER] ||
       g_pbButtons[TB_KEY_SPACE])
    {
        // Signalsound abspielen

        g_pBreakanoid->m_apSound[1]->PlayNextBuffer();

        if(m_iMenu == 0)
        {
            // Nun kommt es darauf an, was gerade ausgewählt ist!

            switch(m_iCursorM)
            {
            case 0: // Spiel starten

                // Spielzustand auf GS_GAME setzen

                g_pBreakanoid->SetGameState(GS_GAME);
                break;

            case 1: // Hilfe anzeigen

                m_iMenu = 1;
                tbDelay(100);
                break;

            case 2: // Optionen anzeigen

                m_iMenu = 2;
                tbDelay(100);
                break;

            case 3: // Spiel beenden

                PostQuitMessage(0);
                break;
            }
        }
        else
        {
            // Die Hilfe wieder deaktivieren

            m_iMenu = 0;
            tbDelay(100);
        }
    }

    if(m_iMenu == 2)
    {
        // Wenn die Taste nach unten/oben gedrückt wurde, muss der Cursor

        // des Hauptmenüs bewegt werden.

        if(g_pbButtons[TB_KEY_UP])
        {
            g_pBreakanoid->m_apSound[0]->PlayNextBuffer();
            m_iCursorO--;
            tbDelay(80);
        }
        if(g_pbButtons[TB_KEY_DOWN])
        {
            g_pBreakanoid->m_apSound[0]->PlayNextBuffer();
            m_iCursorO++;
            tbDelay(80);
        }

        // Cursor in die Grenzen weisen

        if(m_iCursorO < 0) m_iCursorO = 3;
        if(m_iCursorO > 3) m_iCursorO = 0;
    }

    // Wenn die Enter-, Leer- oder Return-Taste gedrückt wurde,

    // dann möchte der Benutzer einen Eintrag auswählen oder

    // den Hilfetext wieder ausblenden.

    if(g_pbButtons[TB_KEY_RETURN] ||
       g_pbButtons[TB_KEY_NUMPADENTER] ||
       g_pbButtons[TB_KEY_SPACE])
    {
        // Signalsound abspielen

        g_pBreakanoid->m_apSound[1]->PlayNextBuffer();

        if(m_iOption == 0)
        {
            // Nun kommt es darauf an, was gerade ausgewählt ist!

            switch(m_iCursorO)
            {
            case 0: // 600 * 800

                // Spielzustand auf GS_GAME setzen

                m_iOption = 1;
                m_iMenu = 0;
                break;

            case 1: // 800*600

                m_iOption = 2;
                m_iMenu = 0;
                tbDirect3D::Instance().ReInit(&m_Config, "Breakanoid",
                                   NULL, LoadIcon(GetModuleHandle(NULL),
                                   MAKEINTRESOURCE(IDI_ICON1)));
                tbDelay(100);
                break;

            case 2: // 1024 * 800

                m_iOption = 3;
                m_iMenu = 0;
                tbDelay(100);
                break;

            case 3: // 1200 * 1024

                m_iOption = 4;
                m_iMenu = 0;
                tbDelay(100);
                break;
            }
        }
        else
        {
            // Die Hilfe wieder deaktivieren

            m_iOption = 0;
            tbDelay(100);
        }
    }

    return TB_OK;
}


BTW: habe erst eine Konfig, da ich es erstmal "ausprobieren" will, wie es geht...

mfg
BRWeiden
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

43

08.11.2007, 21:45

Zitat von »"BloodRaptor"«


2.) musst PC abschmieren lassen (Strom raus)


Vielleicht solltest Du das Neustarten der Engine erstmal im Fenstermodus statt im Vollbildmodus zum Laufen bekommen. Ich benutze den Vollbildmodus beim Entwickeln wirklich nur wenn es nicht zu vermeiden ist.
"Games are algorithmic entertainment."

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

44

08.11.2007, 22:03

@Osram:
hehe wolte es einmal im Fenster-modus laufen lassen-> Fehlermeldung: Fehler beim initialisieren des Spiels...

dan wollte ichs wie gewohnt im Vollbild laufen lassen:
Fenster öffnet sich, geht in den Vollbild, minimiert sich wieder und es öffnet sich ein neuse Fenster, dass Fehler heißt, welches man aber nur auf der Taskleiste sieht^^

jetzt geht nix mehr...

mfg
BRWeiden
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

45

08.11.2007, 22:28

was ist das denn ;)

C-/C++-Quelltext

1
m_bOwnWindow = hOwnWindow != NULL;

diese kombi habe ich noch nie gesehen.... :idea:

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

46

09.11.2007, 16:48

ich habs nicht geschrieben^^

stammt alles aus der TB...
das einzige, was ich gemacht habe ist das:

C-/C++-Quelltext

1
2
    int game_window_width = 800; 
    int game_window_hight = 600; 


zu meinem Absturz:
das hab ich wieder im griff...

so nun will er von mir am anfang die Konfig wissen, da wähle ich immer einen Fenstermodus, dann kommt direkt, wenn sich das Fenster öffnet noch einmal die Abfrage...

nun habe ich dieses Init zuegs (tbResul = r; etc.) auch in diese switch schleife unter case getan, dann hats geklappt, naja fast...
ich konnte nochmal auswählen, und als ichs ausgewählt habe, hats gekracht:
1.) musste den Prozess im taskmanager beenden, aber was mich gewundert hat: im Hintergrund (beim zweiten auswählen) lief das Spiel weiter allerdings sah man nur die menüeinträge, der hintergrund war weiß...


mfg
BRWeiden
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

47

09.11.2007, 18:31

Theoretisch musst du doch nur die TB herunterfahren->Das Fenster wird geschlossen und danach die TB erneut initialisieren. Das sollte doch möglich sein oder nicht?

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

48

09.11.2007, 18:58

ansich könnte man das auch machen. er muss ja wieso alles neuinitialisieren, texturemanager etc...

49

09.11.2007, 19:01

aber braucht man nicht relativ viel rechenzeit, um die TB runterfahren, fenster schließen, TB neu starten, Fenster neu initialisieren?

es müsste doch nen besseren Weg geben

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

50

09.11.2007, 19:27

ansich braucht das nicht viel rechen zeit. das eigentlich problem, was viel rechenkraft zieht, ist das neuladen der resourcen (texturen, buffer...).
aber da muss man sich eben was geschicktest einfallen lassen...

Werbeanzeige