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

29.08.2013, 16:12

Problem mit gravity und movement, C++, SDL

Hallo Community,

ich habe ein Problem mit meiner gravity Funktion und meinem movement. Wenn ich die Funktion ground() im movement aufrufe, funktioniert zwar die Gravitation, aber ich kann mich nicht mehr nach links oder rechts bewegen. Die Tastatureingabe Funktioniert aber scheinbar, da ich mir für den Tastendruck ein print gemacht habe. Vielleicht fällt euch ja auf wo mein Fehler liegt.

Danke schonmal

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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
#include "SDL/SDL.h"
#include "SDLMain.h"
#include <string>
#include <iostream>
#include "SDL_image/SDL_image.h"
#include "timer.h"

//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//The frame rate
const int FRAMES_PER_SECOND = 40;

//The attributes of the square
const int SQUARE_WIDTH = 20;
const int SQUARE_HEIGHT = 20;

//The surfaces
SDL_Surface *square = NULL;
SDL_Surface *screen = NULL;

//The event structure
SDL_Event event;

//The wall
SDL_Rect wall;
SDL_Rect wall2;

class Square
{
private:
    //The collision box of the square
    SDL_Rect box;
    
    //The velocity of the square
    int xVel, yVel;
    
    double jumpTimer;
    int jumpStr = 1;
    int leftA, leftB;
    int rightA, rightB;
    int topA, topB;
    int bottomA, bottomB;
    
public:
    //Initializes the variables
    Square();
    
    //Takes key presses and adjusts the square's velocity
    void handle_input();
    
    //Moves the square
    void move();
    
    //Shows the square on the screen
    void show();
    
    //gravity
    void gravity();
    
    //Jump function
    void jump();
    
    //ground collision with gravity
    bool ground();
    
    //collision function for square
    bool check_collision( SDL_Rect A, SDL_Rect B );
};


SDL_Surface *load_image( std::string filename )
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;
    
    //The optimized surface that will be used
    SDL_Surface* optimizedImage = NULL;
    
    //Load the image
    loadedImage = IMG_Load( filename.c_str() );
    
    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized surface
        optimizedImage = SDL_DisplayFormat( loadedImage );
        
        //Free the old surface
        SDL_FreeSurface( loadedImage );
        
        //If the surface was optimized
        if( optimizedImage != NULL )
        {
            //Color key surface
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
        }
    }
    
    //Return the optimized surface
    return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
    //Holds offsets
    SDL_Rect offset;
    
    //Get offsets
    offset.x = x;
    offset.y = y;
    
    //Blit
    SDL_BlitSurface( source, clip, destination, &offset );
}

bool Square::check_collision( SDL_Rect A, SDL_Rect B )
{

    //Calculate the sides of rect A
    leftA = A.x;
    rightA = A.x + A.w;
    topA = A.y;
    bottomA = A.y + A.h;
    
    //Calculate the sides of rect B
    leftB = B.x;
    rightB = B.x + B.w;
    topB = B.y;
    bottomB = B.y + B.h;
    
    //If any of the sides from A are outside of B
    if( bottomA <= topB )
    {
        return false;
    }
    
    if( topA >= bottomB )
    {
        return false;
    }
    
    if( rightA <= leftB )
    {
        return false;
    }
    
    if( leftA >= rightB )
    {
        return false;
    }
    
    //If none of the sides from A are outside B
    return true;

}

bool init()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;
    }
    
    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
    
    //If there was an error in setting up the screen
    if( screen == NULL )
    {
        return false;
    }
    
    //Set the window caption
    SDL_WM_SetCaption( "Move the Square", NULL );
    
    //If everything initialized fine
    return true;
}

bool load_files()
{
    //Load the square image
    square = load_image( "/Users/Modius/X-Code 4/SDL-own/SDL-own/square.bmp" );
    
    //If there was a problem in loading the square
    if( square == NULL )
    {
        return false;
    }
    
    //If everything loaded fine
    return true;
}

void clean_up()
{
    //Free the surface
    SDL_FreeSurface( square );
    
    //Quit SDL
    SDL_Quit();
}

Square::Square()
{
    //Initialize the offsets
    box.x = 30;
    box.y = 400;
    
    //Set the square's dimentions
    box.w = SQUARE_WIDTH;
    box.h = SQUARE_HEIGHT;
    
    //Initialize the velocity
    xVel = 0;
    yVel = 0;
   
}

void Square::handle_input()
{
    //If a key was pressed
    if( event.type == SDL_KEYDOWN )
    {
        //Adjust the velocity
        switch( event.key.keysym.sym )
        {
            //case SDLK_UP: yVel -= SQUARE_HEIGHT / 2; break;
           // case SDLK_DOWN: yVel += SQUARE_HEIGHT / 2; break;
           // case SDLK_UP: jump (); break;
            case SDLK_LEFT: xVel -= SQUARE_WIDTH / 2; printf ("left\n");break;
            case SDLK_RIGHT: xVel += SQUARE_WIDTH / 2;printf ("right\n"); break;
        }   
    }
    //If a key was released
    else if( event.type == SDL_KEYUP )
    {
        //Adjust the velocity
        switch( event.key.keysym.sym )
        {
            //case SDLK_UP: yVel += SQUARE_HEIGHT / 2; break;
            //case SDLK_DOWN: yVel -= SQUARE_HEIGHT / 2; break;
            //case SDLK_UP: jump(); break;
            case SDLK_LEFT: xVel += SQUARE_WIDTH / 2; break;
            case SDLK_RIGHT: xVel -= SQUARE_WIDTH / 2; break;
        }
    }
}

void Square::jump(){
    
    double fdiff;
    jumpTimer += 1;
    bool quitJump = false;
    jumpTimer += 0.1;


    if (quitJump = true)
    {
    fdiff = jumpStr *jumpTimer; //s = v*t
    fdiff = fdiff - (0.5 * 9.81 * pow (jumpTimer,2)); // Schwerkraft s = 1/2 * a * t^2
    box.y -= (int)fdiff;
    if (yVel >= SCREEN_HEIGHT - SQUARE_HEIGHT)
    {
        quitJump = true;
        jumpTimer = 0;
    }
    }else{
    
        fdiff = fdiff - (0.5 * 9.81 * pow (jumpTimer,2)); // Schwerkraft s = 1/2 * a * t^2
        
    }
}

void Square::gravity(){
    
    int grav = 1;
    box.y = box.y +grav;
}

bool Square::ground(){
    if ( check_collision( box, wall ) == false) {
        printf("gravity\n");
        return true;
    }
    else{
        printf("ground\n");
        return false;}
}

void Square::move()
{
    
    //Move the square left or right
    box.x += xVel;
    
    //If the square went too far to the left or right or has collided with the wall
    if( ( box.x < 0 ) || ( box.x + SQUARE_WIDTH > SCREEN_WIDTH )
       ||( check_collision( box, wall  ) )
       ||( check_collision( box, wall2  ))
       )
    {
        //Move back
        box.x -= xVel;
    }
    
    //Move the square up or down
    box.y += yVel;
/*
    //If the square went too far up or down or has collided with the wall
    if( ( box.y < 0 ) || ( box.y + SQUARE_HEIGHT > SCREEN_HEIGHT )
       || ( check_collision( box, wall  ))
       || ( check_collision( box, wall2 ))
       
       )
    {
        //Move back
        box.y -= yVel;
    }
  */
    if (ground() == true){
        gravity();
    }
}

void Square::show()
{
    //Show the square
    apply_surface( box.x, box.y, square, screen );
}

int main( int argc, char* args[] )
{
    //Quit flag
    bool quit = false;
    
    //The square
    Square mySquare;
    
    //The frame rate regulator
    Timer fps;
    
    //Initialize
    if( init() == false )
    {
        return 1;
    }
    
    //Load the files
    if( load_files() == false )
    {
        return 1;
    }
    
    //Set the wall
    wall.x = 0;
    wall.y = 440;
    wall.w = 640;
    wall.h = 40;

    //Set the 2nd wall
    wall2.x = 200;
    wall2.y = 400;
    wall2.w = 640;
    wall2.h = 40;
        //While the user hasn't quit
    while( quit == false )
    {
        //Start the frame timer
        fps.start();
        
        //While there's events to handle
        while( SDL_PollEvent( &event ) )
        {
            //Handle events for the square

            mySquare.handle_input();
            
            //If the user has Xed out the window
            if( event.type == SDL_QUIT )
            {
                //Quit the program
                quit = true;
            }
        }
        
       // mySquare.gravity();
        //Move the square
        mySquare.move();
        //Fill the screen white
        SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );
        
        //Show the wall
        SDL_FillRect( screen, &wall, SDL_MapRGB( screen->format, 0x22, 0x8b, 0x22 ) );
        SDL_FillRect( screen, &wall2, SDL_MapRGB( screen->format, 0x22, 0x8b, 0x22 ) );

        //Show the square on the screen
        mySquare.show();
        
        //Update the screen
        if( SDL_Flip( screen ) == -1 )
        {
            return 1;
        }
        
        //Cap the frame rate
        if( fps.get_ticks() < 1000 / FRAMES_PER_SECOND )
        {
            SDL_Delay( ( 1000 / FRAMES_PER_SECOND ) - fps.get_ticks() );
        }
    }
    
    //Clean up
    clean_up();
    
    return 0;
}

2

29.08.2013, 16:40

Hab irgendwie ein Dejavu
Probleme mit Gravity und Jump

Das sieht alles irgendwie so aus, als wüsstest du nicht was du tust.

C-/C++-Quelltext

1
2
3
4
5
//Cap the frame rate
        if( fps.get_ticks() < 1000 / FRAMES_PER_SECOND )
        {
            SDL_Delay( ( 1000 / FRAMES_PER_SECOND ) - fps.get_ticks() );
        }

Ist ein Beispiel was hier aus sehr, sehr vielen heraus sticht.

3

29.08.2013, 17:16

Ich möchte nicht auschließen, dass es nicht wirklich gut ist. Ist halt auch mein erstes Projekt in diese Richtung

4

29.08.2013, 17:28

Ob es gut ist, oder nicht, das will ich gar nicht beurteilen. Es ist wohl offensichtlich, das dich das alles überfordert, sonst würdest du nicht schon den 2. Thread zu dem gleichen Code aufmachen.
Es sind immer noch die gleichen Fehler drin, die ich auch schon im letzten Thread angemerkt habe, warum also in 3 Teufels Namen verbesserst du das nicht?
Geh doch einfach mal strukturiert vor, nutz den Debugger und verfolge mal genau, was dein Code macht.
Das bringt dich weiter als in einem Forum 400Zeilen Code zu posten, und andere daran arbeiten zu lassen.

Werbeanzeige