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

[Allegro] Za szybkie scrollowanie mapy.

Ostatnio zmodyfikowano 2009-02-06 10:27
Autor Wiadomość
Ju1ian
Temat założony przez niniejszego użytkownika
» 2009-02-04 17:19:42
No zmieniłem na tryb rzeczywisty sposobem Pietrzucha i nie działało. Spróbowałem zaokrąglić funkcją round();, ale też nie działało. Nie wiem czemu.
P-4072
lynx
» 2009-02-04 17:32:15
Może robisz to za wcześnie lub za poźno? Podaj log i kod. Możesz jeszcze zamienić na tryb całkowity dzieleniem modulo. :)
P-4073
Ju1ian
Temat założony przez niniejszego użytkownika
» 2009-02-05 11:13:44
Mój kod po waszych doradach:
C/C++
// Includowanie
#include <allegro.h>

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

// Zmienne potrzebne do mapy
int mapa_x = 0, mapa_y = 0;
float mapa2_x = 0, mapa2_y = 0;

// Zmienne wspolrzednych bitmap
int ludek_x = 240, ludek_y = 160;
int hp_x = 520, hp_y = 70;
int eq_x = 520, eq_y = 110;
int zadanie_x = 60, zadanie_y = 40;
int tablica_x = 20, tablica_y = 20;

// Zmienne główne
int zycie = 100;

// Zmienne bitmap
BITMAP * zadanie = NULL;
BITMAP * ludek = NULL;
BITMAP * hp = NULL;
BITMAP * pelne_hp = NULL;
BITMAP * eq = NULL;
BITMAP * gui = NULL;
BITMAP * teren = NULL;
BITMAP * bufor = NULL;
BITMAP * tablica = NULL;

// DEFINICJA MAPY
short int map[ 18 ][ 30 ] =
{
    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, 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, 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, 0, 1, 1, 0, 1, 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, 1, 1, 1, 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, 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, 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, 0, 2, 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, 1, 0, 0, 0, 1, 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, 1, 1, 1, 1, 1, 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, 1, 1, 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, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 1, 1, 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, 0, 0, 1, 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, 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,
    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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
   
};

// Funkcja wyświetlająca mapę:
void wys_mape()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 20; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 13; 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 );
        }
    }
};

// Funkcja Główna
int main()
{
    // Inicjalizacja wszystkiego
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 40 ) );
   
    // Tworzenie bufora
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    // Ładowanie grafiki
    teren = load_bmp( "teren.bmp", default_palette );
    ludek = load_bmp( "ludek.bmp", default_palette );
    gui = load_bmp( "gui.bmp", default_palette );
    hp = load_bmp( "hp.bmp", default_palette );
    pelne_hp = load_bmp( "pelne_hp.bmp", default_palette );
    eq = load_bmp( "eq.bmp", default_palette );
    zadanie = load_bmp( "zadanie.bmp", default_palette );
    tablica = load_bmp( "tablica.bmp", default_palette );
   
    // Dopóki nie jest naciśnięty Escape
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            // SCROLLOWANIE MAPY Z KOLIZJĄ
            if( zycie > 0 ) {
                if(( key[ KEY_RIGHT ] ) &&( mapa2_x < 10 ) ) {
                    if((( map[ mapa2_y + 4 ][ mapa2_x + 1 + 6 ] ) == 0 ) ||(( map[ mapa2_y + 4 ][ mapa2_x + 1 + 6 ] ) == 2 ) ) {
                        mapa2_x = mapa2_x + 0.1;
                    }
                    else {
                        mapa2_x = mapa2_x;
                    }
                } else
                if(( key[ KEY_LEFT ] ) &&( mapa2_x > 0 ) ) {
                    if((( map[ mapa2_y + 4 ][ mapa2_x - 1 + 6 ] ) == 0 ) ||(( map[ mapa2_y + 4 ][ mapa2_x - 1 + 6 ] ) == 2 ) ) {
                        mapa2_x = mapa2_x - 0.1;
                    }
                    else {
                        mapa2_x = mapa2_x;
                    }
                } else
                if(( key[ KEY_DOWN ] ) &&( mapa2_y < 5 ) ) {
                    if((( map[ mapa2_y + 1 + 4 ][ mapa2_x + 6 ] ) == 0 ) ||(( map[ mapa2_y + 1 + 4 ][ mapa2_x + 6 ] ) == 2 ) ) {
                        mapa2_y = mapa2_y + 0.1;
                    }
                    else {
                        mapa2_y = mapa2_y;
                    }
                   
                } else
                if(( key[ KEY_UP ] ) &&( mapa2_y > 0 ) ) {
                    if((( map[ mapa2_y - 1 + 4 ][ mapa2_x + 6 ] ) == 0 ) ||(( map[ mapa2_y - 1 + 4 ][ mapa2_x + 6 ] ) == 2 ) ) {
                        mapa2_y = mapa2_y - 0.1;
                    }
                    else {
                        mapa2_y = mapa2_y;
                    }
                }
                mapa_x =( int ) mapa2_x;
                mapa_y =( int ) mapa2_y;
            }
            speed--;
        }
       
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        // Wyświetlanie mapy
        wys_mape();
       
        // Wyświetlanie bitmap
        masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
       
        // Zadanie z tablicy
        if( map[ mapa_y + 4 ][ mapa_x + 6 ] == 2 ) {
            blit( tablica, bufor, 0, 0, tablica_x, tablica_y, tablica->w, tablica->h );
            if( key[ KEY_P ] ) {
                masked_blit( zadanie, bufor, 0, 0, zadanie_x, zadanie_y, zadanie->w, zadanie->h );
            }
        }
       
        // Dalsze bitmapy
        masked_blit( gui, bufor, 0, 0, 0, 0, gui->w, gui->h );
        masked_blit( hp, bufor, 0, 0, hp_x, hp_y, hp->w, hp->h );
        masked_blit( eq, bufor, 0, 0, eq_x, eq_y, eq->w, eq->h );
        masked_blit( pelne_hp, bufor, 0, 0, hp_x, hp_y, zycie, pelne_hp->h );
       
        // Wyswietlamy tekst
        textprintf_ex( bufor, font, 510, 50, makecol( 255, 255, 255 ), - 1, "HP: %d / 100", zycie );
        if( zycie == 0 )
             textprintf_ex( bufor, font, 180, 180, makecol( 255, 255, 255 ), - 1, "Niestety nie zyjesz!" );
       
        // Wyswietlamy bufor
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
    // Usuwanie wszystkiego z pamięci.
    remove_int( increment_speed );
    destroy_bitmap( teren );
    destroy_bitmap( ludek );
    destroy_bitmap( gui );
    destroy_bitmap( hp );
    destroy_bitmap( bufor );
    destroy_bitmap( zadanie );
    allegro_exit();
    return 0;
}
// Koniec INT_MAIN
END_OF_MAIN();

A log kompilacji (uwaga to DEV C++, więc nie wiem czy dobrze wszystko loguje ;P)

Kompilator: Default compiler
Building Makefile: "C:\Documents and Settings\Frankie\Pulpit\Programy moje\Makefile.win"
Wykonywanie  make...
make.exe -f "C:\Documents and Settings\Frankie\Pulpit\Programy moje\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include"  

main.cpp: In function `int _mangled_main()':
main.cpp:118: error: invalid types `short int[18][30][float]' for array subscript
main.cpp:118: error: invalid types `short int[18][30][float]' for array subscript
main.cpp:126: error: invalid types `short int[18][30][float]' for array subscript
main.cpp:126: error: invalid types `short int[18][30][float]' for array subscript

main.cpp:134: error: invalid types `short int[18][30][float]' for array subscript
main.cpp:134: error: invalid types `short int[18][30][float]' for array subscript
main.cpp:143: error: invalid types `short int[18][30][float]' for array subscript
main.cpp:143: error: invalid types `short int[18][30][float]' for array subscript

make.exe: *** [main.o] Error 1

Wykonanie zakończone
P-4089
lynx
» 2009-02-05 11:45:30
Nie przekonwenterowałeś wszystkiego, np. tutaj:
C/C++
if((( map[ mapa2_y + 4 ][ mapa2_x + 1 + 6 ] ) == 0 ) ||(( map[ mapa2_y + 4 ][ mapa2_x + 1 + 6 ] ) == 2 ) ) {
    mapa2_x = mapa2_x + 0.1;
Zmienna mapa2_x jest typu float.
P-4090
DeBugger
» 2009-02-05 11:46:31
Nie mam czasu popatrzeć na kod, ale z loga wynika, że używasz floata w tablicy short int(niezgodność typów). Nie mam czasu tego przekompilować, ale spróbuj przerobić tablicę na float(jednak to też chyba nei pomoże, spróbować można).
P-4091
lynx
» 2009-02-05 11:49:37
Przekonwenterowanie tablicy na float nic nie da, gdyż on odnosi się do tablicy zmiennymi float, czyli:
C/C++
tablica[ 23.4 ][ 54.1 ]
A nie umieszcza w tablicy zmienną typu float.
P-4092
DeBugger
» 2009-02-05 11:51:14
Aha. Oto chodzi, bo nie by łem zbyt bardzo zorientowany w temacie. :D

BTW.
Ju1ian ,to tak jakbyś chciał podzielić coś, czego podzielić się nie da. :D
tablica[ 23.4 ][ 54.1 ]
P-4094
Ju1ian
Temat założony przez niniejszego użytkownika
» 2009-02-05 15:30:36
No wiem, tylko że mój ludek zasuwa jakby był wiewiórką pijącą kawę xD Narazie widze tylko 2 niezbyt dobre rady:
- zwiększyć kafelki,
- lub pokombinować timerem, ale to nie daje oczekiwanego rezultatu ;/
P-4102
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona