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

12.10.2006, 15:12

Flimmern des Intros bei Breakanoid

Hi!

Ich bin im Buch gerade bis zum Intro von Breakanoid vorgedrungen, aber wenn ich das Programm im Vollbildmodus laufen lasse, flimmert es total. (Man kann in der linken und rechten oberen Ecke auch noch die runden Kanten des XP-Fensters erkennen, wenn ihr wisst, was ich meine)
Im Fenstermodus funktioniert jedoch alles einwandfrei...

Habe sogar schon die Intro.cpp Datei von der CD kopiert, um sicher zu gehen, dass da kein Fehler ist. Hab mich ansonsten auch genau an das Buch gehalten, bin also ziemlich ratlos, was da schief gegangen sein könnte.

Sicherheitshalber noch der Quellcode:
Intro.cpp:

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
/*
**  BREAKANOID
**  ==========
**
**  Intro.cpp
**  ---------
**  Der Vorspann
*/

#include "Breakanoid.h"


// __________________________________________________________________

// Vertizes für das Titelbild

struct STitleVertex
{
    tbVector3           vPosition;
    float               fRHW;
    D3DCOLOR            Color;
    tbVector2           vTex0;
    static const DWORD  dwFVF;
};

const DWORD STitleVertex::dwFVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1;

// __________________________________________________________________

// Initialisiert den Spielzustand

tbResult CIntro::Init()
{
    // Laden...

    if(Load()) TB_ERROR("Fehler beim Laden des Spielzustands!", TB_ERROR);

    return TB_OK;
}

// __________________________________________________________________

// Fährt den Spielzustand herunter

tbResult CIntro::Exit()
{
    // Entladen...

    Unload();

    return TB_OK;
}

// __________________________________________________________________

// Lädt den Spielzustand

tbResult CIntro::Load()
{
    // Titelbild laden

    m_pTitle = tbTextureManager::Instance().GetTexture("Data\\Title.jpg");
    if(m_pTitle == NULL) TB_ERROR("Fehler beim Laden von Data\\Title.jpg!", TB_ERROR);

    return TB_OK;
}

// __________________________________________________________________

// Entlädt den Spielzustand

tbResult CIntro::Unload()
{
    // Die Textur löschen

    tbTextureManager::Instance().ReleaseTexture(m_pTitle);

    return TB_OK;
}

// __________________________________________________________________

// Bewegt den Spielzustand

tbResult CIntro::Move(float fTime)
{
    // Wenn eine der typischen Tasten gedrückt wurde: zum Hauptmenü!

    if(g_pbButtons[TB_KEY_NUMPADENTER] ||
       g_pbButtons[TB_KEY_RETURN] ||
       g_pbButtons[TB_KEY_SPACE] ||
       g_pbButtons[TB_MOUSE_BUTTON(0)] ||
       g_pbButtons[TB_MOUSE_BUTTON(1)])
    {
        tbDelay(100);
        g_pBreakanoid->SetGameState(GS_MAIN_MENU);
    }

    return TB_OK;
}

// __________________________________________________________________

// Rendert den Spielzustand

tbResult CIntro::Render(float fTime)
{
    STitleVertex aVertex[4];


    // Puffer leeren und Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    D3D->BeginScene();

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


    // Vertexformat und Titelbildtextur setzen, Z-Buffer aus

    D3D.SetFVF(STitleVertex::dwFVF);
    D3D.SetTexture(0, m_pTitle);
    D3D.SetRS(D3DRS_ZENABLE, D3DZB_FALSE);

    // Die vier Vertizes des Titelbilds erstellen (Rechteck)

    // Links unten

    aVertex[0].vPosition = tbVector3(0.0f, D3D.GetScreenSize().y, 0.5f);
    aVertex[0].fRHW = 1.0f;
    aVertex[0].Color = tbColor(1.0f, 0.8f, 0.8f);
    aVertex[0].vTex0 = tbVector2(0.0f, 1.0f);

    // Links oben

    aVertex[1].vPosition = tbVector3(0.0f, 0.0f, 0.0f);
    aVertex[1].fRHW = 1.0f;
    aVertex[1].Color = tbColor(0.8f, 1.0f, 0.8f);
    aVertex[1].vTex0 = tbVector2(0.0f, 0.0f);

    // Rechts unten

    aVertex[2].vPosition = tbVector3(D3D.GetScreenSize().x, D3D.GetScreenSize().y, 0.5f);
    aVertex[2].fRHW = 1.0f;
    aVertex[2].Color = tbColor(0.8f, 0.8f, 1.0f);
    aVertex[2].vTex0 = tbVector2(1.0f, 1.0f);

    // Rechts oben

    aVertex[3].vPosition = tbVector3(D3D.GetScreenSize().x, 0.0f, 0.5f);
    aVertex[3].fRHW = 1.0f;
    aVertex[3].Color = tbColor(1.0f, 1.0f, 0.8f);
    aVertex[3].vTex0 = tbVector2(1.0f, 0.0f);

    // Texturkoordinaten sinusförmig verschieben ("wabbeln")

    for(DWORD dwVertex = 0; dwVertex < 4; dwVertex++)
    {
        aVertex[dwVertex].vTex0.x += sinf(g_pBreakanoid->m_fTime + (float)(dwVertex)) * 0.01f;
        aVertex[dwVertex].vTex0.y += cosf(g_pBreakanoid->m_fTime + (float)(dwVertex)) * 0.01f;
    }

    // Als Dreiecksfolge zeichnen

    D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(STitleVertex));

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


    // Kleinen Text anzeigen

    g_pBreakanoid->m_pFont2->Begin();
    g_pBreakanoid->m_pFont2->DrawText(tbVector2(0.5f, 0.7f), "Powered by TriBase", TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING);
    g_pBreakanoid->m_pFont2->DrawText(tbVector2(0.5f, 0.8f), "- Drücken Sie Enter -", TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER | TB_FF_RELATIVE | TB_FF_RELATIVESCALING);
    g_pBreakanoid->m_pFont2->End();

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


    // Szene beenden

    D3D->EndScene();

    return TB_OK;
}

// __________________________________________________________________


Breakanoid.cpp:

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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include "Breakanoid.h"

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

// Globale Variablen

CBreakanoid*    g_pBreakanoid = NULL;
float*          g_pfButtons = NULL;
BOOL*           g_pbButtons = NULL;


tbResult CBreakanoid::SetGameState(EGameState NewGameState)
{
    switch(m_GameState)
    {
    case GS_INTRO: m_pIntro->Exit(); break;
    case GS_MAIN_MENU: m_pMainMenu->Exit(); break;
    case GS_GAME: m_pGame->Exit(); break;
    }

    m_fTime = 0.0f;

    tbResult r = TB_OK;

    m_GameState = NewGameState;
    switch(m_GameState)
    {
    case GS_INTRO:      r = m_pIntro->Init(); break;
    case GS_MAIN_MENU:  r = m_pMainMenu->Init(); break;
    case GS_GAME:       r = m_pGame->Init(); break;
    }

    if(r) TB_ERROR("Fehler beim Laden des Spielzustandes!", TB_ERROR);

    return TB_OK;
}

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


tbResult CBreakanoid::Load()
{
    if(tbDirect3D::Instance().Init(&m_Config, "Breakanoid", 
                                   NULL, LoadIcon(GetModuleHandle(NULL), 
                                   MAKEINTRESOURCE(IDI_ICON1))))
    {
        TB_ERROR("Fehler beim Initialisieren von Direct3D!", TB_ERROR);
    }

    if(tbTextureManager::Instance().Init())
    {
        TB_ERROR("Texturmanager konnte nicht initialisiert werden!", TB_ERROR);
    }

    if(tbDirectInput::Instance().Init())
    {
        TB_ERROR("DirectInput konnte nicht initialisiert werden!", TB_ERROR);
    }

    g_pfButtons = new float[tbDirectInput::Instance().GetNumButtons()];
    g_pbButtons = new BOOL[tbDirectInput::Instance().GetNumButtons()];

    if(tbDirectSound::Instance().Init(&m_Config, NULL, DSSCL_PRIORITY, FALSE))
    {
        TB_ERROR("DirectSound konnte nicht initialisiert werden!", TB_ERROR);
    }
    
    m_pFont1 = new tbFont;
    if(m_pFont1->Init("Data\\Font1.tga", "Data\\Font1.tbf"))
    {
        TB_ERROR("Fehler beim Laden der Schriftart Data\\Font1!", TB_ERROR);
    }

    m_pFont2 = new tbFont;
    if(m_pFont2->Init("Data\\Font2.tga", "Data\\Font2.tbf"))
    {
        TB_ERROR("Fehler beim Laden der Schriftart Data\\Font2!", TB_ERROR);
    }

    return TB_OK;
}

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


tbResult CBreakanoid::Init()
{
    tbResult r;
    ZeroMemory(this, sizeof(CBreakanoid));

    if(tbInit()) return TB_ERROR;
    r = tbDoConfigDialog(&m_Config);
    if(r == TB_CANCELED) return TB_CANCELED;
    else if(r) TB_ERROR("Engine konnte nicht initialisiert werden!", r);

    if(Load()) TB_ERROR("Fehler beim Laden des Spiels!", TB_ERROR);

    m_pIntro = new CIntro;
    m_pMainMenu = new CMainMenu;
    m_pGame = new CGame;

    SetGameState(GS_INTRO);

    return TB_OK;
}

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


tbResult CBreakanoid::Move(float fTime)
{
    tbResult r = TB_OK;

    tbDirectInput::Instance().GetState(g_pfButtons, g_pbButtons);

    switch(m_GameState)
    {
    case GS_INTRO:          r= m_pIntro->Move(fTime); break;
    case GS_MAIN_MENU:      r= m_pMainMenu->Move(fTime); break;
    case GS_GAME:           r= m_pGame->Move(fTime); break;
    }

    if(r) TB_ERROR("Fehler beim Bewegen des Spielzustands!", TB_ERROR);

    m_fTime += fTime;

    return TB_OK;
}

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


tbResult CBreakanoid::Render(float fTime)
{
    tbResult r = TB_OK;

    switch(m_GameState)
    {
    case GS_INTRO:          r= m_pIntro->Render(fTime); break;
    case GS_MAIN_MENU:      r= m_pMainMenu->Render(fTime); break;
    case GS_GAME:           r= m_pGame->Render(fTime); break;
    }

    if(r) TB_ERROR("Fehler beim Rendern des Spielzustands!", TB_ERROR);

    if(tbDirect3D::Instance().Present())
    {
        TB_ERROR("Fehler beim Anzeigen des Bildpuffers!", TB_ERROR);
    }

    return TB_OK;
}

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


tbResult Move(float fTime)      {return g_pBreakanoid->Move(fTime);}
tbResult Render(float fTime)      {return g_pBreakanoid->Render(fTime);}

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


tbResult CBreakanoid::Run()
{
    if(tbDoMessageLoop(::Move, ::Render))
    {
        TB_ERROR("Fehler in der Nachrichtenschleife!", TB_ERROR);
    }

    return TB_OK;
}

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


tbResult CBreakanoid::Unload()
{
    TB_SAFE_DELETE(m_pFont1);
    TB_SAFE_DELETE(m_pFont2);
    TB_SAFE_DELETE_ARRAY(g_pfButtons);
    TB_SAFE_DELETE_ARRAY(g_pbButtons);
    tbDirect3D::Instance().Exit();
    tbDirectInput::Instance().Exit();
    tbDirectSound::Instance().Exit();
    tbTextureManager::Instance().Exit();

    return TB_OK;
}

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

// Fährt das Spiel herunter

tbResult CBreakanoid::Exit()
{
    // Kein Spielstatus (aktuellen Spielstatus entladen)

    SetGameState(GS_NONE);

    // Entladen...

    Unload();

    // Die Klassen für die Spielzustände löschen

    TB_SAFE_DELETE(m_pIntro);
    TB_SAFE_DELETE(m_pMainMenu);
    TB_SAFE_DELETE(m_pGame);

    // Die Engine herunterfahren

    tbExit();

    return TB_OK;
}

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


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCommandLine,
                   int iShowCommand)
{
    tbResult r;

    // Spiel initialisieren

    g_pBreakanoid = new CBreakanoid;
    r = g_pBreakanoid->Init();
    if(r == TB_CANCELED)
    {
        // Der Konfigurationsdialog wurde abgebrochen!

        // Das Programm "leise" verlassen.

        TB_SAFE_DELETE(g_pBreakanoid);
        return 0;
    }
    else if(r)
    {
        g_pBreakanoid->Exit();
        TB_SAFE_DELETE(g_pBreakanoid);
        MessageBox(NULL, "Fehler beim Initialisieren des Spiels!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        return 1;
    }

    // Spiel laufen lassen

    if(g_pBreakanoid->Run())
    {
        g_pBreakanoid->Exit();
        TB_SAFE_DELETE(g_pBreakanoid);
        MessageBox(NULL, "Fehler im Spiel!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        return 1;
    }

    // Spiel verlassen

    g_pBreakanoid->Exit();
    TB_SAFE_DELETE(g_pBreakanoid);

    return 0;
}

Wäre dankbar für jegliche Hilfe.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

12.10.2006, 15:16

Also du hast es selbst programmiert? Kompilier doch mal das komplette Programm von der CD. Wenn dann immer noch das gleiche Problem besteht liegt es an einer Inkompatibilitaet zwischen Engine/Spiel und deinem System, wenn nicht koennen wir immer noch den Fehler in deinem Code suchen ;)

3

12.10.2006, 15:41

Also, wenn ich das Spiel von der CD kompiliere und gleich Vom VS2005 ausführe, wird das Fenster nach dem Konfigurationsdialog gleich wieder geschlossen, ohne, dass ich etwas zu sehen bekomme... Im Log-File steht dann nur, dass tbExit usw. nicht aufgerufen wurde und das automatisch gemacht wird.

Wenn ich jedoch das Programm jedoch nicht vom VS2005 aus starte, sondern nur die EXE, die VS erzeugt hat, funktioniert alles einwandfrei... ( :?: :?: )

P.S. Danke für die schnelle Antwort.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

4

13.10.2006, 19:19

am ende des kapitels über Breakaniod (oder wie das heißt) steht wie man das flimmerproblem weg bekommt.

hier der code ausschnitt aus dem game:

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
tbResult CBreakanoid::Render(float fTime)
{
    tbResult r = TB_OK;

    // Aktuellen Spielzustand rendern

    switch(m_GameState)
    {
    case GS_INTRO:      r = m_pIntro->Render(fTime);    break;
    case GS_MAIN_MENU:  r = m_pMainMenu->Render(fTime); break;
    case GS_GAME:       r = m_pGame->Render(fTime);     break;
    }

    // Eventuelle Fehler abfangen

    if(r) TB_ERROR("Fehler beim Rendern des Spielzustands!", TB_ERROR);

    // Ist beim letzten Mal das Anzeigen des Back-Buffers fehlgeschlagen?

    if(tbDirect3D::Instance().GetPresentResult())
    {
        // Anzeigen ist fehlgeschlagen!

        // Wahrscheinlich läuft das Programm im Vollbildmodus und es

        // wurde zwischenzeitlich minimiert.

        // Wir initialisieren das Spiel komplett neu.


        // Aktuellen Spielzustand entladen

        switch(m_GameState)
        {
        case GS_INTRO:      m_pIntro->Unload();     break;
        case GS_MAIN_MENU:  m_pMainMenu->Unload();  break;
        case GS_GAME:       m_pGame->Unload();      break;
        }

        // Das ganze Spiel entladen und dann wieder neu laden

        Unload();
        Load();

        // Aktuellen Spielstatus neu laden

        switch(m_GameState)
        {
        case GS_INTRO:      m_pIntro->Load();       break;
        case GS_MAIN_MENU:  m_pMainMenu->Load();    break;
        case GS_GAME:       m_pGame->Load();        break;
        }
    }

    return TB_OK;
}


p.s. das ist der code von dem game wie es auf der cd war.

5

16.10.2006, 00:32

Super, so funktioniert alles, danke!

Werbeanzeige