2012-12-19 16 views
14

Ich bin ein galaxian-like-Shooter zu machen, und mein Feind Objekte haben ein Ziel Vector, die sie zu reisen, dieses Stück Code verwendet:Galaxian-like Feind Bewegung

Bewegung gearbeitet wird aus durch:

this.Motion = InitialPosition - Destination; 

Dies bedeutet, dass sie in einer geraden Linie in Richtung des Ziels reisen.

Allerdings möchte ich sie ein bisschen interessanter machen, und reisen auf einer Sünde oder cos Welle, ein bisschen wie Galaxian tat.

Wie kann ich das tun?

Antwort

9

Sie könnten besser eine Bezierkurve für die Bewegungsfunktion definieren als einfache Funktionen wie eine Sinuswelle. Galaxian hatte sicherlich komplexere Bewegungen als das.

Hier ist ein Link zu a primer on the maths of Bezier curves. Es ist ein ziemlich langes Dokument, aber es macht einen guten Job, die Mathematik zu behandeln, mit vielen Beispielen.

Hoffnung, die hilft, Sie zu inspirieren.

+0

Die meisten Antworten lieferten gute Ideen, aber ich fühlte, dass dies das Beste war. Bezier-Kurven ermöglichen eine größere Vielfalt an Bewegungen und können die Dinge interessanter halten. Vielen Dank für die Antworten! – AllFallD0wn

5

Eine Möglichkeit wäre, einen Beschleunigungsfaktor für die horizontale Bewegung zu erstellen und diesen Faktor bei jedem Tick zur horizontalen Geschwindigkeit hinzuzufügen. Wenn also Ihre horizontale Geschwindigkeit für einen gegebenen Gegner 2 ist und Ihre Beschleunigung -.01 war, dann würde der Feind nach 200 Ticks geradeaus gehen und nach weiteren 200 Ticks würde er sich mit einer horizontalen Geschwindigkeit von -2 bewegen . Dies wird eine schöne Kurve geben.

Durch die zufällige Bestimmung der Geschwindigkeit und Beschleunigung für jeden Gegner (innerhalb gewisser Grenzen, die durch Experimente bestimmt werden) können Sie ohne viel Aufwand eine gut aussehende Vielfalt von Angriffsprofilen erstellen. Dies würde eine sehr Galaxian-ähnliche Bewegung ergeben.

Sie können das Gleiche auch mit der Vertikalen tun, obwohl die Beschleunigungsgrenzen natürlich sehr unterschiedlich sein würden ... für die horizontale Beschleunigung würden Sie wahrscheinlich einen Bereich bestimmen wollen, der in beiden Größen gleich groß ist Seite von 0 (sagen wir -02 bis +.02), während für die vertikale Beschleunigung, Sie wahrscheinlich immer wollen, dass das Schiff am unteren Rand des Bildschirms endet, so dass Sie wahrscheinlich wollen, dass die Beschleunigung immer positiv endet (oder negativ, je nachdem, wie Sie die Bildschirmkoordinaten eingeben.)

3

Sie würden dies tun, indem Sie waypoint navigation, in Übereinstimmung mit Ihrem aktuellen Bewegungscode verwenden. Sie würden die Wegpunkte berechnen, indem Sie die Sinuswelle grafisch darstellen. Sie würden dies tun, indem Sie etwas mit der Wirkung von Destination.Y = Math.Sin(Destination.X) verwenden - es ist ein wenig schwierig, sicher zu sagen, ohne Ihren Code im Allgemeinen zu sehen.

2

Erstellen eines Oszillators und Bewegen des Gegners (auch ohne Impuls) senkrecht zu seiner Richtung um einen Offset gleich dem Sinus oder Kosinus des Oszillators wäre genug.

Das folgende Beispiel, während der Arbeit, ist eindeutig nur eine Richtlinie. Ich hoffe, es kann dir helfen.

var dest = new PointF(200, 100); 
var pos = new PointF(30, 140); 
var oscAngle = 0d; 
var dirAngle = Math.Atan2(dest.Y - pos.Y, dest.X - pos.X); 
//Constants for your simulation 
const int movSpeed = 2; 
const int amp = 2; 
const double frequency = Math.PI/5; 
//Inappropriate loop condition, change it to proper 
while (true) 
{ 
    oscAngle += frequency; 
    //Scalar offset, you can use Cos as well 
    var oscDelta = Math.Sin(oscAngle); 
    //Linear movement 
    var stepVector = new SizeF((float)(Math.Cos(dirAngle) * movSpeed), (float)(Math.Sin(dirAngle) * movSpeed)); 
    //Oscillating movement, making it transversal by adding 90° to the direction angle 
    var oscNormalAngle = dirAngle + Math.PI/2; 
    //Vector for the oscillation 
    var oscVector = new SizeF((float)(Math.Cos(oscNormalAngle) * oscDelta) * amp, (float)(Math.Sin(oscNormalAngle) * oscDelta) * amp); 
    pos += stepVector + oscVector; 
    //Operate below 
}