XNA i działania trygonometryczne

Odpowiedz Nowy wątek
2015-01-21 22:29
0

Witam!
Mam pytanko


        public float PobierzKat(Vector2 a, Vector2 b)
        {
            double dystans = PobierzDystans(a, b);
            double kat = Math.Acos((b.Y - a.Y) / dystans * Math.PI);
            float katFloat = (float)kat;
            if (b.Y < a.Y) katFloat = 360 - katFloat;
            return katFloat;
        }

public Vector2 PobierzSinusCosinus(Vector2 a, Vector2 b)
        {
            Vector2 c;
            float kat = PobierzKat(a, b);
            c.X = (float)Math.Sin(Math.PI * kat / 180.0);
            c.Y = (float)Math.Cos(Math.PI * kat / 180.0);
            return c;
        }

Gdy próbuję skompilować gierkę (nie jakąśtam wielką produkcję, dopiero zaczynam ;) ) postać zachowuje się nienaturalnie, myślę że to ma jakiś związek z tym fragmentem kodu zamieszczonym powyżej. Moim zdaniem to albo źle napisana funkcja pobierania kąta, albo zła konwersja z double na float (która niestety była konieczna bo w XNA Vector2 ma zmienne X i Y typu float :( ). Niestety nie mogłem znaleźć w internecie odpowiedzi na moje pytania, dlatego zapytałem się tutaj :D
PS
Jakby to miało jakieś znaczenie to korzystam z XNA Game Studio i piszę na platformę Windows Phone

edytowany 1x, ostatnio: Hastati, 2015-01-22 15:26
W każdym frameworku do tworzenia gier opartych o .NET w klasie Vector zmienne x i y są typami float. - Riw 2015-01-21 22:43

Pozostało 580 znaków

2015-01-21 22:47
Riw
0

Nie pokazujesz nam jak te metody stosujesz,więc myślę, że zle je stosujesz. Trygonometrii w szkole jeszcze nie miałem, natomiast wydaje mi sie, że wszystko jest w porządku.
Sprecyzuj, co masz na myśli mówiąc o "nienaturalnym" zachowaniu postaci.

Pozostało 580 znaków

2015-01-22 14:11
Czarny Szczur
0

"Nienaturalne" w sensie że klikam i postać nie idzie w to miejsce, tylko zwiększa pozycje o Y. Raczej ich źle nie stosuje:

public void Ruch()
{
        if (this.Pozycja != this.AktywnyCel)
        {
                if (this.Pozycja.X > this.AktywnyCel.X)
                {
                        this.Pozycja.X -= this.Predkosc.X;
                }
                else if (this.Pozycja.X < this.AktywnyCel.X)
                {
                        this.Pozycja.X += this.Predkosc.X;
                }

                if (this.Pozycja.Y > this.AktywnyCel.Y)
                {
                        this.Pozycja.Y -= this.Predkosc.Y;
                }
                else if (this.Pozycja.Y < this.AktywnyCel.Y)
                {
                        this.Pozycja.Y += this.Predkosc.Y;
                }
        }
}

to jest funkcja w klasie postaci która (już po pobraniu sinusa i cosinusa zapisanych w typie Vector2, pomnożeniu tego przez 7 i zapisaniu do Vector2 Predkosc) dodaje X i Y do pozycji jeżeli ta nie pokrywa się z AktywnymCelem (czyli miejscem w które kliknąłem)

Pozostało 580 znaków

2015-01-22 14:12
0

ojć, sory nie zauważyłem że nie jestem zalogowany i wysłałem wiadomość jako "Czarny Szczur" xD

LOL, nie wiem kto wymyslal te nicki ale trzeba przyznac, ze kreatywne :D - tk 2015-01-23 00:12

Pozostało 580 znaków

2015-01-22 15:45
Riw
0

Hmm w xna nigdy nie stosowałem w ten sposób obrotu, ponieważ xna ma już taką i to pewnie nawet lepszą niż ty masz.Sprawdz w dokumentacji jak obracać obiekty 2d (albo 3d).

Pozostało 580 znaków

2015-01-22 15:50
0

Lel, przecież ja nic nie napisałem o obracaniu obiektów :v Klasa PobierzKat mi była potrzebna do obliczenia sinusa i cosinusa

Pozostało 580 znaków

2015-01-22 16:37
vbccv

przecież żeby iść we wskazanym kierunku wystarczy odjąć pozycję końcową od początkowej i masz wektor kierunkowy
potem wystarczy wektor kierunkowy znormalizować (Vector.Normalize) i pomnożyć razy żądaną prędkość (skorygowaną przez czas żeby ruch był jednakowy niezależnie od szybkości komputera) i tyle

nie trzeba liczyć żadnych kątów a już na pewno nie w zwykłych stopniach

i nie upychaj danych do przekazania w pierwszej rzeczy jaką napotkasz
jaki sens zwracania danych typu double w składowych X i Y klasy która służy całkiem do czegoś innego (wektor)

potrzebujesz zwrócić wiele danych - zrób to przez out lub stwórz własną strukturę / klasę
zmniejszenie precyzji na tak wczesnym etapie może się mocno nawarstwiać

Pozostało 580 znaków

2015-01-22 16:42
vbccv
0

a do zwrócenia kąta między dwoma obiektami bardziej nadaje się funkcja Math.Atan2

po co tworzyć funkcje typu PobierzDystans(a, b)? Przecież to zaledwie (a - b).Length które wygląda wystarczająco intuicyjne
przeliczanie na radiany i z powrotem - bez sensu

Pozostało 580 znaków

2015-01-22 21:59
0

Dzięki za info ;) A wiesz może jak obracać sprite'y?

Pozostało 580 znaków

2015-01-22 22:58
0

dobra, nie musisz już odpowiadać, sam znalazłem rozwiązanie :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot