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

[Allegro] Niepoprawne wyświetlanie mapy

Ostatnio zmodyfikowano 2010-05-07 16:17
Autor Wiadomość
Saiph
Temat założony przez niniejszego użytkownika
[Allegro] Niepoprawne wyświetlanie mapy
» 2010-05-06 19:50:03
C/C++
#include<allegro.h>
#include <vector>

int const X = 640, Y = 480;
volatile long SpeedPocisku = 0;
void increment_SpeedPocisku()
{
    SpeedPocisku++;
}
END_OF_FUNCTION( increment_SpeedPocisku );
LOCK_VARIABLE( SpeedPocisku );
LOCK_FUNCTION( increment_SpeedPocisku );

volatile long SpeedSrollowaniaMapy = 0;
void increment_SpeedSrollowaniaMapy()
{
    SpeedSrollowaniaMapy++;
}
END_OF_FUNCTION( increment_SpeedSrollowaniaMapy );
LOCK_VARIABLE( SpeedSrollowaniaMapy );
LOCK_FUNCTION( increment_SpeedSrollowaniaMapy );

volatile long SpeedStatku = 0;
void increment_SpeedStatku()
{
    SpeedStatku++;
}
END_OF_FUNCTION( increment_SpeedStatku );
LOCK_VARIABLE( SpeedStatku );
LOCK_FUNCTION( increment_SpeedStatku );

volatile long TimerCooldown = 0;
void increment_TimerCooldown() {
    TimerCooldown++;
}
END_OF_FUNCTION( increment_TimerCooldown );
LOCK_VARIABLE( TimerCooldown );
LOCK_FUNCTION( increment_TimerCooldown );

volatile int fps = 0;
volatile int fpsCounter = 0;
void FramesPerSecond() {
    fps = fpsCounter;
    fpsCounter = 0;
}
END_OF_FUNCTION( FramesPerSecond )
LOCK_VARIABLE( fps );
LOCK_FUNCTION( FramesPerSecond );

void init();
void deinit();

class Cstatek
{
public:
    int x, y;
    Cstatek::Cstatek();
};
Cstatek::Cstatek()
    : x( 10 )
    , y( 30 )
{
   
}

class Cpocisk {
public:
    int x, y;
    bool boom;
    double dx, dy;
   
    Cpocisk::Cpocisk( int xx, int xy, bool xboom, double xdx, double xdy );
};
Cpocisk::Cpocisk( int xx, int xy, bool xboom, double xdx, double xdy )
    : x( xx )
    , y( xy )
    , boom( xboom )
    , dx( xdx )
    , dy( xdy )
{
}



int main()
{
    init();
   
    BITMAP * bufor = create_bitmap( X, Y );
    BITMAP * BstatekGracza = NULL; BstatekGracza = create_bitmap( 20, 30 ); clear_to_color( BstatekGracza, makecol( 255, 255, 255 ) );
    BITMAP * Bshot = NULL; Bshot = create_bitmap( 5, 20 ); clear_to_color( Bshot, makecol( 255, 0, 255 ) );
    BITMAP * Bmapa = create_bitmap( 64, 64 ); clear_to_color( Bmapa, makecol( 150, 150, 150 ) ); rectfill( Bmapa, 32, 0, 64, 32, makecol( 255, 255, 255 ) );
   
    Cstatek statek;
   
    std::vector < Cpocisk > pocisk;
    int zm = 0;
    bool strzal = false;
    double v = 0.33;
    pocisk.push_back( Cpocisk( 50, 50, true, 0, 0 ) );
   
    int licznik_x = 0, licznik_y = 0;
    int mapaX = 0, mapaY = 0;
   
    short int map[ 15 ][ 40 ] =
    {
        0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 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, 0, 0, 0, 0, 0,
        0, 0, 1, 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, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 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, 0, 0, 0, 0, 0,
        0, 0, 1, 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, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
   
    while( !key[ KEY_ESC ] )
    {
        fpsCounter++;
        clear_bitmap( bufor );
        for( licznik_x = 0; licznik_x < 21; licznik_x++ )
        {
            for( licznik_y = 0; licznik_y < 16; licznik_y++ )
            {
                blit( Bmapa, bufor,
                ( map[ licznik_y + mapaY ][ licznik_x + mapaX ] % 2 ) * 32,
                ( map[ licznik_y + mapaY ][ licznik_x + mapaX ] / 2 ) * 32,
                licznik_x * 32, licznik_y * 32, 32, 32 );
            }
           
           
        }
       
        while( SpeedStatku > 0 )
        {
            if( key[ KEY_UP ] ) statek.y--;
           
            if( key[ KEY_DOWN ] ) statek.y++;
           
            if( key[ KEY_LEFT ] ) statek.x--;
           
            if( key[ KEY_RIGHT ] ) statek.x++;
           
            SpeedStatku--;
        }
        if( statek.y <= 0 ) statek.y = 0;
       
        if( statek.y >= Y - BstatekGracza->h ) statek.y = Y - BstatekGracza->h;
       
        if( statek.x <= 0 ) statek.x = 0;
       
        if( statek.x >= X - BstatekGracza->w ) statek.x = X - BstatekGracza->w;
       
        while( SpeedSrollowaniaMapy > 0 )
        {
            if( key[ KEY_D ] ) mapaX++;
           
            if( key[ KEY_A ] ) mapaX--;
           
            SpeedSrollowaniaMapy--;
        }
       
        if( mapaX > 19 ) mapaX = 19;
       
        if( mapaX < 0 ) mapaX = 0;
       
       
        while( TimerCooldown > 0 )
        {
            zm++;
            if( zm >= 200 ) zm = 0;
           
            TimerCooldown--;
        }
       
        if( key[ KEY_SPACE ] )
        {
            strzal = true;
        }
        if( strzal == true )
        {
            if( zm >= 99 && zm <= 101 )
            {
                pocisk.push_back( Cpocisk( statek.x, statek.y, true, 0, statek.y ) );
                strzal = false;
            }
        }
        for( int i = 0; i <= int( pocisk.size() ); i++ )
        {
            if( pocisk[ i ].boom == true )
            {
                masked_blit( BstatekGracza, bufor, 0, 0, pocisk[ i ].x, pocisk[ i ].y, Bshot->w, Bshot->h );
            }
            if( int( pocisk.size() ) >= 30 )
            {
                if( pocisk[ i ].x >= X ) pocisk.erase( pocisk.begin() + i - 1 );
               
            }
        }
       
       
        while( SpeedPocisku > 0 )
        {
            for( int i = 0; i <= int( pocisk.size() ); i++ )
            {
                if( pocisk[ i ].boom == true )
                {
                    pocisk[ i ].dx += v;
                    pocisk[ i ].dx += v;
                    if( pocisk[ i ].dx >= 1 || pocisk[ i ].dx <= - 1 )
                    {
                        pocisk[ i ].x += int( pocisk[ i ].dx ); pocisk[ i ].dx = pocisk[ i ].dx - int( pocisk[ i ].dx );
                    }
                }
            }
            SpeedPocisku--;
        }
       
       
        masked_blit( BstatekGracza, bufor, 0, 0, statek.x, statek.y, BstatekGracza->w, BstatekGracza->h );
       
        textprintf_ex( bufor, font, 10, 10, - 1, 255, "fps: %i", fps );
        blit( bufor, screen, 0, 0, 0, 0, X, Y );
    }
   
    destroy_bitmap( bufor );
   
    deinit();
    return 0;
}
END_OF_MAIN()

void init()
{
    int depth, res;
    allegro_init();
    depth = desktop_color_depth();
    if( depth == 0 ) depth = 32;
   
    set_color_depth( depth );
    res = set_gfx_mode( GFX_AUTODETECT, X, Y, 0, 0 );
    if( res != 0 ) {
        allegro_message( allegro_error );
        exit( - 1 );
    }
   
    install_timer();
    install_keyboard();
    install_mouse();
    install_int_ex( FramesPerSecond, BPS_TO_TIMER( 1 ) );
    install_int_ex( increment_SpeedStatku, BPS_TO_TIMER( 500 ) );
    install_int_ex( increment_TimerCooldown, BPS_TO_TIMER( 1000 ) );
    install_int_ex( increment_SpeedSrollowaniaMapy, BPS_TO_TIMER( 50 ) );
    install_int_ex( increment_SpeedPocisku, BPS_TO_TIMER( 1000 ) );
}

void deinit()
{
    clear_keybuf();
    allegro_exit();
}

Fakt, kod może jest trochę niepoprawnie napisany, i muli procesor, ale optymalizacja zajmę się jak już poskładam to co chce mieć =)

Kłopot w tym ze, wyświetlana mapa jest trochę jakby kopnięta, im niżej ma wyświetlać tym bardziej ja przesuwa w prawo. Proszę o pomoc, mecze sie nad tym od wczorajszego wieczora.
P-16664
lenrokskate
» 2010-05-06 21:01:24
możesz masz rozmiary kafli zjebane
P-16665
Saiph
Temat założony przez niniejszego użytkownika
» 2010-05-06 21:06:31
Zdaje mi się ze wymiary są akurat dobre, sam zobacz, mapa jest wyświetlana  ale im Y jest większe tym początek malowania X się zwiększa.
P-16667
DejaVu
» 2010-05-06 22:32:18
Jeśli masz problem z wyświetlaniem mapy to szukaj w kodzie, który wyświetla mapę, tj.
C/C++
for( licznik_x = 0; licznik_x < 21; licznik_x++ )
{
    for( licznik_y = 0; licznik_y < 16; licznik_y++ )
    {
        blit( Bmapa, bufor,
        ( map[ licznik_y + mapaY ][ licznik_x + mapaX ] % 2 ) * 32,
        ( map[ licznik_y + mapaY ][ licznik_x + mapaX ] / 2 ) * 32,
        licznik_x * 32, licznik_y * 32, 32, 32 );
    }
   
   
}
Reszta kodu jest de'facto zbędna. Dodam, że skoro używałeś mapy z kursu to może warto go przeczytać dokładniej i jeszcze raz.
http://www.easykoder.vot.pl/arty/wyswietlanie_mapy.

/edit:
A to, że Ci się coś wydaje... to skoro coś Ci się wydaje to znaczy, że nie jest pewne, a więc może być przyczyną i sprawdź ją skoro mówi Ci to ktoś kogo prosisz o pomoc.
P-16671
Saiph
Temat założony przez niniejszego użytkownika
» 2010-05-07 14:43:59
No wiem ze tam jest funkcja wyświetlająca mapę. Tamten artykuł przeczytałem bardzo uważnie i wielokrotnie sprawdzałem ze go moim problemem. Dałem cały kod, ponieważ ta moja funkcja dokładnie bazuje na tej z tamtego artykułu (zmienione były tylko zmienne i wymiary klocka, i jak bym tej funkcji nie przerobił, zawsze nie mogę trafić na to co potrzebuje), a nie daje to efektu. Mógłby mi ktoś w tym pomoc, albo dać jaka dokładniejszą  wskazówkę? Naprawdę ja już nie mam żadnych pomysłów jakby można zrobić z tego co potrzebuje.
P-16678
DejaVu
» 2010-05-07 15:28:18
Wykomentuj cały kod poza tym co renderuje mapę i ją przesuwa. Powinieneś wtedy dojść do sytuacji w której będziesz miał max 13 linijek w pętli głównej. Jednak jeśli mapa się wyświetla źle bez żadnej interakcji to znaczy, że masz zły algorytm lub dane. Użytkownicy Ci sugerują, że masz złe dane, a Ty masz to koncertowo w głębokim poważaniu, więc o czym my tu mamy dyskutować?
/edit:
Ile tu jest cyfr?
0,0,1,1,1,0,1,0,0,1,0,1,1,0,0,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
P-16680
lenrokskate
» 2010-05-07 15:31:00
<SORRY> pomylilo mi sie
P-16681
Saiph
Temat założony przez niniejszego użytkownika
» 2010-05-07 16:17:40
No i udało się ;) dziękuje
P-16691
« 1 »
  Strona 1 z 1