2017-07-05 5 views
1

私はランダムな動きで一組のボールを動かそうとしますが、速度は均一です。私のコードはボールをランダムな方向に動かしますが、速度は異なります。私はそれがrandom.uniform関数が異なる値を与え、0に近いものは速度と時間を掛けた値が1に近いものよりも低い値を与えるからだと思います。しかし、アニメーションではスピードはボールの移動方向(dxdyの値が原因の場合)。私はanout正規化を知っているが、私はrandom.uniform正規化されたベクトルと同じ値を与えると思いますか?どのようにランダムな方向にスプライトを移動しますが、一定の速度のpython/pygameを使用しますか?

私の質問は以下のとおりです。

  1. dxdyのランダムな値は速度差の犯人ですか?
  2. すべてのボールを同じ速度で動かす方法は何ですか?

私のコード:任意の助け

self.timer = pygame.time.Clock() 
self.time_passed = self.timer.tick() 
self.speed = 0.5 
self.dx = random.uniform(-1, 1) 
self.dy = random.uniform(-1, 1) 
displacement = Vector2(
         self.dx * (self.speed * self.time_passed), 
         self.dy * (self.speed * self.time_passed) 
         ) 

self.pos += displacement #both vector objects 

ありがとう!

答えて

2

角度を使用してxとyを派生させます。

self.angle = random.uniform(-1, 1) 
self.dy = math.sin(self.angle * math.pi/2) 
self.dx = math.cos(self.angle * math.pi/2) 
+0

と思われます。なぜか、手がかりを持っていないが、感謝! –

+0

https://en.wikipedia.org/wiki/Trigonometry –

1

希望の長さ(速度)のベクトルで開始し、ランダムな角度で回転させてください。質問1に関して

self.velocity = Vector2(5, 0).rotate(random.randrange(360)) 

、あなたはベクトルをランダムxとyの値を与えるので、得られたベクターはすべて、完全に異なる長さ/大きさ、従ってスプライトは異なる速度で移動しなければなりません。たとえば、Vector2(0, 0)Vector2(1, 1)を得ることができます(同じ長さでないことは明らかです)。

実際にベクトルを正規化してからスケールすることができますが、rotateメソッドを使用することをお勧めします。 (長さ0のベクトルは正規化できません)