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. |
|
malan |
» 2009-05-31 21:08:04 Podobny temat jest już na forum: http://forum.ddt.pl/?Tid=1017. Masz tam taką pętlę: for( int i = 0; i < 90; i++ ) { 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.: for( int i = 0; i < 90; i++ ) { enemy_y++; WyswietlLudzika( enemy_x, enemy_y ); } |
|
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. |
|
driver1995 |
» 2009-05-31 22:02:47 Co do strzału to: roznica_x = mouse_x - ludzik_x; roznica_y = mouse_y - ludzik_y;
szybkosc = 100 roznica_x /= szybkosc; roznica_y /= szybkosc;
pocisk_x += roznica_x;
pocisk_y += roznica_y;
|
|
Proxym |
» 2009-05-31 22:08:46 Trygonometria się kłania. |
|
DejaVu |
» 2009-05-31 22:09:27 |
|
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 |
|
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. 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; 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 ) { 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 ) ); } if( deltaY >= 0 ) { kat += M_PI; } } 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; 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; 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();
|
|
« 1 » 2 |