Ich beschäftige mich derzeit mit der Entwicklung von XNA-Spielen in der Sprache C #.
Ich habe zwei Klassen: den Hauptspielhandler und eine "Sprite" -Klasse. Es folgt ein grundlegender Pseudocode, der das Problem hoffentlich angemessen beschreibt.
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
}
}
}
Grundsätzlich gilt: Wenn der Benutzer irgendwo im Spielfenster klickt, werden die x- und y-Koordinaten der Maus erfasst, und das Spielobjekt bewegt sich über einen bestimmten Zeitraum zu diesem Ort.
Nun ... der Code funktioniert, ist aber hässlich und Objekte bewegen sich nicht direkt auf das Objekt zu (stattdessen ist es eine diagonale Bewegung, gefolgt von einer einachsigen Bewegung). Ich vermute, es gibt einige mathematische Funktionen, die ich verwenden kann, aber ich habe ehrlich gesagt keine Ahnung, wo ich anfangen soll. Irgendwelche Vorschläge?
Antworten:
Wenn ich Ihr Problem richtig verstehe, sollten Sie nur eine Richtung Vector2 haben, die die Richtung darstellt, in die Sie sich innerhalb Ihrer Sprite-Klasse bewegen möchten. So was:
Dies ist der normalisierte Vektor (dh er hat eine Länge von 1), der anzeigt, wohin Sie möchten.
Fügen Sie dann eine Speed float-Eigenschaft hinzu, die angibt, wie schnell das Sprite sein soll.
Sie müssen auch eine UpdateSprite-Funktion hinzufügen. Warum also nicht in Ihre Sprite-Klasse einfügen?
Dadurch wird die Position des Sprites aktualisiert, damit es sich bewegt (Sie multiplizieren mit den Delta-Sekunden, damit sich das Sprite auch auf langsamen Computern ordnungsgemäß bewegt).
Schließlich legen Sie einfach Ihre Richtungseigenschaft wie folgt fest:
quelle
Google-Normalisierung ... Ich bin auch ein wenig verloren, aber ich bin mir ziemlich sicher, dass dies zur Lösung Ihres Problems beitragen wird. Jemand anderes kann meine Antwort ausarbeiten oder widerlegen, da bin ich mir sicher
Edit: Ich könnte das besser beantworten, entschuldige
Ich persönlich schaue immer auf diesen Blog-Beitrag, um bei solchen Problemen zu helfen: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
Es beginnt bei Null und ist für die Spieleentwicklung relevant.
quelle