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

[ C++, Allegro] Tworzenie toru ruchu obiektu

Ostatnio zmodyfikowano 2016-08-04 16:10
Autor Wiadomość
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.
 
C/C++
#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;
    // szykowanie toru
    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;
            // by nie powtarzać poprzedniego punktu
            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;
    // zapisanie danych toru do pliku
    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.
P-150536
Gabes
» 2016-08-03 22:20:34
np. sinus lub cosinus z odpowiednimi wartościami s i sw.:)
C/C++
#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;
}
P-150541
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.
obrazek
obrazek
 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.
P-150578
« 1 »
  Strona 1 z 1