[ C++, Allegro] Tworzenie toru ruchu obiektu
Ostatnio zmodyfikowano 2016-08-04 16:10
marianekA Temat założony przez niniejszego użytkownika |
[ C++, Allegro] Tworzenie toru ruchu obiektu » 2016-08-03 14:19:57 Chciałbym zrobić tor ruchu obiektu według ustalonego wzorca by był płynny i jednostajny. Zrobiłem to za pomocą myszki ale efekt jest niezadowalający bo myszki nie da się idealnie poprowadzić ręką (moją). Dla zobrazowania użyłem biblioteki Allegro bo tę jako-tako poznałem. Rysowanie toru z LMB, efekt LMB, restart PMB, wyjście Esc. Długość toru do 1000 punktów. #include <allegro5/allegro.h> #include <allegro5/allegro_primitives.h> #include <iostream> #include <fstream> using namespace std;
int main() { ALLEGRO_DISPLAY * okno = NULL; ALLEGRO_KEYBOARD_STATE klawisz; ALLEGRO_MOUSE_STATE myszka; al_init(); al_install_keyboard(); al_install_mouse(); al_init_primitives_addon(); okno = al_create_display( 800, 600 ); int max = 999; int tx[ max ], ty[ max ]; int p = 0, b = 0, c = 0; restart: for( int i = 0; i < max; ++i ) tx[ i ] = 0, ty[ i ] = 0; al_clear_to_color( al_map_rgb( 0, 40, 40 ) ); while( 1 ) { al_get_mouse_state( & myszka ); if( myszka.buttons == 1 ) { al_rest( 0.001 ); tx[ p ] = myszka.x; ty[ p ] = myszka.y; if( tx[ p ] + ty[ p ] != tx[ p - 1 ] + ty[ p - 1 ] ) ++p; al_draw_pixel( tx[ p ], ty[ p ], al_map_rgb( 220, 220, 220 ) ); } al_flip_display(); cout << p << endl; if(( myszka.buttons == 0 && p > 1 ) || p == max ) break; } while( !al_key_down( & klawisz, ALLEGRO_KEY_ESCAPE ) ) { al_get_keyboard_state( & klawisz ); al_get_mouse_state( & myszka ); al_clear_to_color( al_map_rgb( 20, 80, 80 ) ); if( myszka.buttons == 1 ) c = 1; if( c == 1 && b < p ) { for( int i = 0; i < p; ++i ) al_draw_pixel( tx[ i ], ty[ i ], al_map_rgb( 50, 250, 50 ) ); al_draw_filled_circle( tx[ b ], ty[ b ], 20, al_map_rgb( 222, 222, 222 ) ); al_rest( 0.01 ); ++b; } if( b == p ) c = 0, b = 0; al_flip_display(); if( myszka.buttons == 2 ) { p = 0, b = 0, c = 0; break; } } if( p == 0 ) goto restart; fstream plik; plik.open( "tor.txt", ios::out ); for( int i = 0; i <= p; ++i ) plik << tx[ i ] << " " << ty[ i ] << " "; plik.close(); return 0; al_destroy_display( okno ); }
Na razie nie mam lepszego pomysłu. Ręczne spisywanie współrzędnych punktów toru nie na moje nerwy. Wszelkie rady i pomysły mile widziane. |
|
Gabes |
» 2016-08-03 22:20:34 np. sinus lub cosinus z odpowiednimi wartościami s i sw.:) #include <allegro5/allegro.h> #include <allegro5/allegro_primitives.h> #include <cmath> int main() { al_init(); al_install_keyboard(); al_init_primitives_addon(); ALLEGRO_KEYBOARD_STATE klawiatura; ALLEGRO_DISPLAY * okno = al_create_display( 800, 600 ); float x = 0.0, y = 0.0; double s = 120.0, sw = 150; while( !al_key_down( & klawiatura, ALLEGRO_KEY_ESCAPE ) ) { al_get_keyboard_state( & klawiatura ); x = x + 1; s = s + 0.6; y = int( cos( s * M_PI / 360 ) * sw ); al_draw_pixel( x, y + 200, al_map_rgb( 200, 200, 0 ) ); al_flip_display(); } return 0; } |
|
marianekA Temat założony przez niniejszego użytkownika |
» 2016-08-04 16:10:19 Fajna zabawa z tą trygonometrią. W kilku odcinkach z różnymi ustawieniami zrobiłem takiego wywijasa. Obiekt po takim torze przesuwa się bez zastrzeżeń - o to mi chodziło. Dziękuję za naprowadzenie i przykład. Gabes, jesteś 'wielki' i zawsze pomocny. |
|
« 1 » |