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

11

06.03.2010, 19:03

Es können ein paar einfache Fehler drinnen sein, die ich gemacht hab bei meinen spärlichen Versuchen, dass zu lösen, weil das ganze sowieso nicht funktioniert :roll: :

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
#include "player.hpp"

// Konstruktor

//

// Aufgabe: Allgemeine Initialisierungen

//

CPlayer::CPlayer ()
{
    m_pSpritePlayer = NULL;
    m_pSpriteShot = NULL;

} // Konstruktor


// Init

//

// Aufgabe: Sprites erzeugen und laden

//

void CPlayer::Init ()
{
    m_pRect.x = static_cast<int>(m_fXPos);
    m_pRect.y = static_cast<int>(m_fYPos);
    m_pRect.w = m_pSpritePlayer->GetRect ().w;
    m_pRect.h = m_pSpritePlayer->GetRect().h;

    // Spielersprite erstellen

    m_pSpritePlayer = new CSprite;

    m_pSpritePlayer->Load ("Data/Player.bmp", 11, 64,64);
    m_pSpritePlayer->SetColorKey (255, 0, 255);

    // Schuss-Sprite erstellen

    m_pSpriteShot = new CSprite;

    m_pSpriteShot->Load ("Data/Laser.bmp", 0, 64, 64);
    m_pSpriteShot->SetColorKey (255, 0, 255);

} // Init


// Quit

//

// Aufgabe: Sprites freigeben

//

void CPlayer::Quit ()
{
    // Spieler-Sprite freigeben

    if (m_pSpritePlayer != NULL)
    {
        delete (m_pSpritePlayer);
        m_pSpritePlayer = NULL;
    }

    // Schuss-Sprite freigeben

    if (m_pSpritePlayer != NULL)
    {
        delete (m_pSpritePlayer);
        m_pSpritePlayer = NULL;
    }

} // Quit


// Reset

//

// Aufgabe: Spielerwerte auf Standard setzen

//

void CPlayer::Reset ()
{
    // Startposition des Spielers

    m_fXPos = 376.0f;
    m_pRect.x = static_cast<int> (m_fXPos);
    m_fYPos = 520.0f;
    m_pRect.y = static_cast<int> (m_fYPos);

    // Animationsphase

    m_fAnimPhase = 5.0f;

    // Es darf geschossen werden

    m_bShotLock = false;

} // Reset


// Render

//

// Aufgabe: Spieler und Schüsse rendern

//

void CPlayer::Render ()
{
    // Position des Spielers setzen und Sprite rendern

    m_pSpritePlayer->SetPos (m_fXPos, m_fYPos);
    m_pSpritePlayer->Render (m_fAnimPhase);

    // Iterator für Schussliste

    list<CShot>::iterator it = m_ShotList.begin ();

    // Schussliste durchlaufen

    while (it != m_ShotList.end ())
    {
        // Schuss updaten

        it->Update ();

        // Ist der Schuss noch aktiv?

        if (it->IsAlive ())
        {
            // Ja, dann rendern

            it->Render ();
            it++;
        }
        else
        {
            // Nein, dann aus der Liste entfernen

            it = m_ShotList.erase (it);
        }

    }

} // Render


// Update

//

// Aufgabe: Spieler updaten

//

void CPlayer::Update ()
{
    // Bewegung des Spielers

    ProcessMoving ();

    // Prüfen, ob geschossen wurde

    ProcessShooting ();

    // Position und Animationsphase überprüfen

    CheckPosition ();

} // Update


// ProcessMoving

//

// Aufgabe: Bewegung des Spielers

//

void CPlayer::ProcessMoving ()
{
    // Nach links?

    if (g_pFramework->KeyDown (SDLK_LEFT))
    {
        // Spieler nach links bewegen

        m_fXPos -= 300.0f * g_pTimer->GetElapsed ();
        m_pRect.x = static_cast<int>(m_fXPos);

        // Animieren

        m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();

    }
    // Nach rechts?

    else if (g_pFramework->KeyDown (SDLK_RIGHT))
    {
        // Spieler nach rechts bewegen

        m_fXPos += 300.0f * g_pTimer->GetElapsed ();
        m_pRect.x = static_cast<int>(m_fXPos);

        // Animieren

        m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();

    }
    else if (g_pFramework->KeyDown (SDLK_UP))
    {
        // Spieler nach oben bewegen

        m_fYPos -= 300.0f * g_pTimer->GetElapsed ();
        m_pRect.y = static_cast<int>(m_fYPos);

        // Animieren

        m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();

    }
    else if (g_pFramework->KeyDown (SDLK_DOWN))
    {
        // Spieler nach unten bewegen

        m_fYPos += 300.0f * g_pTimer->GetElapsed ();
        m_pRect.y = static_cast<int>(m_fYPos);

        // Animieren

        m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();

    }
    // Spieler wurde nicht bewegt

    else
    {
        // Animation zurück zum Ausgangspunkt

        if (m_fAnimPhase > 5.0f)
            m_fAnimPhase -= 20.0f * g_pTimer->GetElapsed ();
        if (m_fAnimPhase < 5.0f)
            m_fAnimPhase += 20.0f * g_pTimer->GetElapsed ();
    }

} // ProcessMoving


// ProcessShooting

//

// Aufgabe: Waffe abfeuern

//

void CPlayer::ProcessShooting ()
{
    // Wurde Space gedrückt und darf geschossen werden?

    if (g_pFramework->KeyDown (SDLK_SPACE) && m_bShotLock == false)
    {
        // Neuen Schuss erzeugen und initialisieren

        CShot Shot;

        Shot.Init (m_pSpriteShot, m_fXPos, m_fYPos);

        // Schuss in Liste einfügen

        m_ShotList.push_back (Shot);

        // Schießen erst wieder erlaubt, wenn Space losgelassen

        m_bShotLock = true;

    }

    // Ist die Leertaste nicht mehr gedrückt, schießen wieder erlaubt

    if (g_pFramework->KeyDown (SDLK_SPACE) == false)
        m_bShotLock = false;

} // ProcessShooting


// CheckPosition

//

// Aufgabe: Position und Animationsphase prüfen

//

void CPlayer::CheckPosition ()
{
    // Linker und rechter Rand

    if (m_fXPos < 0.0f)
        m_fXPos = 0.0f;
    else if (m_fXPos > 752.0f)
        m_fXPos = 752.0f;
    //Oberer und unterer Rand

    if (m_fYPos < 0.0f)
        m_fYPos = 0.0f;
    else if (m_fYPos > 525.0f)
        m_fYPos = 525.0f;
    // Animationsphase prüfen

    if (m_fAnimPhase < 0.0f)
        m_fAnimPhase = 0.0f;
    else if (m_fAnimPhase > 10.0f)
        m_fAnimPhase = 10.0f;

} // CheckPosition

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

12

06.03.2010, 19:09

Du greifst auf das Sprite zu, bevor du es auf dem Heap angelegt hast. Ich denke, das könnte es sein.
WIP Website: kevinheese.de

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

06.03.2010, 20:04

<3 nachos zauber glaskugel <3

hier steckt der fehler:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
m_pRect.x = static_cast<int>(m_fXPos);
    m_pRect.y = static_cast<int>(m_fYPos); 
m_pRect.w = m_pSpritePlayer->GetRect ().w;
    m_pRect.h = m_pSpritePlayer->GetRect().h;

    // Spielersprite erstellen

    m_pSpritePlayer = new CSprite;

    m_pSpritePlayer->Load ("Data/Player.bmp", 11, 64,64);
    m_pSpritePlayer->SetColorKey (255, 0, 255); 


du musst das sprite erstellen bevor du es nutzt.

C-/C++-Quelltext

1
2
3
4
5
6
// Spielersprite erstellen

    m_pSpritePlayer = new CSprite;

    m_pSpritePlayer->Load ("Data/Player.bmp", 11, 64,64);
    m_pSpritePlayer->SetColorKey (255, 0, 255); 
    m_pRect = m_pSpritePlayer->GetRect();

das sollte reichen. gewöhn dir das kopieren/abtippen.
als anfänger sollte man erst kleine konsolenprogramme schreiben in denen du mit funktionen, klassen, zeigern usw. übst und dann kannst du das sdl spiel erweitern.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

14

06.03.2010, 21:05

danke, ihr beiden. :D
Das Programm funktioniert und hat eine Punkteanzeige.

Zitat von »"NachoMan"«


als anfänger sollte man erst kleine konsolenprogramme schreiben in denen du mit funktionen, klassen, zeigern usw. übst und dann kannst du das sdl spiel erweitern.


Damit bin ich fertig. :badgrin:
Bei meiner Frage gestern hab ich wohl irgendwas überlesen, aber sonst beherrsche ich die Grundlagen weitgehend.

Sehen uns im nächsten Unterforum ;)

MfG
stoni

Werbeanzeige