Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sdl - grawitacja

Ostatnio zmodyfikowano 2011-06-25 14:23
Autor Wiadomość
mesajah
Temat założony przez niniejszego użytkownika
Sdl - grawitacja
» 2011-06-08 17:41:20
Wczoraj zacząłem się bawić SDL-em i oto efekt :
C/C++
#include <SDL.h>

Uint8 * keystate = SDL_GetKeyState( NULL );
SDL_Surface * ekran = NULL;
SDL_Surface * bg = NULL;
SDL_Surface * map = NULL;
SDL_Surface * chars = NULL;
SDL_Event zdarzenie;
bool wyjscie = false;
SDL_Rect sprst[ 1 ];
SDL_Rect dprst[ 100 ];
SDL_Rect charss;
int x;
int y = 24;
int level = 1;
int graw;
// 1 kratka 16x16
int main( int argc, char * args[] )
{
    dprst[ 0 ].x = 0;
    dprst[ 0 ].y = 64;
    dprst[ 1 ].x = 16;
    dprst[ 1 ].y = 64;
    dprst[ 2 ].x = 32;
    dprst[ 2 ].y = 64;
    dprst[ 3 ].x = 48;
    dprst[ 3 ].y = 64;
    dprst[ 4 ].x = 64;
    dprst[ 4 ].y = 64;
    dprst[ 5 ].x = 80;
    dprst[ 5 ].y = 64;
    dprst[ 6 ].x = 96;
    dprst[ 6 ].y = 64;
    dprst[ 7 ].x = 112;
    dprst[ 7 ].y = 64;
    dprst[ 8 ].x = 128;
    dprst[ 8 ].y = 64;
    dprst[ 9 ].x = 144;
    dprst[ 9 ].y = 64;
    dprst[ 10 ].x = 160;
    dprst[ 10 ].y = 64;
    dprst[ 11 ].x = 176;
    dprst[ 11 ].y = 64;
    dprst[ 12 ].x = 192;
    dprst[ 12 ].y = 64;
    dprst[ 13 ].x = 208;
    dprst[ 13 ].y = 64;
    dprst[ 14 ].x = 224;
    dprst[ 14 ].y = 64;
    dprst[ 15 ].x = 240;
    dprst[ 15 ].y = 64;
    dprst[ 16 ].x = 256;
    dprst[ 16 ].y = 64;
    dprst[ 17 ].x = 272;
    dprst[ 17 ].y = 64;
    dprst[ 18 ].x = 288;
    dprst[ 18 ].y = 64;
    dprst[ 19 ].x = 304;
    dprst[ 19 ].y = 64;
    dprst[ 20 ].x = 320;
    dprst[ 20 ].y = 64;
    dprst[ 21 ].x = 336;
    dprst[ 21 ].y = 64;
    dprst[ 22 ].x = 352;
    dprst[ 22 ].y = 64;
    dprst[ 23 ].x = 368;
    dprst[ 23 ].y = 64;
    dprst[ 24 ].x = 384;
    dprst[ 24 ].y = 64;
    dprst[ 25 ].x = 400;
    dprst[ 25 ].y = 64;
    dprst[ 26 ].x = 416;
    dprst[ 26 ].y = 64;
    dprst[ 27 ].x = 432;
    dprst[ 27 ].y = 64;
    dprst[ 28 ].x = 448;
    dprst[ 28 ].y = 64;
    dprst[ 29 ].x = 464;
    dprst[ 29 ].y = 64;
    dprst[ 30 ].x = 480;
    dprst[ 30 ].y = 64;
    dprst[ 31 ].x = 496;
    dprst[ 31 ].y = 64;
    dprst[ 32 ].x = 512;
    dprst[ 32 ].y = 64;
    dprst[ 33 ].x = 528;
    dprst[ 33 ].y = 64;
    dprst[ 34 ].x = 544;
    dprst[ 34 ].y = 64;
    dprst[ 35 ].x = 560;
    dprst[ 35 ].y = 64;
    dprst[ 36 ].x = 576;
    dprst[ 36 ].y = 64;
    dprst[ 37 ].x = 592;
    dprst[ 37 ].y = 64;
    dprst[ 38 ].x = 608;
    dprst[ 38 ].y = 64;
    dprst[ 39 ].x = 624;
    dprst[ 39 ].y = 64;
   
   
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    bg = SDL_LoadBMP( "bg.bmp" );
    map = SDL_LoadBMP( "grass.bmp" );
    chars = SDL_LoadBMP( "char.bmp" );
    SDL_WM_SetCaption( "MiniGame", NULL );
   
   
    while( !wyjscie )
    {
        while( SDL_PollEvent( & zdarzenie ) )
        {
           
            if( zdarzenie.type == SDL_QUIT )
            {
                wyjscie = true;
            }
            if( level == 1 )
            {
                switch( zdarzenie.key.keysym.sym )
                {
                case SDLK_RIGHT:
                    x = x + 8;
                    break;
                   
                case SDLK_LEFT:
                    if( x <= 0 )
                    {
                    }
                    else
                    {
                        x = x - 8;
                    }
                    break;
                   
                case SDLK_DOWN:
                   
                    if( y > 24 )
                    {
                       
                    }
                    else
                    {
                        y = y + 8;
                    }
                    break;
                case SDLK_UP:
                    if( y < 16 )
                    {
                    }
                    else
                    {
                        y = y - 8;
                       
                    }
                    break;
                }
               
            }
            if( level == 1 )
            {
                SDL_BlitSurface( bg, NULL, ekran, NULL );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 0 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 1 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 2 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 3 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 4 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 5 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 6 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 7 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 8 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 9 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 10 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 11 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 12 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 13 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 14 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 15 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 16 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 17 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 18 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 19 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 20 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 21 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 22 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 23 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 24 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 25 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 26 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 27 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 28 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 29 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 30 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 31 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 32 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 33 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 34 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 35 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 36 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 37 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 38 ] );
                SDL_BlitSurface( map, NULL, ekran, & dprst[ 39 ] );
            }
           
            charss.x = x;
            charss.y = y;
            SDL_BlitSurface( chars, NULL, ekran, & charss );
           
           
        }
       
       
        if( x >= 624 )
        {
            level = 2;
            x = 0;
        }
       
        SDL_Flip( ekran );
       
    }
   
    SDL_Quit();
    return 0;
}

Zastanawiam się nad dwoma rzeczami, co zrobić aby gra była bardziej płynna ? Jak stworzyć grawitację ? (przyciąganie do określonego obrazka map.png)
P-33963
kamillo121
» 2011-06-08 20:17:23
Nie wiem  czy mi gałki oczne odmawiają posłuszeństwa ale chyba umieściłeś blitowanie elementów w pętli która ma obsługiwać zdarzenia ? jeśli tak to wywal to z tej pętli zdarzeń i daj do pętli głównej(nie wspominając o tym, że mogłeś użyć pętli do wyświetlania tego czegoś z tablicy...).

Co do grawitacji to podręcznik do fizy albo zeszyt(nie wiem czy prowadzisz i czy jesteś na etapie nauczania) i poszukaj kilku prostych wzorów i stwórz sobie fizykę easy !
 
Co do marnotrawienia pamięci to zwalniaj na końcu powierzchnie zarezerwowane dla bitmap( prócz buforu ekranowego!).
P-33966
mesajah
Temat założony przez niniejszego użytkownika
» 2011-06-09 12:35:52
dobrze wymyśliłem, ale teraz chciałbym prosić o skrypt na takie jakby ściany, żeby się nie dało przechodzić przez np. jakąś ścianke
P-33971
DejaVu
» 2011-06-09 13:19:17
W C++ tworzysz wszystko od podstaw - to nie jest język w którym masz gotowe klocki. Na to by coś nie przechodziło przez 'ścianę' pisze się po prostu warunki. Google: "algorytm wykrywania kolizji".
P-33973
asembler
» 2011-06-25 14:23:29
1. Jak już wspomniano w pętli zdarzeniowej umieściłeś inne elementy
2. Do płynności użyj timerów (nie wiem czy tam są bo nie chciało mi się tego analizować)
3. Do grawitacji użyj fizyki
4. Zwalniaj bitmapy, muzykę i fonty z pamięci
P-34647
« 1 »
  Strona 1 z 1