Also dein Source da oben ist ja absolut keine Grundlage zum lernen. Wirr, konfus und absolut unübersichtlich. Das tut ja schon in den Augen weh.
Damit du mal wenigstens ENTWAS anständiges hast zum Lernen, habe ich dir mal schnell ein kleines Framework zusammgenbastelt, was du auch benutzen
solltest! Dein alter Code ist Schrott und solltest du löschen.
|
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
|
#include <sdl/SDL.h>
/// Der Backbuffer. Auch "Secondary Buffer" genannt.
::SDL_Surface* g_secondary = NULL;
/// Dein Bild.
::SDL_Surface* g_image = NULL;
/// //////////////////////////////////////////////////////////////////////////
/// Läd eine Grafikdatei und gibt diese als SDL_Surface wieder.
///
/// \param file:
/// Name der Grafikdatei die geladen werden soll.
///
/// \return:
/// Gibt die Grafikdatei als SDL_Surface wieder oder 'NULL' bei Fehlern.
///
/// //////////////////////////////////////////////////////////////////////////
::SDL_Surface* load_image (char* file)
{
::SDL_Surface* image = ::SDL_LoadBMP (file);
if (image != NULL)
::SDL_SetColorKey (image, SDL_SRCCOLORKEY, ::SDL_MapRGB (image->format, 255, 0, 255));
return (image);
}
/// //////////////////////////////////////////////////////////////////////////
/// Initialisiert das Programm.
///
/// \return:
/// Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.
///
/// //////////////////////////////////////////////////////////////////////////
bool initialise (void)
{
if ((g_image = load_image ("bild.bmp")) == NULL)
return (false);
return (true);
}
/// //////////////////////////////////////////////////////////////////////////
/// Deinitialisiert das Programm.
///
/// \return:
/// Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.
///
/// //////////////////////////////////////////////////////////////////////////
bool uninitialise (void)
{
::SDL_FreeSurface (g_image);
return (true);
}
/// //////////////////////////////////////////////////////////////////////////
/// Aktuallisiert alle Elemente des Programms.
///
/// \return:
/// Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.
///
/// //////////////////////////////////////////////////////////////////////////
bool update (void)
{
return (true);
}
/// //////////////////////////////////////////////////////////////////////////
/// Zeichnet alle Elemente des Programms.
///
/// \return:
/// Gibt 'true' wieder, wenn es keine Fehler gab, ansonsten 'false'.
///
/// //////////////////////////////////////////////////////////////////////////
bool draw (void)
{
::SDL_Rect dest = { 0 };
dest.w = g_image->w;
dest.h = g_image->h;
for (int i = 0; i < 7; ++i)
{
for (int j = 0; j < 7; ++j)
{
// [...]
// DEIN CODE HIER! Denken musst du selbst.
// [...]
}
}
return (true);
}
/// //////////////////////////////////////////////////////////////////////////
/// Programmeinsprungspunkt.
///
/// \return:
/// Exit-Code des Programms.
///
/// //////////////////////////////////////////////////////////////////////////
int main (void)
{
if (::SDL_Init (SDL_INIT_VIDEO) == -1)
return 0;
if ((g_secondary = SDL_SetVideoMode (800, 600, 16, SDL_HWSURFACE | SDL_DOUBLEBUF)) == NULL)
{
::SDL_Quit ();
return 0;
}
if (!initialise ())
{
uninitialise ();
::SDL_Quit ();
return 0;
}
for (bool done = false; !done; )
{
for (::SDL_Event event; ::SDL_PollEvent (&event) && !done; )
{
switch (event.type)
{
case SDL_QUIT:
done = true;
break;
}
::SDL_FillRect (g_secondary, NULL, ::SDL_MapRGB (g_secondary->format, 58, 95, 205));
if (!update () || !draw ())
done = true;
::SDL_Flip (g_secondary);
}
}
uninitialise ();
::SDL_Quit ();
return 0;
}
|
In dem Code gibt es insgesammt 4 Funktionen die für dich wichtig sind: initialise, unitialise, update und draw.
initialise ist für die einmalige Initialisierung des Programms. Hier werden deine Grafiken geladen - das du die wie in deinem Code jedes mal neu lädst ist Unsinn!
uninitialise ist das Gegenteil zu initialise und ist für das einmalige Aufräumen da. Hier wird die Grafik entladen.
update ist für die Aktuallisierung aller Objekte in deinem Spiel - Aktuell hast du noch keine, weil du keine benötigst. Also ist diese Funktion für dich erstmal uninteressant.
draw ist die Funktion in der alle Elemente in deinem Programm gezeichnet werden. Hier solltest du für dein Spielfeld ansetzen.
Funktionen wie "load_image" und "main" fasst du erst gar nicht an. Die sind gut so und fertig. Nur die 4 oben genannten Funktionen sind für dich relevant, die anderen sind taboo!
Bau auf dem Code auf und wir können dir auch besser helfen, da wir den Code - im Gegensatz zu deinem Aktuellen - viel angenehmer verstehen können.