Obecnie zajmuję się tworzeniem gier XNA w języku C #.
Mam dwie klasy: główny moduł obsługi gry i klasę „sprite”. Poniżej znajduje się podstawowy pseudo-kod, który - mam nadzieję - odpowiednio opisuje problem.
Game.cs
class game {
sprite the_sprite;
void update(time) {
var mouse = mouse.state
if(mouse.clicked) { this.the_sprite.moveTo(mouse.x, mouse.y) }
this.the_sprite.update(time)
base.update(time)
}
}
Sprite.cs
class sprite {
vector2 location;
vector2 move_to;
void moveTo(x, y) { this.move_to = new vector2(x, y) }
void update(time) {
if(this.location.x > this.move_to.x /* (or less than) */) {
// adjust location.x
}
if(this.location.y > this.move_to.y /* (or greater than) */) {
// adjust location.y
}
}
}
Zasadniczo: gdy użytkownik kliknie gdzieś w oknie gry, współrzędne xiy myszy są pobierane, a obiekt gry przesuwa się w tym miejscu w pewnym okresie czasu.
Cóż ... kod działa, ale jest brzydki, a obiekty nie poruszają się bezpośrednio w kierunku obiektu (zamiast tego jest to ruch ukośny, a następnie ruch jednoosiowy). Domyślam się, że jest kilka funkcji matematycznych, których mogę użyć, ale szczerze mówiąc, nie mam pojęcia, od czego zacząć. Jakieś sugestie?
Odpowiedzi:
Jeśli dobrze rozumiem twój problem, powinieneś po prostu mieć kierunek Vector2 reprezentujący kierunek, w którym chcesz się poruszać w swojej klasie duszka. Lubię to:
Jest to znormalizowany wektor (co oznacza, że ma długość 1) wskazujący dokąd chcesz iść.
Następnie dodaj właściwość Speed float, która mówi, jak szybko powinien iść duszek.
Musisz także dodać funkcję UpdateSprite, więc dlaczego nie umieścić jej w klasie Sprite?
Spowoduje to zaktualizowanie pozycji duszka, aby go poruszyć (mnożymy przez delta sekund, aby duszek poruszał się również poprawnie na wolnych komputerach).
Na koniec ustaw swoją właściwość kierunku w następujący sposób:
źródło
Normalizacja Google ... Jestem też trochę zagubiony, ale jestem pewien, że pomoże to rozwiązać Twój problem. Jestem pewien, że ktoś inny może opracować lub obalić moją odpowiedź
Edycja: Mogę odpowiedzieć na to lepiej, przepraszam
Osobiście zawsze szukam tego postu na blogu, aby pomóc w rozwiązywaniu tego rodzaju problemów: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
Zaczyna się od zera i ma znaczenie dla rozwoju gry.
źródło