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

[Allegro] Znikanie postaci na mapie kafelkowej poruszanie

Ostatnio zmodyfikowano 2010-02-24 21:55
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[Allegro] Znikanie postaci na mapie kafelkowej poruszanie
» 2010-02-23 13:41:12
Mam mapę kafelkową jako podłoze i na tej mapie ludzika którym poruszam strzałkami. Wszystk niby działa z tą różnicą tylko że jak nacisnę strzałkę w dół to ludzik znika dopuki nie puszczę strzałki. Jest jakiś sposób na to aby ludzik nie znikał? Wiem że podobny problem był już poruszany na tym forum ale jakoś nie mogę go znaleść... A to kawałek kodu odpowiedzialnego za poruszanie ludzikiem:
[source code src ="C++"]
   ludek.kierunek =0;
   //Poruszanie ludzikiem
   if ( key[KEY_LEFT])  { ludek.kierunek = 1; ludek.pos_x-- ; }
   if ( key[KEY_RIGHT]) { ludek.kierunek = 3; ludek.pos_x++; }
   if ( key[KEY_UP])    { ludek.kierunek = 2; ludek.pos_y--; }
   if ( key[KEY_DOWN])    { ludek.kierunek = 4; ludek.pos_y++; }
[/source]
P-14038
seba000
» 2010-02-23 14:09:21
W tym kodzie chyba nie ma błędu. Wrzuć resztę lub zobacz kod, który dotyczy rysowania ludzika i miejsc w których występuje ludek.kierunek.
P-14040
wojownik266
Temat założony przez niniejszego użytkownika
» 2010-02-23 14:49:09
Po wklejeniu kodu trochę zmienił się układ tablicy map[][]. Oto cały kod moich wypocin:
C/C++
#include <allegro.h>
#include <cmath>
using namespace std;

BITMAP * bufor = NULL;
BITMAP * teren = NULL;
BITMAP * bohaterka = NULL;
BITMAP * drzewa = NULL;
class Cpostac
{
public:
    //Wszystkie zmienne potrzebne do sterowania naszym ludzikiem
    int pos_x, pos_y; // pozycja samochodu na ekranie
    short int kierunek, klatka; // aktualny kierunek samochodu
    bool mp;
    bool ml;
   
};



volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );

//kafelki mapy podłoża
int map[ 24 ][ 32 ] =
{
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    //Druga plansza
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
};

int map_drzewa[ 12 ][ 16 ] =
{
    0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0,
    0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    0, 10, 10, 10, 10, 10, 1, 10, 10, 1, 10, 10, 10, 10, 10, 10,
    0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
   
};
int mapa_x = 0, mapa_y = 0; //Zmienne do mapy podłoza
int drzew_x = 0, drzew_y = 0; //Zmienne do mapy drzew
// Funkcja wyświetlająca mapę:
void wys_mape()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 16; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 12; licznik_y++ )
        {
            blit( teren, bufor,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 4 ) * 40,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 4 ) * 40,
            licznik_x * 40, licznik_y * 40, 40, 40 );
        }
    }
};

void wys_drzewa()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 16; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 12; licznik_y++ )
        {
            masked_blit( drzewa, bufor,
            ( map_drzewa[ licznik_y + drzew_y ][ licznik_x + drzew_x ] % 4 ) * 40,
            ( map_drzewa[ licznik_y + drzew_y ][ licznik_x + drzew_x ] / 4 ) * 40,
            licznik_x * 40, licznik_y * 40, 40, 50 );
        }
    }
};

int main()
{
    PALETTE pal;
    if( allegro_init() != 0 )
         return 1;
   
    install_keyboard();
    install_timer();
    set_color_depth( 24 );
    install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) );
    if( set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 640, 480, SCREEN_W, SCREEN_H ) != 0 ) {
        if( set_gfx_mode( GFX_SAFE, 640, 480, 0, 0 ) != 0 ) {
            allegro_message( "Nie moge utworzyc grafiki", allegro_error );
            return 1;
        }
    }
   
    bufor = create_bitmap( SCREEN_W, SCREEN_H );
    clear_bitmap( bufor );
    set_projection_viewport( 0, 0, SCREEN_W, SCREEN_H );
    set_palette( pal );
    teren = load_bmp( "kafelki.bmp", 0 );
    bohaterka = load_bmp( "bohaterka.bmp", NULL );
    drzewa = load_bmp( "drzewa.bmp", default_palette );
    // Zmienna naszej klasy
    Cpostac ludek;
    // Ustalanie początkowej pozycji ludzika
    int frame = 0;
    ludek.pos_x = 320;
    ludek.pos_y = 440;
    ludek.kierunek = 0;
    ludek.klatka = 0;
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 0, 0, 0 ) );
        while( speed > 0 )
        {
            ludek.kierunek = 0;
            //Poruszanie ludzikiem
            if( key[ KEY_LEFT ] ) { ludek.kierunek = 1; ludek.pos_x--; }
            if( key[ KEY_RIGHT ] ) { ludek.kierunek = 3; ludek.pos_x++; }
            if( key[ KEY_UP ] ) { ludek.kierunek = 2; ludek.pos_y--; }
            if( key[ KEY_DOWN ] ) { ludek.kierunek = 4; ludek.pos_y++; }
           
            // SCROLLOWANIE MAPY
            if(( key[ KEY_RIGHT ] ) &&( mapa_x < 16 ) &&( drzew_x < 16 ) ) { mapa_x = mapa_x + 1; drzew_x = drzew_x + 1; } else
            if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) &&( drzew_x > 0 ) ) { mapa_x = mapa_x - 1; drzew_x = drzew_x - 1; } else
            if(( key[ KEY_DOWN ] ) &&( mapa_y < 12 ) ) { mapa_y = mapa_y + 1; } else
            if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
            speed--;
            frame++;
            if( frame > 40 ) frame = 0;
           
        }
        wys_mape();
        wys_drzewa();
        //Wyświetlanie ludzika
        masked_blit( bohaterka, bufor, ludek.kierunek * 25, ludek.klatka * 25, ludek.pos_x, ludek.pos_y, 25, 40 );
        blit( bufor, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H );
       
    }
   
    destroy_bitmap( bufor );
    destroy_bitmap( teren );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-14043
dmx81
» 2010-02-24 00:10:20
poniewaz troszke pozno i na szybko przeczytalem kod wiec moze nie zauwazylem, ale odpowiedz:

do czego sluzy tu zmienna frame? bo rosnie, zerujesz ja... ok, ale po co?
(oczywiscie wiem po co sie tego uzywa, ale nie widze, abys tu stosowal...)

po drugie zmienna klatka - czy ona sie zmienia, czy jest zawsze 0? jesli 0, a swoja bitmape z ludkiem masz "jednopietrowa" czyli wszytskie klatki polaczone obok siebie, a zadna pod spodem, to ok - powinno wyswietlac zawsze od y=0, a kierunek zmienia sie w zaleznosci od strzalki 0 - nie nacisniete nic, 1234 to strzalki

po trzecie - jesli jednak klatka ma sie zmieniac - to nie moze byc klatka*25, jesli wysokosc obrazka masz 40 - wtedy obcinaloby go nieco - bo dopoki klatka = 0, tego i tak nie zauwazymy (chyba ze jaki pisalem w pkt2 - wszystkie obrazki sa w 1 rzedzie - wtedy nie potrzebna nam zmienna klatka, poprostu 0)


jesli cos przeoczylem lub blednie napisalem , poprosze o korekte

ps. a drzewa dobrze wyswietla? nie sa obciete na wysokosci troszke?
P-14083
wojownik266
Temat założony przez niniejszego użytkownika
» 2010-02-24 12:01:50
Po wnikliwym zgłębieniu tego co napisałeś wyszło że przyczyna opisanego przezemnie problemu tkwiła w wymiarach ludzika. Jednak muszą to być wymiary wymiarowe np. 60x60. Fragment kodu odpowiedzialnego za poruszanie, znikanie ludzika ma się teraz tak:

[source code src="c++"]
    while (!key[KEY_ESC])
    {
        clear_to_color(bufor,makecol(0,0,0));
        while (speed>0)
        {
            ludek.kierunek =0;
            //Poruszanie ludzikiem
            if ( key[KEY_LEFT])  { ludek.kierunek = 1; ludek.pos_x-- ; }
            if ( key[KEY_RIGHT]) { ludek.kierunek = 3; ludek.pos_x++; }
            if ( key[KEY_UP])    { ludek.kierunek = 2; ludek.pos_y--; }
            if ( key[KEY_DOWN])    { ludek.kierunek = 4; ludek.pos_y++; }

            // SCROLLOWANIE MAPY
           if((key[KEY_RIGHT]) && (mapa_x < 16)&&(drzew_x<16)){ mapa_x = mapa_x + 1;drzew_x=drzew_x+1; } else
           if((key[KEY_LEFT])  && (mapa_x > 0)&&(drzew_x>0)){ mapa_x = mapa_x - 1; drzew_x=drzew_x-1;} else
           if((key[KEY_DOWN])  && (mapa_y < 12)){ mapa_y = mapa_y + 1; } else
           if((key[KEY_UP])    && (mapa_y >0 )){ mapa_y = mapa_y - 1; }
            speed--;
            frame++;
            if ( frame > 20) frame=0;
        }
            // Sterowanie animacją
            if( frame<20) { ludek.klatka = 0;}
            else if( frame>=20 && frame<40) { ludek.klatka = 1; }
           wys_mape();
           wys_drzewa();
           //Wyświetlanie ludzika
           masked_blit( bohaterka, bufor, ludek.kierunek*60 ,ludek.klatka*60 ,ludek.pos_x, ludek.pos_y,60,60);
           blit(bufor,screen,0,0,0,0,SCREEN_W,SCREEN_H);

    }
[/source]

Po tej zmianie wszystko działa tak jak tego chciał twórca czyli ja. Dziękuję!!
P-14105
dmx81
» 2010-02-24 16:54:06
C/C++
frame++;
if( frame > 20 ) frame = 0;

if( frame < 20 ) { ludek.klatka = 0; }
else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; }
a czy widzisz tu cos sprzecznego? ;)
P-14127
wojownik266
Temat założony przez niniejszego użytkownika
» 2010-02-24 17:29:45
Porównaj ten fragmęt który zacytowałeś z fragmętem ktory ja zacytowałem a nstępnie oba te fragmęty z fragmętem całego programu który zacytowałem na wstępie. Powinno Cię olśnić...
P-14134
wojownik266
Temat założony przez niniejszego użytkownika
» 2010-02-24 17:40:23
Jeszcze raz dziękuję za pomoc i gwoli wyjaśnienia dodam że po zmianie wymiarów ludzika na mapie wczytywanej do programu z 25xX na 60x60 program działa tak jak powinien...
P-14137
« 1 » 2
  Strona 1 z 2 Następna strona