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

[SDL] Kafelki + przewijanie mapy

Ostatnio zmodyfikowano 2011-04-28 22:10
Autor Wiadomość
mundzio123
Temat założony przez niniejszego użytkownika
[SDL] Kafelki + przewijanie mapy
» 2011-04-17 22:08:19
I oto znowu mam mały problem z kafelkowaniem mapy. Chodzi o przewijanie jej. Nie mam pojęcia jak zrobić żeby przy wciskaniu jednego guzika mapa przewijała się w którąś strone.
C/C++
#include <SDL/SDL.h>
#include "czas.hpp"

SDL_Surface * ekran = NULL;
SDL_Surface * grass = NULL;
SDL_Rect rPole, MapaDestination;
SDL_Surface * ziemia = NULL;

SDL_Event zdarzenie;


//Tablica z mapą
int pole[ 10 ][ 19 ] = {
    { 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
};

const int FRAMES_PER_SECOND = 20;
int map_x = 0, map_y = 0, frame;
bool koniec = false, cap = true;
Uint8 * keystate = SDL_GetKeyState( NULL );
int x;
Timer fps;

//Funkcja rysująca mape
void ruch()
{
    for( int i = 0 + x; i < 10 + x; i++ )
    {
        for( int j = 0; j < 19; j++ )
        {
            if( pole[ i ][ j ] == 0 )
            {
                SDL_BlitSurface( ziemia, NULL, ekran, & rPole );
            }
            if( pole[ i ][ j ] == 1 )
            {
                SDL_BlitSurface( grass, NULL, ekran, & rPole );
            }
            rPole.x = rPole.x + 50;
        }
        rPole.y = rPole.y + 50;
        rPole.x = 0; }
}


int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 500, 500, 32, SDL_DOUBLEBUF | SDL_SWSURFACE );
    grass = SDL_LoadBMP( "sprite/grass.bmp" );
    ziemia = SDL_LoadBMP( "sprite/ziemia.bmp" );
   
    while( koniec != true )
    {
        fps.start();
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT )
            {
                koniec = true;
            }
        }
        if( fps.get_ticks() < 1000 / FRAMES_PER_SECOND )
        { SDL_Delay(( 1000 / FRAMES_PER_SECOND ) - fps.get_ticks() ); }
       
        if( keystate[ SDLK_RIGHT ] ) {
            MapaDestination.x--;
            frame++;
        }
       
        //Moja mizerna, nieudana próba zrobienia scrolowanie
        frame = 0;
        if( frame == 50 ) { x++, frame = 0; }
        if( frame == 0 ) { ruch(); }
        SDL_BlitSurface( ekran, NULL, ekran, & MapaDestination );
        SDL_Flip( ekran );
       
    }
}

Tak jak teraz jest w kodzie mapa rysuje się i co prawda przewija, lecz rysuje coś dziwnego ? Nie wiem jak to określić, poprosto bez żadnego schematu. Prosze o pomoc :)
P-31050
DejaVu
» 2011-04-17 22:12:11
Kafelki były rzeźbione na potęgę u nas na forum ale z biblioteką Allegro - poczytaj te tematy a będziesz szczęśliwym człowiekiem, bowiem tam jest dużo informacji, które Ci się zapewne przy tworzeniu gier przydadzą.
P-31053
mundzio123
Temat założony przez niniejszego użytkownika
» 2011-04-24 23:52:46
Wałkowałem te tamaty... lecz SDL to troszke coś innego niż SDL i nie moge sobie poradzić. Dlatego prosze was o pomoc.
P-31908
DejaVu
» 2011-04-25 00:00:58
Zasady tworzenia gier są niezależne od stosowanej biblioteki renderującej.
P-31909
kamillo121
» 2011-04-25 00:01:50
Oddziel sobie grafikę od logiki i po problemie...
A tak na szybko to zerknij jak lazyfoo to robi
http://lazyfoo.net/SDL_tutorials/lesson29/index.php
P-31910
Gabes
» 2011-04-25 08:14:07
Gdybyś pisał w allegro to dałbym ci gotowy kod
napisz jakie masz kafelki to znaczy wymiry i ile ich jest tylko zamienisz funkcje wyświetlące i będzie okej ijeszcze wielkośc ekranu.,
aha bitmapy-kafelek najwygodniej jest mieć na jednej bitmapie
czym przewijasz myszka czy klaw.
P-31913
absflg
» 2011-04-25 13:01:29
Kafelka ma ustaloną ilość pikseli. Żeby wyświetlić dany fragment, musisz znać wymiary prostokąta (fragmentu mapy) który chcesz wyświetlić (na obrazku http://tinypic.com/r/347yxja/7 czerwony prostokąt). Musisz później ustalić które kafle są w zasięgu (na tym załączonym bazgrole to te niebieskie). Następnie wklejasz je (te w zasięgu) na swój SDL_Surface (zakładam że wiesz jak) odejmując od współrzędnych ich lewego górnego rogu pozycję lewego górnego rogu naszego fragmentu. W ten sam sposób postępujesz z innymi obiektami w zasięgu, tj. korygujesz ich współrzędne podczas wyświetlania.

Nie wiem jak u tego z wydajnością, ale chyba tak jest najprościej.

//E
A tak, i przewijanie przyciskiem: ten prostokąt do wyświetlania ma stałe wymiary (takie jak ekran), a jego X i Y reaguje na strzałki (odpowiednio zwiększają/zmniejszają).
P-31930
mundzio123
Temat założony przez niniejszego użytkownika
» 2011-04-25 16:07:52
ehh... głupi nie jestem, tylko nie potrafie sobie z tym poradzić. Wszystko dobrze się rysuje, lecz gdy przewijam mape bok rozmazuje się tak jak na zdjęciu:

http://img12.imageshack.us/i/beztytuuwfr.png/

I gdy nacisne strzałke w prawo, funkcja co jakiś czas zmienia swoją orientacje i rysuje różne dziwne rzeczy, co jest widoczne na zrzucie ekranu.

A teraz jak wygląda ekran po włączeniu:

http://img849.imageshack.us/i/beztytuuaia.png/

na 100% błąd jest w funkcji rysującej, ponieważ ostatnio dodałem tam linijke kodu, lecz niestety nie zapisałem tego ;/
P-31940
« 1 » 2 3
  Strona 1 z 3 Następna strona