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

Wychodzenie poza ekran

Ostatnio zmodyfikowano 2012-02-06 16:53
Autor Wiadomość
wiktor16s
Temat założony przez niniejszego użytkownika
Wychodzenie poza ekran
» 2012-02-05 23:21:24
Witam.
Mam problem, który polega na wychodzeniu mojego pojazdu poza ekran. ktoś może pomóc?


C/C++
#include <allegro.h>
#include <cmath>


// Inicjowanie timera
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
//tablice z wartościami sinusów i cosinusów

double tab_sin[ 72 ];
double tab_cos[ 72 ];

void laduj_sin_cos()
{
    for( int i = 0; i < 72; i++ )
    {
        tab_sin[ i ] = sin(( M_PI *( i * 5 ) ) / 180 );
        tab_cos[ i ] = cos(( M_PI *( i * 5 ) ) / 180 );
    }
}



// Zmienne potrzebne do mapy
int mapa_x = 0, mapa_y = 0;
BITMAP * teren = NULL;
BITMAP * bufor = NULL;
BITMAP * samochod = NULL;
BITMAP * tlo = NULL;


// DEFINICJA MAPY
short int map[ 15 ][ 20 ] =
{
    3, 3, 3, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 3, 3,
    3, 3, 3, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 8, 3, 3,
   
    3, 3, 3, 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 7, 9, 9, 9, 9, 9, 9, 9, 4, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 10, 10, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 6, 9, 9, 9, 9, 9, 9, 9, 5, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 8, 3, 3,
    3, 3, 3, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 8, 3, 3,
    3, 3, 3, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 3, 3
};

// 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 < 15; 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()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 40 ) );
   
   
   
    //Wszystkie zmienne potrzebne do sterowania naszym samochodem:
    int x = 200, y = 200; // pozycja samochodu na ekranie
    double dx = 0, dy = 0; // przesuniêcie samochodu po osi X i Y
    int kierunek = 0; // aktualny kierunek samochodu
    double v = 0; // prêdkoœæ naszego samochodu
   
    laduj_sin_cos();
   
   
    samochod = load_bmp( "samochod.bmp", default_palette );
    if( !samochod ) {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogê za³adowaæ obrazka Samochod !" );
        allegro_exit();
        return 0;
    }
   
   
    tlo = load_bmp( "tlo.bmp", default_palette );
    if( !samochod ) {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogê za³adowaæ tla !" );
        allegro_exit();
        return 0;
    }
   
   
    // Tworzenie bufora
    bufor = create_bitmap( 800, 600 );
    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 );
   
    int samochod_x = 100, samochod_y = 100;
   
   
   
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
           
            //prowadzenie pojazdu
            if( key[ KEY_LEFT ] ) kierunek--;
           
            if( key[ KEY_RIGHT ] ) kierunek++;
           
            if( key[ KEY_UP ] ) v += 0.02;
           
            if( key[ KEY_DOWN ] ) v -= 0.02;
           
            if( key[ KEY_SPACE ] ) v = 0;
           
            speed--;
        }
       
       
        // Sprawdzamy wszystkie ograniczenia:
        if( kierunek > 71 ) kierunek = 0;
       
        if( kierunek < 0 ) kierunek = 71;
       
        if( v > 0.4 ) v = 0.4;
       
        if( v <- 0.2 ) v =- 0.2;
       
        // Obliczanie prędkości cząstkowych:
        dx += v * tab_cos[ kierunek ];
        dy += v * tab_sin[ kierunek ];
        // Przemieszczanie naszego samochodu:
        if( dx >= 1 || dx <= - 1 ) { x += int( dx ); dx = dx - int( dx ); }
        if( dy >= 1 || dy <= - 1 ) { y += int( dy ); dy = dy - int( dy ); }
       
       
        // wyœwietlanie naszego samochodu:
        masked_blit( samochod, bufor,( kierunek % 18 ) * 30,( kierunek / 18 ) * 30, x, y, 30, 30 );
       
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
       
       
       
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        // Wyœwietlanie mapy
        wys_mape();
       
       
       
       
    }
   
   
   
   
    // Usuwanie wszystkiego z pamiêci.
    remove_int( increment_speed );
    destroy_bitmap( teren );
    destroy_bitmap( bufor );
    destroy_bitmap( samochod );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-50179
draculeq
» 2012-02-05 23:33:57
To naprawde nie jest problem...
Sam musisz analizować "swój" program i szukać w nim błędów bo jak na początku każdy może za ciebie zrobić to potem nikt nie będzie czytał 500 linijek żeby ci pomóc.
Zwroc uwage na to gdzie wyswietla samochodzik i co trzeba zrobić żeby go tam nie wyświetlało
P-50181
wiktor16s
Temat założony przez niniejszego użytkownika
» 2012-02-05 23:39:25
Nie jestem zbytnio zaawansowany w c++ i w allegro.
Więc pytanie może wydawać się troszke głupie.
mam to zrobić na jakąś kolizje? chodzi mi o to że jeśli auto wjeżcza na coś to v=0 ?
czy może jeśli auto jest na x= 800, to v=0
                            y= 600, to v=0
?
Naprawde prosze o pomoc.
P-50182
DejaVu
» 2012-02-05 23:44:59
Frazy, które należy wpisać w wyszukiwarkę google:
P-50183
wiktor16s
Temat założony przez niniejszego użytkownika
» 2012-02-06 11:54:11
Kurde nie wiem.
Próbowałem chyba wszystkiego i nie działa.

próbowałem:
C/C++
int x = 200, y = 200;
double dx = 0, dy = 0;
int kierunek = 0;
double v = 0;



bool kolizja( void )
{
    if( x < 600 )
         return true;
   
    if( x > 0 )
         return false;
   
    if( y > 0 )
         return false;
   
    if( y > 800 )
         return false;
   
}
//...
//...
//...
//...

if( samochod_x < 600 ) v = 0;

if( samochod_x > 0 ) v = 0;

if( samochod_y < 800 ) v = 0;

if( samochod_y > 0 ) v = 0;
i nie działa


próbowałem również z jednego kursu easykodera:
C/C++
if(( key[ KEY_W ] ) &&( bomba_y > 40 ) ) { bomba_y -= 5; } else
if(( key[ KEY_S ] ) &&( bomba_y < 600 ) ) { bomba_y += 5; }
if(( key[ KEY_A ] ) &&( bomba_x > 20 ) ) { bomba_x -= 5; } else
if(( key[ KEY_D ] ) &&( bomba_x < 780 ) ) { bomba_x += 5; }
if(( key[ KEY_Z ] ) &&( bomba_zasieg > 10 ) ) { bomba_zasieg -= 5; }
if(( key[ KEY_X ] ) &&( bomba_zasieg < 200 ) ) { bomba_zasieg += 5; }
to działa ale nie umiem tego przenieść na mój kod :(
P-50189
ison
» 2012-02-06 12:26:13
C/C++
if( samochod_x < 600 ) v = 0;

if( samochod_x > 0 ) v = 0;

if( samochod_y < 800 ) v = 0;

if( samochod_y > 0 ) v = 0;

masz odwrócone znaki
P-50190
wiktor16s
Temat założony przez niniejszego użytkownika
» 2012-02-06 13:48:54
Dobra koledzy udało mi sie
ale rozwiązanie jednego problemu spowodowało drugi

mam coś takiego
C/C++
if( sx > 780 ) v = 0;

if( sx < 0 ) v = 0;

if( sy < 0 ) v = 0;

if( sy > 575 ) v = 0;
to jest upragniona kolizja z ekranem ;P

ale teraz auto zatrzymuje się na stałe i nie rusza

jaka diagnoza?
P-50191
imralav
» 2012-02-06 15:54:01
Bo jak już wjedzie w granicę ekranu to cały czas v się aktualizuje do zera. Ja bym zrobił przy sterowaniu sprawdzanie, czy już nie jest na granicy, np. jeżeli wcisnę strzałkę w prawo i nie jestem na prawej granicy ekranu to porusz w prawo, analogicznie dla każdego kierunku.
P-50193
« 1 » 2
  Strona 1 z 2 Następna strona