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

Allegro C++ Poruszanie się postacią w stronę myszy

Ostatnio zmodyfikowano 2010-05-08 17:52
Autor Wiadomość
Neomex0
Temat założony przez niniejszego użytkownika
Allegro C++ Poruszanie się postacią w stronę myszy
» 2010-05-06 16:21:32
Witam,
Zrobiłem, aby postać obracała się w kierunku myszy, jednak nie wiem jak ją przesunąć.
C/C++
if( key[ KEY_W ] )
{
    player.x += cos( player.angle ) * 5;
    player.y += sin( player.angle ) * 5;
}
Powyższe rozwiązanie przesuwa gracza DO OKOŁA punktu, a ja chcę żeby on się przemieszczał DO punktu położenia myszy.

Za wszelką pomoc będę wdzięczny :)
P-16649
szyx_yankez
» 2010-05-06 16:27:15
C/C++
if( player.x > mouse_x ) player.x--;

if( player.x < mouse_x ) player.x++;

if( player.y > mouse_y ) player.y--;

if( player.y < mouse_y ) player.y++;

P-16650
Neomex0
Temat założony przez niniejszego użytkownika
» 2010-05-06 16:32:31
Nie można zrobić, żeby szedł dokładnie na skos, dokładnie w wyznaczony punkt?
Jeśli potem zrobię strzelanie, to pocisk lecący w ten sposób będzie trochę... dziwny :)
P-16651
szyx_yankez
» 2010-05-06 19:38:05
Czasami słowa jest mi łatwiej wyrazi za pomocą kodu, toteż napisałem dla Ciebie przykładową aplikację, skompiluj(nie trzeba żadnych bitmap ani nic).
C/C++
#include <allegro.h>

int main()
{
   
    allegro_init();
    install_keyboard();
    install_mouse();
    scare_mouse();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1024, 768, 0, 0 );
   
    BITMAP * bufor = NULL;
    BITMAP * src = NULL;
   
    bufor = create_bitmap( 1024, 768 );
    src = create_bitmap( 20, 20 );
   
    clear_to_color( src, makecol( 0, 255, 0 ) );
   
    int x( 333 ), y( 333 );
    double xx( x ), yy( y ), aa( x ), bb( y ); //niefortunne nazwy zmiennych
   
    while( !keypressed() )
    {
        clear( bufor );
       
       
        xx = x - mouse_x;
        yy = y - mouse_y;
       
       
        //trzeba podzielic aby było widać rych a nie obrazek jako kursor
        xx = xx / 200;
        yy = yy / 200;
       
        //przyspieszamy
        aa -= xx;
        bb -= yy;
       
        if( aa > x ) x++;
       
        if( aa < x ) x--;
       
        if( bb > y ) y++;
       
        if( bb < y ) y--;
       
        if( aa > 0 )
             aa += xx / 2;
       
        if( bb > 0 )
             bb += yy / 2;
        //hamować trzeba zacząć wcześniej
        if( aa < 0 )
             aa -= xx / 2;
       
        if( bb < 0 )
             bb -= yy / 2;
       
       
        blit( src, bufor, 0, 0, x -( src->w / 2 ), y -( src->h / 2 ), src->w, src->h );
        show_mouse( bufor );
        blit( bufor, screen, 0, 0, 0, 0, 1024, 768 );
    }
   
    return false;
}
END_OF_MAIN();
P-16663
ison
» 2010-05-07 15:28:04
@szyx_yankez twoje rozwiązanie jest bardzo łopatologiczne i nie działa perfekcyjnie...
co do problemu autora to musisz zwyczajnie na bieżąco liczyć kąt utworzony między myszką a graczem. Żeby postać poruszyła się w danym kierunku to do osi x dodajesz cos z kąta a y sin (pamiętaj o zamianie stopni na radiany).
Jeśli ci nie wychodzi takie rozwiązanie to znaczy że źle liczysz kąt.

Jeśli bardzo chcesz to mogę gdzieś znaleźć moją starą funkcję którą wykorzystywałem w grach 2D. W argumentach przyjmowała pozycję obiektu 1 i pozycję obiektu 2 i zwracała wartość o jaką ma się przesunąć obiekt 1 żeby pójść w kierunku obiektu 2.
P-16679
DejaVu
» 2010-05-07 15:43:54
Kiedyś jak miałem więcej cierpliwości do Was dałem odpowiedź następującą na podobne pytanie: http://forum.ddt.pl/?Tid=156. Moja cierpliwość się kończy widząc Wasze skrajne lenistwo do używania wyszukiwarek. Powyższe rozwiązanie jest niepełne - musisz je sobie uzupełnić o obliczenie kąta pomiędzy obiektem, a myszką - ale to już masz więc myślę, że temat można uznać z miejsca za rozwiązany.
P-16683
dmx81
» 2010-05-08 12:50:32
zaczalem pisac, ale widze, ze dokladnie to samo pan Piotr napisal w zalaczonym linku - wiec to musi wystarczyc, daj znac, czy rozwiazales swoj problem.pamietaj, ze liczysz kat pomiedzy "wirtualna" linia mysz(x,y) a postac(x,y), cos liczysz dla przesuniecia po osi x, sin dla y
P-16701
Neomex0
Temat założony przez niniejszego użytkownika
» 2010-05-08 16:12:37
Też mieliście wszyscy racje, ale tutaj podsuneli mi idealne rozwiązanie:
http://www.allegro.cc/forums/thread/603985

@Piotr

Czytałem dużo wcześniej tamten post, ale nie mogłem czemuś dać sobie rady tą metodą.
Poza tym nie bulwersuj się jak padnie po raz milionowy to samo pytanie, ponieważ nie wszyscy piszą na forum od razu w momencie napotkania błędu i wbrew pozorom nie jest tak łatwo znaleźć odpowiedź, jeśli nie wie się gdzie jej szukać. :)
P-16706
« 1 » 2
  Strona 1 z 2 Następna strona