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

[Allegro] Kąty i obracanie postaci myszką

Ostatnio zmodyfikowano 2011-12-30 19:17
Autor Wiadomość
RazzorFlame
» 2011-12-29 20:03:52
Bodajze w kursie easykodera było coś podobnego. Aaa "sposób na samochodzik". Tam było jak wyliczyć kąty...

EDIT: A poruszenie się razem z myszką chyba umiesz zrobić ( miejmy taką nadzieje :) )
P-46637
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-30 15:26:42
C/C++
short int cwiartka;

if(( mouse_x < ludek_x ) &&( mouse_y < ludek_y ) ) // 1 CWIARTKA
{
    textout_ex( bufor, font, "Myszka jest na pierwszej cwiartce", 2, 2, makecol( 0, 0, 0 ), - 1 );
    cwiartka = 1;
}

if(( mouse_x >= ludek_x ) &&( mouse_y < ludek_y ) ) // 2 CWIARTKA
{
    textout_ex( bufor, font, "Myszka jest na drugiej cwiartce", 2, 2, makecol( 0, 0, 0 ), - 1 );
    cwiartka = 2;
}

if(( mouse_x >= ludek_x ) &&( mouse_y >= ludek_y ) ) // 3 CWIARTKA
{
    textout_ex( bufor, font, "Myszka jest na trzeciej cwiartce", 2, 2, makecol( 0, 0, 0 ), - 1 );
    cwiartka = 3;
}

if(( mouse_x < ludek_x ) &&( mouse_y >= ludek_y ) ) // 4 CWIARTKA
{
    textout_ex( bufor, font, "Myszka jest na czwartej cwiartce", 2, 2, makecol( 0, 0, 0 ), - 1 );
    cwiartka = 4;
}

int vertical;
int horizontal;
float kat;

switch( cwiartka )
{
case 1:
    vertical =( ludek_y - mouse_y );
    horizontal =( ludek_x - mouse_x );
   
    kat =( atan2( vertical, horizontal );
    textprintf_ex( bufor, font, 10, 10, makecol( 0, 0, 0 ), - 1, "Kąt myszki do pionu = %d", kat );
   
    break;
   
case 2:
    vertical =( ludek_y - mouse_y );
    horizontal =( mouse_x - ludek_x );
   
    kat = atan2( horizontal, vertical );
    textprintf_ex( bufor, font, 10, 10, makecol( 0, 0, 0 ), - 1, "Kąt myszki do pionu = %d", kat );
   
    break;
   
case 3:
    vertical =( mouse_y - ludek_y );
    horizontal =( mouse_x - ludek_x );
   
    kat = atan2( horizontal, vertical );
    textprintf_ex( bufor, font, 10, 10, makecol( 0, 0, 0 ), - 1, "Kąt myszki do pionu = %d", kat );
   
    break;
   
case 4:
    vertical =( mouse_y - ludek_y );
    horizontal =( ludek_x - mouse_x );
   
    kat = atan2( horizontal, vertical );
    textprintf_ex( bufor, font, 10, 10, makecol( 0, 0, 0 ), - 1, "Kąt myszki do pionu = %d", kat );
   
    break;
}
}


Mam coś takiego, ale przy wyświetlaniu wartości kąta wychodzą bezsensowne wartości. Wiem, że atan2 zwraca wartość w radianach i wiem też, że muszę uwzględnić to, na której ćwiartce liczę. Wie ktoś, co jest źle?
P-46681
ison
» 2011-12-30 16:05:42
C/C++
kat =( atan2( vertical, horizontal );
to Ci się kompiluje?

C/C++
textprintf_ex( bufor, font, 10, 10, makecol( 0, 0, 0 ), - 1, "Kąt myszki do pionu = %d", kat );
zmiennej typu float nie wypisuje się przez %d, wróć do podstaw ;)
P-46682
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-30 17:52:29
To się poprawi ;], najwyżej zaokrągliło do int. A to z tym dodatkowym nawiasem to mój błąd, oczywiście nie skompilowałem tego.

A możesz mi powiedzieć czemu vertical ma jakieś kosmiczne wartości, np. 1071395593? Poza tym ta zmienna za każdym poruszeniem myszki o pixel powiększa się o kilkaset. Zmienna horizontal ma normalne wartości, w stylu 24, 63.

Jest jeszcze jeden problem. Gdy poruszę myszką w poziomie, zmienia się właśnie vertical, te zmienne są odwrócone. Z czego to wynika?
P-46697
ison
» 2011-12-30 18:17:26
najwyżej zaokrągliło do int
nie, nie zaokrągliło, nie możesz floata wypisać przez %d bo wychodzą krzaczki
P-46701
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-30 19:17:30
A i tu racja. Zmieniłem na %f we właściwych miejscach i jest dobrze. Ale trzecia ćwiartka tego układu jakoś szwankuje i oblicza kąty w odwrotną stronę. To znaczy gdy mam układ, to obliczanie kątów odbywa się azymutalnie od górnej części osi y, czyli od drugiej ćwiartki układu. Gdy przesunę mysz bardziej poziomo, kąt się zwiększa. Gdy jednak dojdę do 90* i wejdę myszką na trzecią ćwiartkę, to mam nagle 180* i przy ruszeniu myszką kąt zmienia się wręcz odwrotnie, do 90* przy granicy z czwartą ćwiartką. Mam nadzieję, że dobrze to opisałem. Jak nietrudno się domyślić, pożądany efekt jest wręcz odwrotny.

EDIT:

Zrobione.
Wystarczyło zmienić kolejność argumentów w atan2 tylko w trzeciej ćwiartce ;]
P-46707
1 « 2 »
Poprzednia strona Strona 2 z 2