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

[Allegro] strzał w strony myszy

Ostatnio zmodyfikowano 2009-06-01 22:20
Autor Wiadomość
Camper
Temat założony przez niniejszego użytkownika
[Allegro] strzał w strony myszy
» 2009-05-31 20:55:26
Powiem wprost, nie potrafię zrobić tak aby strzal LECIAŁ w strone położenia myszki w momencie strzału.
Mnie wychodzi tak że strzał po prostu się tam teleportuje... nie potrafię zrobić tak aby leciał do celu.
P-7328
malan
» 2009-05-31 21:08:04
Podobny temat jest już na forum: http://forum.ddt.pl/?Tid=1017.

Masz tam taką pętlę:
C/C++
for( int i = 0; i < 90; i++ )
{ enemy_y++; }
/*pewnie potem masz coś w stylu: WyswietlLudzika(enemy_x,enemy_y)*/
Jak już napisał Pan Piotr to jest równoznaczne z zapisem:
y+=100;
Może spróbuj zrobić 'Wyświetlanie' tego ludzika/pocisku w pętli, czyli np.:
C/C++
for( int i = 0; i < 90; i++ )
{
    enemy_y++;
    //poczekaj np. 0.5 sekundy żeby wyglądało tak jakby pocisk leciał...
    WyswietlLudzika( enemy_x, enemy_y );
}
P-7329
Camper
Temat założony przez niniejszego użytkownika
» 2009-05-31 21:20:26
Inaczej, potrzebuje wiedzieć co w programie odpowiada za kierunek, tzn. jak mam zrobić tak żeby strzał leciał w kierunku myszki, i ludzik obracał się w kierunek myszki.
P-7330
driver1995
» 2009-05-31 22:02:47
Co do strzału to:
C/C++
roznica_x = mouse_x - ludzik_x;
roznica_y = mouse_y - ludzik_y;
//jeśli mouse jest mniejsze niż ludzik to wyjdzie liczba minusowa...
szybkosc = 100 //czyli w 100 klatkach będzie leciał pocisk...
roznica_x /= szybkosc;
roznica_y /= szybkosc;

pocisk_x += roznica_x; //}
//}dodajesz pozycje pocisku (jesli myszka będzie za ludzikiem do dzięki liczbie minusowej, która by wyszła wcześniej wszystko będzie ok...
pocisk_y += roznica_y; //}
//Nie wiem czy to będzie działać i czy w ogóle kod jest poprawny, bo nie sprawdzałem, ale to było pierwsze co mi przyszło na myśl...
P-7332
Proxym
» 2009-05-31 22:08:46
Trygonometria się kłania.
P-7334
DejaVu
» 2009-05-31 22:09:27
Dokładnie to co chcesz już rozwiązałem komuś wcześniej.
http://archiwum.ddt.pl/?GroupId=7806
P-7335
driver1995
» 2009-05-31 22:48:39
Ale moje też działa... Tylko, że zależy w jakiej odległości się kliknie od ludzika tym szybciej lub wolniej :P:P:P:P:P
P-7336
Camper
Temat założony przez niniejszego użytkownika
» 2009-06-01 00:04:47
Staram się skorzystać z twojego kodu Piotrku jednak aby go stosownie zmodyfikować muszę go zrozumieć co jest dla mnie trudne.
Mianowicie teraz jak klikniesz to strzał leci do myszki (dobrze) ale zaraz jak klikniesz gdzie indziej to ten sam strzał zmienia kierunek i leci do nowego położenia myszy (źle) i tak w kółko.
Poza tym strzał wyświetla się w wybranym miejscu , a powinien pojawić się na x i y postaci dopiero po naciśnięciu lpm.
Chciałem ustawić flagi żeby oddzielić strzał od siebie (tj. żeby nie latał w kółko) ale nie bardzo wiem gdzie. Myślę że w pierwszym if (cos == false) powinno być if (nacisniety lpm) ustaw strzał na miejscu statku i ustaw cos = true
a w drugim if cos == true to modyfikuj współrzędne aż osiągnie cel.
Jednak nie działa...
Kompilator: Default compiler
Building Makefile: "F:\Projekty\tarat\Makefile.win"
Wykonywanie  make...
make.exe -f "F:\Projekty\tarat\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"F:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"F:/Dev-Cpp/include/c++/3.4.2/backward"  -I"F:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"F:/Dev-Cpp/include/c++/3.4.2"  -I"F:/Dev-Cpp/include"  -DALLEGRO_STATICLINK

main.cpp: In function `int _mangled_main()':
main.cpp:69: warning: converting to `int' from `double'
main.cpp:69: warning: converting to `int' from `double'

main.cpp:116: error: expected `;' before ')' token
main.cpp:141: error: a function-definition is not allowed here before '{' token
main.cpp:141: error: expected `,' or `;' before '{' token

main.cpp:141: error: expected `}' at end of input

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

Wykonanie zakończone

Po drugie chciałem też aby strzał nie wyświetlał się po środku ekranu a po naciśnięciu lpm w miejscu statku jednak do tego musiałbym wrzucić to do pętli a z tym połączone jest jeszcze celx i cely.


Dlatego proszę abyś wytłumaczył przynajmniej niektóre fragmenty pętli.



C/C++
int mx = 0, my = 0, mb = 0;


void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 1000 ) );
   
    install_mouse();
    show_mouse( screen );
    unscare_mouse();
    BITMAP * bufor = NULL;
    BITMAP * player1 = NULL;
    SAMPLE * dzwiek = NULL;
    BITMAP * x = NULL;
    bufor = create_bitmap( 800, 600 );
    x = load_bmp( "strzal.bmp", default_palette );
    dzwiek = load_sample( "dzwiek.wav" );
    player1 = load_bmp( "ludyik1.bmp", default_palette );
    int player1_x = 400, player1_y = 300, player1_s = 50, player1_w = 50, player1_hp = 100;
    bool strzalv = false;
    double predkosc = 0.5;
    double kat;
    double ix = player1_x, iy = player1_y; //to by musialo byc w petli zeby pobieralo atualne polozenie statku
    int celx = ix, cely = iy;
    double deltaX, deltaY;
    while( !key[ KEY_ESC ] )
    {
       
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        myszka();
        masked_blit( x, bufor, 0, 0,( int ) ix,( int ) iy, 200, 200 );
       
       
       
       
        textprintf_ex( bufor, font, 40, 40, makecol( 200, 200, 200 ), - 1, "deltaX = %d, deltaY = %d !",( int ) iy - cely,( int ) ix - celx );
        while( speed > 0 )
        {
            if( strzalv == false ) { //to podzielilem tak jak uwazalem ale nie dziala
                if( mb == 1 )
                {
                    celx = mx;
                    cely = my;
                    deltaX = ix - celx;
                    deltaY = iy - cely;
                    strzalv = true;
                }
                if( strzalv == true ) {
                    if(( deltaY ) == 0 )
                    {
                        kat = 0;
                    } else
                    {
                        kat = atan(( deltaX ) /( deltaY ) ); //nie wiem co to do konca oznacza
                    } //else
                   
                    if( deltaY >= 0 )
                    {
                        kat += M_PI; //nie wiem co to do konca oznacza
                    } //if
                   
                }
               
               
                if( iy != cely || ix != celx )
                {
                    ix += sin( kat ) * predkosc;
                    iy += cos( kat ) * predkosc;
                } }
            if( iy <- 20 ) { strzalv = false );
               
               
                speed--;
               
               
            }
            if( key[ KEY_LEFT ] ) player1_x = player1_x - 2; //sterowanie
           
            if( key[ KEY_RIGHT ] ) player1_x = player1_x + 2;
           
            if( key[ KEY_UP ] ) player1_y = player1_y - 2;
           
            if( key[ KEY_DOWN ] ) player1_y = player1_y + 2;
            // textprintf_ex(bufor,font,20,20,makecol(200,200,200),-1,"Myszka x = %d, y = %d, klawisz = %d !", mx,my,mb);
            masked_blit( x, bufor, 0, 0,( int ) ix,( int ) iy, 200, 200 );
            draw_sprite( bufor, player1, player1_x, player1_y );
            blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
            clear_keybuf();
        }
       
        destroy_bitmap( bufor );
        allegro_exit();
        return 0;
       
       
       
    }
    END_OF_MAIN();
P-7340
« 1 » 2
  Strona 1 z 2 Następna strona