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

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

11

13.12.2010, 21:27

Willst du mal den ganzen Quellcode hochladen? (sofern es nicht mehr als 500 Zeilen sind, schau ich da auch mal durch ;) )

Außerdem würde sich das Lernen der Arbeit mit dem debugger anbieten, das hilft dir einiges an Schreibarbeit. :)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

pepe1995

Frischling

  • »pepe1995« ist der Autor dieses Themas

Beiträge: 60

Wohnort: Warngau

Beruf: Schüler (10.)

  • Private Nachricht senden

12

14.12.2010, 18:10

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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#include "Game.hpp"

// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CGame::CGame ()
{
m_pPlayer = NULL;
m_pSpriteBackground = NULL;
m_pSpriteAsteroid = NULL;
m_pSpriteExplosion = NULL;
} // Konstruktor

// Init
//
// Aufgabe: Spieler, Hintergrund und Asteroid initialisieren
//
void CGame::Init ()
{
// Neuen Spieler initialisieren
m_pPlayer = new CPlayer;
m_pPlayer->Init ();
m_pPlayer->Reset ();

// Hintergrundbild (Sprite) laden
m_pSpriteBackground = new CSprite;
m_pSpriteBackground->Load ("Data/Background.bmp");

// Sprite für Asteroiden laden
m_pSpriteAsteroid = new CSprite;
m_pSpriteAsteroid->Load ("Data/Asteroid.bmp", 20, 64, 64);
m_pSpriteAsteroid->SetColorKey (255, 0, 255);

// Explosionssprite laden
m_pSpriteExplosion = new CSprite;
m_pSpriteExplosion->Load("Data/Explosion.bmp", 20, 64, 64);
m_pSpriteExplosion->SetColorKey(0, 0, 0);

// Timer für Asteroiden zurücksetzen
m_fAsteroidTimer = 0.0f;

// Spiel läuft
m_bGameRun = true;
} // Init

// Quit
//
// Aufgabe: Instanzen freigeben
//
void CGame::Quit ()
{
// Spieler freigeben
if (m_pPlayer != NULL)
{
m_pPlayer->Quit ();
delete (m_pPlayer);
m_pPlayer = NULL ;
}

// Hintergrundsprite freigeben
if (m_pSpriteBackground != NULL)
{
delete (m_pSpriteBackground);
m_pSpriteBackground = NULL;
}

// Asteroidensprite freigeben
if (m_pSpriteAsteroid != NULL)
{
delete (m_pSpriteAsteroid);
m_pSpriteAsteroid = NULL;
}

// Explosionssprite freigeben
if (m_pSpriteExplosion != NULL)
{
delete (m_pSpriteExplosion);
m_pSpriteExplosion = NULL;
}
} // Quit

// Run
//
// Aufgabe: Hauptschleife des Spiels
//
void CGame::Run ()
{
// Hauptschleife des Spiels durchlaufen
//
while (m_bGameRun == true)
{
// Events bearbeiten
ProcessEvents ();

// Framework updaten und Buffer löschen
g_pFramework->Update ();
g_pFramework->Clear ();

// Hintergrundbild rendern
m_pSpriteBackground->Render ();

// Spieler updaten und rendern
m_pPlayer->Update ();
m_pPlayer->Render ();

// Neue Asteroiden hinzufügen
SpawnAsteroids ();

// Kollisionen prüfen
CheckCollisions ();

// Asteroiden rendern
RenderAsteroids ();

// Buffer flippen
g_pFramework->Flip ();

}

} // Run

// ProcessEvents
//
// Aufgabe: Events bearbeiten
//
void CGame::ProcessEvents ()
{
SDL_Event Event;

// Gab es ein Event?
if (SDL_PollEvent (&Event))
{
// Ja, also schauen welches
switch (Event.type)
{
// Beenden?
case (SDL_QUIT):
{
m_bGameRun = false;

} break;


// Wurde eine Taste gedrückt?
case (SDL_KEYDOWN):
{
switch (Event.key.keysym.sym)
{
case (SDLK_ESCAPE):
{
// Ja, also Spiel beenden
m_bGameRun = false;

} break;
}
} break;
}
}

} // ProcessEvents

// SpawnAsteroids
//
// Aufgabe: Nach Ablauf einer bestimmten Zeit neuen Asteroiden erzeugen
//
void CGame::SpawnAsteroids ()
{
// Timer für nächsten Asteroiden erhöhen
m_fAsteroidTimer += g_pTimer->GetElapsed ();

// Wenn eine halbe Sekunde vergangen ist,
// dann einen neuen Asteroiden erzeugen
if (m_fAsteroidTimer >= 0.5f)
{
// Neuer Asteroid
CAsteroid Asteroid;

// Zufällige X-Position
int XPos = rand()%736;

// Asteroid initialisieren
Asteroid.Init (m_pSpriteAsteroid, static_cast<float>(XPos), -60.0f);

// Asteroid in Liste einfügen
m_AsteroidList.push_back (Asteroid);

// Zeitgeber wieder zurücksetzen
m_fAsteroidTimer = 0.0f;

}

} // SpawnAsteroids

// CheckCollisions
//
// Aufgabe: Kollisionen zwischen Asteroiden und Schüssen prüfen
//
void CGame::CheckCollisions ()
{
// Schussliste des Spielers holen
list<CShot> *ShotList = m_pPlayer->GetShotList ();

// Iteratoren für Asteroiden- und Schussliste
list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
list<CShot>::iterator ItShot;

// Rects für Asteroiden und Schüsse
SDL_Rect RectAsteroid;
SDL_Rect RectShot;

// Alle Asteroiden durchlaufen
while (ItAsteroid != m_AsteroidList.end () )
{
// Rect des Asteroiden holen
RectAsteroid = ItAsteroid->GetRect ();

// Alle Schüsse durchlaufen
for (ItShot = ShotList->begin ();
ItShot != ShotList->end ();
++ItShot)
{
// Rect des Schusses holen
RectShot = ItShot->GetRect ();

// Überschneiden sich die Rects?
if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
RectShot.y + RectShot.h > RectAsteroid.y &&
RectShot.x < RectAsteroid.x + RectAsteroid.w &&
RectShot.x + RectShot.w > RectAsteroid.x)
{
// Ja, also gab es eine Kollision. Somit Schuss und
// Asteroid deaktivieren
ItAsteroid->SetAlive (false);
ItShot->SetAlive (false);

// Bei Kollision Explosionssprite in der Mitte des Asteroidenrects rendern
m_pSpriteExplosion->SetPos(static_cast<float> (RectAsteroid.x + RectAsteroid.w/2), static_cast<float> (RectAsteroid.y + RectAsteroid.h/2);
m_pSpriteExplosion->Render(16.0f);
}
}

// Asteroid löschen, falls deaktiviert
if (ItAsteroid->IsAlive () )
ItAsteroid++;
else
ItAsteroid = m_AsteroidList.erase (ItAsteroid);

}

} // CheckCollision

// RenderAsteroids
//
// Aufgabe: Alle Asteroiden rendern und updaten
//
void CGame::RenderAsteroids ()
{
// Iterator für die Asteroiden-Liste
list<CAsteroid>::iterator It;

// Asteroiden-Liste durchlaufen
for (It = m_AsteroidList.begin (); It != m_AsteroidList.end (); ++It)
{
// Asteroid rendern
It->Render ();

// Asteroid updaten
It->Update ();

}

} // RenderAsteroids


Das ist jetzt nur CGame mit den neuerungen

habe schon mit debugger gearbeitet aber da es ja keinen compilerfehler gibt.. ???
www.4story.de
ROCKT! ;)

Phalax

Frischling

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

13

14.12.2010, 22:47

Das Problem bei deiner Lösung ist, dass das Sprite nur für einen Frame sichtbar ist. Denn sobald die Kollision stattfindet wird das Sprite gezeichnet. Doch die Kollision ist nur ein Frame lang. Außerdem wird das Sprite so nicht animiert.

Wenn du also eine richtige Explosion mit Animation brauchst, könntest du dir dafür eine Klasse schreiben, dass ist denke ich der leichteste und beste Weg.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

14

15.12.2010, 11:32

habe schon mit debugger gearbeitet aber da es ja keinen compilerfehler gibt.. ???

Der Debugger gibt dir keine Compiler/Syntaxfehler aus, sondern Laufzeitfehler.
...->Render(); zeichnen ein Objekt nur für den aktuellen Frame auf das Fenster, du musst die Funktion in jedem frame aufrufen.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

15

15.12.2010, 16:06

Am besten machst du dir eine Klasse für die Explosionen, wie Phalax ja schon gesagt hat.
Dann brauchst du noch eine Liste und schiebst bei jeder Kollision eine neue Explosion rein (mit den Koordinaten des getroffenen Asteroiden).
Zum Schluss musst du die Liste nur in der Run Funktion durchlaufen und die Explosionen rendern.

lg Chaia

pepe1995

Frischling

  • »pepe1995« ist der Autor dieses Themas

Beiträge: 60

Wohnort: Warngau

Beruf: Schüler (10.)

  • Private Nachricht senden

16

18.12.2010, 16:13

du meinst wie "RenderAsteroids()"?
www.4story.de
ROCKT! ;)

17

19.12.2010, 12:02

Ja, so könnte die Funktion z.B. aussehen, die die Liste durchläuft und jede Explosion rendert.

pepe1995

Frischling

  • »pepe1995« ist der Autor dieses Themas

Beiträge: 60

Wohnort: Warngau

Beruf: Schüler (10.)

  • Private Nachricht senden

18

19.12.2010, 16:02

ok danke werds versuchen
EDIT: klappt jez super
www.4story.de
ROCKT! ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »pepe1995« (20.12.2010, 16:50)


Werbeanzeige