Ich erstelle einen Bullet Shooter im Stil von Touhou. Im Moment möchte ich einen sehr einfachen kreisförmigen Schuss vom Feind haben.
Der Abstand ist jedoch sehr ungleichmäßig, was nicht sehr gut ist, wenn Sie überleben wollen.
Der Code, den ich verwende, lautet:
private function shoot() : void
{
const BULLETS_PER_WAVE : int = 72;
var interval : Number = BULLETS_PER_WAVE / 360;
for (var i : int = 0; i < BULLETS_PER_WAVE; ++i)
{
var xSpeed : Number = GameConstants.BULLET_NORMAL_SPEED_X * Math.sin(i * interval);
var ySpeed : Number = GameConstants.BULLET_NORMAL_SPEED_Y * Math.cos(i * interval);
BulletFactory.createNormalBullet(bulletColor_, alice_.center, xSpeed, ySpeed);
}
canShoot_ = false;
cooldownTimer_.start();
}
Ich stelle mir vor, mein Fehler liegt in den sin
& cos
-Funktionen, bin mir aber nicht ganz sicher, was los ist.
Antworten:
Goldene Regel beim Arbeiten mit einem beliebigen Winkel: Stellen Sie sicher, dass Sie das richtige Gerät verwenden. In diesem Fall sollten Sie Bogenmaß verwenden, nicht Grad.
Wenn Sie Kugeln direkt zwischen Boss und Spieler abfeuern möchten, verwenden Sie
atan2
FYI.quelle
*
oder/ Math.PI/180
Sie im Freien sehen da draußen - wenn es nicht in der Basis trigonometrischen Funktionen enthalten, haben Sie es selbst zu tun , um in und von Grad umrechnen).Sie machen die Division falsch herum und verwenden eher Grad als Bogenmaß, wie es die mathematischen Funktionen tun. Durch Zufall ergibt sich ein Muster, das dem gewünschten etwas ähnelt. Korrigieren Sie einfach Ihre Berechnung der Intervallvariablen.
Bearbeiten: Für diejenigen, die mit dem Konzept nicht vertraut sind, erzeugt dieser Code den gewünschten Winkel zwischen Aufzählungszeichen im Bogenmaß, wodurch die Berechnung von
xSpeed
undySpeed
ohne weitere angewendete Konstanten verlassen werden kann.quelle
period = 2 * pi
von sin / cos Funktionen berechnen und danninterval = period / BULLETS_PER_WAVE
.Ich denke, Sie sollten stattdessen 360 / BULLETS_PER_WAVE ausführen, was in Ihrem Fall 360/72 = 5 Grad zwischen den einzelnen Aufzählungszeichen ergibt. Sind Sie sich auch sicher, dass die Funktionen Math.sin und Math.cos ihre Eingabe in Grad und nicht im Bogenmaß wünschen?
quelle
Während Sie beantwortet wurden, ist hier eine lustigere Antwort: Lernen Sie von der Natur.
Verwenden Sie stattdessen den goldenen Schnitt.
Siehe: http://www.mathsisfun.com/numbers/nature-golden-ratio-fibonacci.html
quelle
Abgesehen von möglichen Grad- / Bogenmaßproblemen besteht das Hauptproblem meiner Meinung nach darin, dass Sie für die Berechnungen ganzzahlige Werte verwenden. Sie haben
GameConstants.BULLET_NORMAL_SPEED_X
das Y-Gegenstück nicht angezeigt , stellen jedoch sicher, dass es als Gleitkommazahlen und nicht als Ganzzahlen dargestellt wird. Alternativ können Sie sie während der Multiplikation für die Geschwindigkeitsberechnung in Gleitkommawerte umwandeln.quelle
number
wird stattdessen eine Variable deklariert , die hätte sein sollenint
.