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ść
kamillo121
» 2011-04-25 16:23:55
A to niby co to ma być ?
C/C++
SDL_BlitSurface( ekran, NULL, ekran, & MapaDestination ); // z tego co zauważyłem to powierzchnia ekran jest powierzchnią video wiec to się mija z celem
SDL_Flip( ekran );


ehh... głupi nie jestem, tylko nie potrafie sobie z tym poradzić.
Nikt tak raczej nie powiedział, naucz się po prostu dobrze zadawać pytania to odpowiadający będzie mógł trafniej zlokalizować problem...
P-31943
malan
» 2011-04-25 20:25:05
Tylko, że my nie widzimy tej funkcji ;)
P-31975
mundzio123
Temat założony przez niniejszego użytkownika
» 2011-04-25 20:59:07
Chodzi mi o tą funkcje

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; }
}
Była zamieszczona w pierwszym poście :)

Teraz wszystko rysuje na buforze i potem z bufora na ekran, lecz dalej to samo.
P-31976
kamillo121
» 2011-04-25 21:59:13
A usunąłeś tamtą linijkę z blitem video na video ?  (pokaż lepiej obecny kod )
P-31983
mundzio123
Temat założony przez niniejszego użytkownika
» 2011-04-25 23:31:07

#include <SDL/SDL.h>
#include "czas.hpp"

SDL_Surface * ekran = NULL;
SDL_Surface * grass = NULL;
SDL_Rect rPole, MapaDestination;
SDL_Surface * ziemia = NULL;
SDL_Surface * bufor = 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, bufor, & rPole );
            }
            if( pole[ i ][ j ] == 1 )
            {
                SDL_BlitSurface( grass, NULL, bufor, & 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 );
    bufor = SDL_SetVideoMode (500, 500, 32, SDL_SWSURFACE);
    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( bufor, NULL, ekran, & MapaDestination );
        SDL_Flip( ekran );
      
    }
}
P-31984
kamillo121
» 2011-04-25 23:46:38
spróbuj zamienić:
C/C++
SDL_BlitSurface( bufor, NULL, ekran, & MapaDestination );
SDL_Flip( ekran );
na

C/C++
SDL_BlitSurface( bufor, NULL, ekran, NULL );
SDL_Flip( ekran );

I zobacz jak umieszczać kod na forum  http://cpp0x.pl/kursy/Kurs-STC/Kolorowanie-skladni /Kolorowanie-skladni-jezyka-C++/221
P-31986
mundzio123
Temat założony przez niniejszego użytkownika
» 2011-04-26 13:05:46
No ale ten kod

C/C++
SDL_BlitSurface( bufor, NULL, ekran, & MapaDestination );
SDL_Flip( ekran );

odpowiada za ruch tła przy naciśnięciu strzałki w prawo. Bez tego stałoby nieruchomo, a mapa sama dobrze się rysuje, tylko są problemy z przesuwaniem jej po powierzchni.
P-32002
absflg
» 2011-04-26 14:13:48
Nie wdawałem się specjalnie w kod, ale to wygląda osobliwie:
C/C++
frame = 0;
if( frame == 50 ) { x++, frame = 0; }
if( frame == 0 ) { ruch(); }
Po co te instrukcje warunkowe, jeżeli w tym miejscu zawsze frame jest równe 0?

Do ostatniego postu:
Przecież to określa, w którym miejscu ekranu ma się wyświetlić bufor, a on ma się wyświetlić zawsze na całym ekranie, więc NULL zamiast prostokąta jest jak najbardziej zasadne.


Moim zdaniem zrobiłeś to wyjątkowo kombinatorycznie. Po co ci ten zmienne globalne? Przerób funkcję rysującą tak, aby wyświetlała na ekranie prostokąt podawany jako argument i dopiero wokół niej buduj resztę programu.

Jeżeli to nie problem to wrzucaj na jakiś host ten exec, bo po dwóch screenach ciężko zrozumieć jak to działa, bez rozgrzebywania twojego kodu.
P-32006
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona