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

21

08.04.2010, 09:12

Schonmal den Debugger befragt? Der sollte dir normalerweise anzeigen wo der Fehler auftritt.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

22

08.04.2010, 13:51

Ja das weiß ich ja schon, beim Render der Fläche..
Every day is a programming day ;)

23

08.04.2010, 16:09

Zitat

Frees the resources used by a previously created SDL_Surface. If the surface was created using SDL_CreateRGBSurfaceFrom then the pixel data is not freed.
Könnte es vielleicht daran liegen? Ansonsten müsstest du uns mal ein wenig zeigen, ansonsten können wir nur raten.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

24

08.04.2010, 16:57

Ich zeig mal die Fehlermeldung:

Quellcode

1
Unbehandelte Ausnahme bei 0x1001d15a in Draw Ball.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x01005346.


Und hier wie ich den code aufgebaut habe:

main.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
void GameSchleife()
{
    CGame Game;              // Erstellen
    Game.Init_Files();       // Initalisiert Daten
    Game.Init_RandomLevel(); // Initalisiert Levels
    Game.Game();             // Spielschleife
    Game.Clear();            // Aufräumen
}


// Startzeilen //
int main(int argc, char* args[])
{
    // Variabelen
    bool Quit   = false;

    SDL_Surface* sc_and_dbutton = NULL; // Kariere und Schnellesspiel Button

    // SDL Initialisieren
    if(Init_SDL() == false)
        return 1;


    Button Quickgame_Button (0  , 502, 144, 48 ); // Schnellesspiel Button

    sc_and_dbutton = Load_Image("C and Q.png", false, true ); // C- und Qbuttonbild


    
    // Wenn irgendwas fehlschlägt
    if(sc_and_dbutton == NULL)
        return 1;

    // Schleife
    while(Quit == false)
    {   
        // Eventschleife
        while(SDL_PollEvent(&e_Event))
        {
            if(Quickgame_Button.handle_events() == false)
                    GameSchleife();

            // Wenn man auf X klickt
            if(e_Event.type == SDL_QUIT)
                Quit = true; // Raus aus der Schleife
        }
    
        Quickgame_Button.Set_Clip(0, 48, 144, 96, 144, 48, 288, 96);
        Quickgame_Button.show(sc_and_dbutton);

        // Flipen
        if(SDL_Flip(s_screen) == -1)
            return 1;

        // Frames
        if(FPS.get_ticks() < 1000 / FRAMES_PER_SECOND)
            SDL_Delay((1000 / FRAMES_PER_SECOND) - FPS.get_ticks());
    }

    // Oberflächen löschen
    SDL_FreeSurface(s_screen);
    SDL_FreeSurface(sc_and_dbutton);


    TTF_Quit(); // TTF Beenden
    SDL_Quit(); // SDL Beenden

    return 0;
}


CGame.h

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
#ifndef CGAME_H
#define CGAME_H

// Header //
#include "Engine.h"

// Globale Variable //
extern SDL_Event e_Event;
extern Timer FPS;

// Game Klasse //
class CPaddle
{
    private:

    SDL_Surface* m_s_Paddle; // Schlägerfläche        
    int x, y;                // Position
    
    public:
        
    int xVel;                // Geschwindigkeit     
        
    SDL_Rect m_r_location;   // Position

    CPaddle();                            // Konstruktur
    bool LoadImage(std::string filename); // Läd Bild
    void Handle();                        // Steuerung
    void Move();                          // Bewegung
    void Show();                          // Render
    void Clear();                         // Löscht    
};

class CInterface
{
    private:
        
    SDL_Surface* m_s_interface; // Interfacefläche

    public:
        
    CInterface();                         // Konstruktor
    bool LoadImage(std::string filename); // Bildladen
    void Show();                          // Rendern
    void Clear();                         // Löscht
};

class CBall
{
    public:
        
    SDL_Surface* m_s_Ball;   // Ballfläche
    SDL_Rect location;      // Position
    SDL_Rect image_location; // Bildposition

    int xVel; // X Richtung
    int yVel; // Y Richtung
        
    CBall();                                            // Konstruktor
    bool LoadImage(std::string filename);               // Bildladen
    void Show();                                        // Rendern
    void Handle();                                      // Berechnungen
    bool CheckBallCollisions();                         // Checkt Kollision zwischen Ball und Schläger
    void CheckBlockCollisions();                        // Checkt Kollision zwischen Ball und Block
    bool CheckPointInRect(int x, int y, SDL_Rect rect); // Kollisions Rechner
    void HandleBlockCollision(int index);               // Berechnungen
    void Clear();                                       // Löscht
};

class CGame
{
    public:

    CPaddle Player;
    CInterface Interface;
    CBall Ball;
    
    // Variablen
    bool       m_Quit;
    int        m_Level;
    int        m_Score;
    int        m_Combo;

    // Funktionen
    CGame();
    bool  Init_Files();
    bool  Init_Level();
    bool  Init_RandomLevel();
    bool  Game();
    void  Clear();
};

#endif


CGame.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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
// Header //
#include "CGame.h"

extern CGame Game;

// Konstruktor //
CPaddle::CPaddle()
{
        m_s_Paddle = NULL; // Schlägerfläche

        x = 220; // Position x
        y = 550; // Position y

        m_r_location.x = x;   // Rechteck oben links
        m_r_location.y = y;   // Rechteck unten links
        m_r_location.w = 100; // Rechteck oben rechts
        m_r_location.h = 20;  // Rechteck unten rechts
        
        xVel = 0; // Geschwindigkeit
}

// Läd das Bild
bool CPaddle::LoadImage(std::string filename)
{
    // Bild Laden
    m_s_Paddle = Load_Image(filename, false, true);

    if(m_s_Paddle == NULL)
        return false;

    return true;
}

// Schläger Kontrolle //
void CPaddle::Handle()
{
   // Unwichtig
}

// Bewegung //
void CPaddle::Move()
{
  // Unwichtig
}

// Render //
void CPaddle::Show()
{
    // Rendern
    Render_Surface(m_r_location.x, y, m_s_Paddle, s_screen, NULL);
}

// Löschen //
void CPaddle::Clear()
{
    SDL_FreeSurface(m_s_Paddle);
}

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

// Konstruktor //
CInterface::CInterface()
{
    // Interfacefläche
    m_s_interface = NULL; 
}

// Bildlade Funktion //
bool CInterface::LoadImage(std::string filename)
{
    // Bildladen
    m_s_interface = Load_Image(filename, false, true); 

    if(m_s_interface == NULL)
        return false;

    return true;
}

// Render Funktion //
void CInterface::Show()
{
    // Rendern
    Render_Surface(0, 0, m_s_interface, s_screen, NULL); 
}

// Löschen //
void CInterface::Clear()
{
    SDL_FreeSurface(m_s_interface);
}
// --------------------------------------------------------------- //

// Konstruktor
CBall::CBall()
{
    location.x = Game.Player.m_r_location.x + 50;
    location.y = 530;
    location.w = 20;
    location.h = 20;

    image_location.x = 0;
    image_location.y = 0;
    image_location.w = 20;
    image_location.h = 20;
    
    xVel = -5;
    yVel = -5;
}

// Ladet das Bild
bool CBall::LoadImage(std::string filename)
{
    // Lade Bild
    m_s_Ball = Load_Image(filename, false, true);

    if(m_s_Ball == NULL)
        return false;

    return true;
}

// Rendern
void CBall::Show()
{
    // Renderen
    SDL_BlitSurface(m_s_Ball, &image_location, s_screen, &location);
}

// Checkt Kolloson
bool CBall::CheckBallCollisions()
{
   // Unwichtig
}

void CBall::Handle()
{
   // Unwichtig    
}

void CBall::CheckBlockCollisions()
{
   // Unwichtig
}

void CBall::HandleBlockCollision(int index)
{
  // Unwichtig
}

bool CBall::CheckPointInRect(int x, int y, SDL_Rect rect)
{
  // Unwichtig
}

void CBall::Clear()
{
    SDL_FreeSurface(m_s_Ball);
}


// --------------------------------------------------------------- //
CGame::CGame()
{
    m_Quit = false;
    m_Level = 1;
    m_Score = 0;
    m_Combo = 1;
}

bool CGame::Init_Files()
{
    if(Interface.LoadImage("Interface.png") == false)
        return false;

    if(Player.LoadImage("Paddle.png") == false)
        return false;

    if(Ball.LoadImage("Ball.png") == false)
        return false;

    return true;
}
    
bool CGame::Init_Level()
{
  // Unwichtig
}

bool CGame::Init_RandomLevel()
{
  // Unwichtig
}
bool CGame::Game()
{
    // Variablen //
    char      Buffer[256];                      // Zwischenspeicher für Text
    SDL_Color textColor     = {255, 255, 255}; // Textfarbe Weiß
    SDL_Color textColorGreen = {0  , 255, 0  }; // Textfarbe Grün

    // Schleife
    while(m_Quit == false)
    {
        // Event Schleife
        while(SDL_PollEvent(&e_Event))
        {
            // Spieler Kontrolle
            Player.Handle();
            
            switch(e_Event.type)
            {                   
                case SDL_KEYDOWN:
                    //  Wenn ESC gedrückt wurde
                    if(e_Event.key.keysym.sym == SDLK_ESCAPE)
                        m_Quit = true;
            }

            // Wenn oben auf X gedrückt wurde
            if(e_Event.type == SDL_QUIT)
                m_Quit = true;
        }

        sprintf(Buffer, "Score: %i",m_Score);       
        s_score = TTF_RenderText_Solid(font, Buffer, textColor);

        sprintf(Buffer, "Combo: x %i",m_Combo);
        s_combo = TTF_RenderText_Solid(font, Buffer, textColorGreen);

        // Bewegung wird berechnet
        for(int i = 0; i < 1; i++)
        {
            Player.Move();
            Ball.Handle();
        }

        Interface.Show(); // Oberfläche wird gerendert
        Player.Show();    // Spieler wird gerendert
        Ball.Show();
        Render_Surface(550, 50, s_score, s_screen, NULL);

        if(m_Combo > 1)
            Render_Surface(550, 63, s_combo, s_screen, NULL);

        for(int i=0; i< g_NumBlocks; i++)
            SDL_BlitSurface(s_blocks, &g_Block[i].image_location, s_screen, &g_Block[i].location);

        // Flipen
        if(SDL_Flip(s_screen) == -1)
            return 1;

        // Frames
        if(FPS.get_ticks() < 1000 / FRAMES_PER_SECOND)
            SDL_Delay((1000 / FRAMES_PER_SECOND) - FPS.get_ticks());
    }

    return true;
}

void CGame::Clear()
{
    Player.Clear();
    Interface.Clear();
    Ball.Clear();
}


Einbissche viel aber das ist das wichtigste..
Every day is a programming day ;)

25

08.04.2010, 17:54

Also ich kann mich wirklich den Vorrednern anschließen! Das Design ist wirklich top! (Hab auch mal angefangen mit so einem Projekt, der Hintergrund war schwarz der Schläger und Ball weiß und die Blöcke einfarbig "hust").

Aber eine kleine Sache hätte ich noch anzumerken. In dem Video erkennt man, dass der Ball, wenn er auf den Schläger prallt immer eine andere Geschwindigkeit hat (je weiter in der Mitte, desto langsamer prallt er ab). Das sollte vielleicht noch geändert werden.
Errare humanum est.. leider oder zum Glück?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

26

08.04.2010, 18:02

hast du das normalisieren des richtungsvektors vergessen?

ausserdem prallt der ball nicht im richtigen winkel von den blocken ab.
eigentlich sollte er nicht genau in die umgekehrte richtung fliegen.
"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?

27

08.04.2010, 18:06


hast du das normalisieren des richtungsvektors vergessen?

ausserdem prallt der ball nicht im richtigen winkel von den blocken ab.
eigentlich sollte er nicht genau in die umgekehrte richtung fliegen.

Genau das habe ich gemeint^^

Aber normalerweise kann man bei den Blöcken es so handhaben, dass der Ball einfach umgekehrt wird (ist einfacher und es fällt nicht auf; außerdem spielt das nur bei einer Drehung des Balls eine Rolle, aber die würde ich für den Anfang wenn überhapt nur beim Schläger durchführen).
Errare humanum est.. leider oder zum Glück?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

28

08.04.2010, 18:12

nein das ist total unnatürlich oO
ich erwarte, dass ein ball im richtigen winkel abspringt. an der wand hat er das schon richtig umgesetzt. ich bin mir sicher er schafft das auch bei den steinchen.
"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?

29

08.04.2010, 18:16

Achso uuups, habs gerade total verrafft! Sorry!

Ich dachte, dass der Ball bereits den richtigen Winkel hat, hab mir das Video nochmal angeschaut und gesehen, dass es doch nicht richtig war oO.
Klar, DAS muss schon besser sein (ich dachte du willst noch die Drehung drin haben und das ist nicht einfach^^)
Errare humanum est.. leider oder zum Glück?

CrazyPlayer

Treue Seele

  • »CrazyPlayer« ist der Autor dieses Themas

Beiträge: 109

Wohnort: Mittenwald [Garmischpartenkirchen]

Beruf: Schüler

  • Private Nachricht senden

30

09.04.2010, 14:33

So konnte gestern nicht antworten weil ich irgendwie die Page nicht rein gekommen bin...
Vorrender? Wie meinst du Vorrendern, gleich nach dem Initialisiereung?
Also bei der Wand hab ich halt die Geschwindigkeit ungekehrt.
Mit der Kollision von Blöcken hab ich schon längst gelöst, da wird jetzt nicht mehr nur die Geschwindigkeit umgekehr aber Trozdem fliegt er machmal durch eine Block durck Xp
Zum Schläger, ja je mittige desto schneller fliegt er mir is nichts anders eigefallen wie es sonst berechnen könnte...
Ich Lad heute Abend mal ein neues Vid hoch, ich hab jetzt das Menu Design verbessert und erweitert, LevelZufalls Gernerator, Blöcke und Ball Desing verbessert und halt die Kollision verbessert.. ;)
Every day is a programming day ;)

Werbeanzeige