我正在做一個galaxian般的射手,和我的仇人對象都有一個目的載體,他們向旅遊,使用這段代碼:Galaxian般的敵人移動
運動由制定:
this.Motion = InitialPosition - Destination;
這使他們沿着一條直線前往目的地。
不過,我想給他們多一點有趣的,並在正弦或餘弦波走,有點像Galaxian一樣。
我該怎麼做?
我正在做一個galaxian般的射手,和我的仇人對象都有一個目的載體,他們向旅遊,使用這段代碼:Galaxian般的敵人移動
運動由制定:
this.Motion = InitialPosition - Destination;
這使他們沿着一條直線前往目的地。
不過,我想給他們多一點有趣的,並在正弦或餘弦波走,有點像Galaxian一樣。
我該怎麼做?
你可能會更好定義不是像正弦波簡單功能的運動功能的貝塞爾曲線。 Galaxian肯定有比這更復雜的運動。
這裏是鏈接到a primer on the maths of Bezier curves。這是一份相當長的文件,但在涉及數學方面做得很好,並有大量的例子。
希望能激勵你。
這樣做的一種方法是創建水平運動的加速因子並將該因子添加到水平速度每個滴答。所以如果你的敵人的水平速度是2開始的,而你的加速度是-01,那麼在200次蜱之後敵人會直線下降,並且在另外200次蜱之後它將以-2的水平速度移動。這將給出一個不錯的曲線。
通過確定速度和加速度隨機對每個敵人(通過實驗確定的一定範圍內),您可以創建一個好看的各種攻擊輪廓沒有太多精力。這會產生非常類似Galaxian的動作。
你可以做垂直同樣的事情爲好,不過,當然,加速限制將是非常不同......對於水平加速度,你可能會想確定這是在大小相等的範圍或者(例如-.02至+ 0.02),而對於垂直加速度,您可能總是希望船舶最終從屏幕底部往下走,因此您可能希望加速度總是最終爲正值(或負取決於你怎麼做的屏幕座標。)
你會利用waypoint navigation,符合當前的運動代碼做到這一點。您將通過繪製正弦波來計算路點。你可以通過使用Destination.Y = Math.Sin(Destination.X)
的效果來做到這一點 - 在沒有看到你的代碼的情況下,確實有點難以確定。
創建一個振盪器和一個偏移移動的敵人(即使沒有動量)垂直於它的方向等同於振盪器的正弦或餘弦就足夠了。
以下示例在工作時顯然只是一個指導原則。我希望它能幫助你。
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
}
大多數答案提供了很好的想法,但我覺得這是最好的。貝塞爾曲線允許更多種類的運動,並且可以讓事情更有趣。非常感謝所有的答案! – AllFallD0wn