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

Rotacje cz2

Ostatnio zmodyfikowano 2011-05-08 12:21
Autor Wiadomość
aimo1
Temat założony przez niniejszego użytkownika
» 2011-05-04 19:41:57
właśnie na tym polega problem
nie wiem jak
animacja ma działac przesuwając po np 1 kącie aż  kont nie dojdzie do określonego kątu wtedy ma się  zatrzymac

(to cpp przed kodem coś nie działa)
oto muj kod jaki miałem ostatnio
#include <allegro.h>//int game()
volatile long speed=0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION(increment_speed);
LOCK_VARIABLE(speed);
LOCK_FUNCTION(increment_speed);
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
    clear_to_color(screen,makecol(128,128,128));
    double zw;
    double tw;
    double ch;
    int menu=0;
    int tura=0;
    int animacja=0;
    int odl=200;
    int kont=0;
    char hpa=100;
    char hpm=200;
    int enm=400;
    int ena=200;
    int lvl = 1;
    int klasa=1;
    int tim=200;
    int tuwx=300;
    int tuwy=350;
    int tuwk=0;
    int glok=0;
    double ramx=tuwx-5;
    double ramy=tuwy+20;
    double ramk=0;
    double Ramx=tuwx+80-10;
    double Ramy=tuwy+20;
    double Ramk=0;
    double dlox=ramx+77;
    double dloy=ramy+45;
    double dlok=0;
    double Dlox=Ramx-78;
    double Dloy=Ramy+45;
    double Dlok=0;
    int udx=tuwx+10;
    int udy=tuwy+90;
    int udk=0;
    int Udx=tuwx+50;
    int Udy=tuwx+140;
    int Udk=0;
    int golx=udx;
    int goly=udy+45;
    int golk=0;
    int Golx=Udx;
    int Goly=Udy+45;
    int Golk=0;
    int stox=golx-5;
    int stoy=goly+15;
    int stok=0;
    int Stox=Golx-2;
    int Stoy=Goly+15;
    int Stok=0;
    double bronx=dlox;
    double brony=dloy-220;
    int bronk=10;
   
       
    install_timer();
    install_int_ex(increment_speed,BPS_TO_TIMER(tim));
   
   
    BITMAP*postac[16];
    BITMAP*podloga[5];
    BITMAP*bufor=NULL;
    BITMAP*sciana[5];
    BITMAP*hp=NULL;
    BITMAP*bufor2=NULL;
   
    postac[1]=load_bmp("postac1_1.bmp",default_palette);
    postac[2]=load_bmp("postac1_2.bmp",default_palette);
    postac[3]=load_bmp("postac1_3.bmp",default_palette);
    postac[4]=load_bmp("postac1_4.bmp",default_palette);
    postac[5]=load_bmp("postac1_5.bmp",default_palette);
    postac[6]=load_bmp("postac1_6.bmp",default_palette);
    postac[0]=load_bmp("postac11.bmp",default_palette);
    postac[7]=load_bmp("postac1_7.bmp",default_palette);
    postac[8]=load_bmp("postac1_8.bmp",default_palette);
    podloga[0]=load_bmp("scanaa.bmp",default_palette);
    bufor2=create_bitmap(800,600);
         
    while(!key[KEY_ESC])
    {
        if(key[KEY_2])//w tym miejscu się zatrzymałem
        {
            zw=Dlox;
            tw=Dloy;
            Dlox=zw;
            Dloy=tw;
            ch=64/64;
            ramk+=2;
            Dlok+=2;
            Dlox-=ch*ramk;
            Dloy-=ch*ramk;
        }
        clear_to_color(bufor2,makecol(150,150,150));
        masked_blit(podloga[0],bufor2,0,0,0,0,800,600);
        pivot_sprite(bufor2,postac[7],ramx,ramy,10,0,ftofix(ramk));
        pivot_sprite(bufor2,postac[7],Ramx,Ramy,10,0,ftofix(Ramk));
        pivot_sprite(bufor2,postac[8],dlox,dloy,10,0,ftofix(dlok));
        pivot_sprite(bufor2,postac[8],Dlox,Dloy,10,0,ftofix(Dlok));
        pivot_sprite(bufor2,postac[4],udx,udy,10,0,ftofix(udk));
        pivot_sprite(bufor2,postac[4],Udx,Udy,10,0,ftofix(Udk));
        pivot_sprite(bufor2,postac[6],stox,stoy,10,0,ftofix(stok));
        pivot_sprite(bufor2,postac[6],Stox,Stoy,10,0,ftofix(Stok));
        pivot_sprite( bufor2, postac[5], golx, goly, 10, 0, ftofix( golk ) );
        pivot_sprite( bufor2, postac[5], Golx, Goly, 10, 0, ftofix( Golk ) );
        pivot_sprite(bufor2,postac[2],tuwx,tuwy,10,0,ftofix(tuwk));
        pivot_sprite(bufor2,postac[3],tuwx+21,tuwy-55,10,0,ftofix(glok));
        pivot_sprite( bufor2,postac[1],bronx,brony,10,0, ftofix( bronk ) );
        blit(bufor2,screen,0,0,0,0,800,600);
        readkey();
    }
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-32636
Gabes
» 2011-05-04 20:22:59
Musisz określić wspólne pozycje pivot_sprite cx,cy na każdej bitmapie i zmieniać je o tą samą wielkość.

ręka = przedramie_dół -np. 0,50 i 50,0
przedramie_góra = ramie_dół..itd..

zmienij cx i cy dla każdego elementu przedramie i ramie będzie miało dwa stawy czyli 2 punkty wspólne raz cx,cy ramie_dół a raz cx,cy ramie_góra zależnie od potrzeby.
Proste to nie jest.
Lepiej wyświetlaj kolejne bitmapy z fazami ruchu.


P-32642
absflg
» 2011-05-04 21:12:48
Musisz znać współrzędne punktów, w których "sklejasz" dwa elementy. Nazwijmy to punktem sklejenia.
Odległość między punktem sklejenia i punktem wokół którego obracasz jest stała. Jeżeli to ci nie wystarcza to rozwinę:

Dowolny odcinek można zaprezentować jako długości boków prostokąta, których jest on przekątną:
ooo   |
   ooo|
------
Widzimy tu odcinek (oznaczony 'o') zaprezentowany jako boki prostokąta ('|' oraz '-'). (adminie! ratuj i daj znacznik tekstu o czcionce stałej szerokości!) Przyjmujemy lewy górny róg za [0,0]. Wartości x i y rosną idąc odpowiednio w dół i w prawo. Zaprezentowany odcinek jest więc odcinkiem |-6,+2| lub |+6,-2| (zależnie od tego, który koniec uznajesz na początek...)
Obliczasz sobie odległość od punktu obrotu do punktu sklejenia i sprawdzasz kąt między odległością a poziomem. Następnie dodajesz do tego kontu(kątu?) kąt, o który obracasz. Wyliczasz na tej podstawie nowe położenie punktu sklejenia.

Miłej trygonometrii życzę.
P-32663
aimo1
Temat założony przez niniejszego użytkownika
» 2011-05-05 15:39:29
a można by prosic jakiś prosty przykład?
szybciej zrozumiem :)
P-32686
absflg
» 2011-05-05 18:27:25
Obawiam się, że prościej się nie da... Ale jak chcesz przykład:

Ten +2,-6 z postu wyżej.
Zakładamy więc, że dolny prawy róg to punkt sklejenia. Ma on współrzędne [13,16] (w pikselach oczywiście). Na razie to zostawmy.

Zakładamy, że odcinek +0,+X (gdzie X jest dowolne dodatnie) to odcinek nachylony pod kątem 0stopni. Można to porównać do godziny 3 na zegarze, gdzie punkt sklejenia to koniec wskazówki, a środek obrotu to środek tarczy.

Potrzebna nam funkcja arcctg, czyli przeciwna do ctg. Liczymy to dla trójkąta z kątem prostym opartym na odległości od punktu sklejenia do środka obrotu:
W badanym odcinku stosunek stosunek długości przyprostokątnych wynosi 2 do 6 (pomijamy znaki +/-, o tym zaraz). Wyliczasz więc ten stosunek i liczysz sobie arcus cotangens żeby wyliczyć kąt. Będzie on podany w radianach. Przelicz je sobie na stopnie. Skoryguj to odpowiednio dodając wielokrotność 90stopni (rozpisz sobie o ile trzeba powiększyć kąt w zależności od kombinacji +/- w zapisie odcinku, zauważ, że kąt jest naliczany zgodnie z ruchem wskazówek zegara). W tym przypadku jest to 180stopni. (Narysuj sobie. 180stopni zgodnie z ruchem wskazówek zegara począwszy od 3. godziny.) Wyszły mi arcctg ok. 72stopnie, więc mamy całkowite 252stopnie.

Teraz obliczamy odległość punktu sklejenia od środka obrotu, ale to już twierdzenie Pitagorasa, więc pominę. Wyszło 6.32, tym razem jednak nic lepiej nie zaokrąglać w programie.

Dodajemy teraz do naszego kąta kąt o jaki obracasz. Na przykład 225stopni (liczone zgodnie z ruchem wskazówek zegara!). Wychodzi po sumowaniu 377stopni. Odrzucamy pełne koła. Zostaje 17stopni. Jest to kąt z wierzchołkiem w punkcie obrotu i ramion zawierających odpowiednio: już wcześniej tłuczoną 3 godzinę zegarową i nasz punkt sklejenia (rysuj, rysuj...). Mamy więc kąt.
Teraz opisujemy na odcinku od środka obrotu do punktu sklejenia (od teraz nazwa ta dotyczy jego nowego położenia po obrocie). Żeby wyciągnąć z tego nasz zapis odcinka (czyli notabene odległość w pionie i w poziomie od środka obrotu - więc będziemy prostym dodawaniem mogli z niego uzyskać współrzędne punktu sklejenia) należy 'stworzyć' sobie trójkąt prostokątny z przeciwprostokątną na tym odcinku. I tadam! Mamy przecież jego wszystkie kąty: jeden jest prosty, a drugi wynosi 17stopni. Mamy też jego przeciwprostokątną, bo to znana nam odległość punkt sklejenia- środek obrotu. Wyliczamy więc z funkcji dwa pozostałe boki i mamy nasz zapis odcinku. Jeszcze znaki! Przed liczeniem należało odjąć wielokrotność 90stopni od kąta (nasz tego nie wymagał). W zależności od ilości nadmiarowych 90-siątek należy ustawić w zapisie odcinka plusy i minusy tak samo jak poprzednio je usuwaliśmy dodając 90-siątki. Mamy nowe współrzędne punktu.

Pozdrawiam
absflg
P-32695
aimo1
Temat założony przez niniejszego użytkownika
» 2011-05-08 12:21:58
W sumie chodziło mi o jakiś wycinek programu z zastosowaniem tego, ale chyba dam rade z tym .
choc jak byś mógł to bum był bardzo wdzięczny.

jak będę miał jakieś pytania związane z tym to napiszę.
P-32839
1 « 2 »
Poprzednia strona Strona 2 z 2