2017-05-13 13 views
3

pythonライブラリ「Pygame」(v1.9.2)でゲームを作ろうとしていて、プレイヤーのキャラクターを作っています。このキャラクターはmouse_posのポイントに「弾丸」や「呪文」を「撃つ」と言われています。私が助けが必要なのは、スピードを上げようとすると「弾丸」に一定の速度が1 self.speed = 1に割り当てられていることですself.posがmouse_posよりも高いか低いので弾丸がmouse_posに達したときにちらつき効果を引き起こします。ポイントAからポイントBへのパイジェの弾丸の動き

私はこの弾丸をすばやく進めるにはどうすればいいですか?&は弾丸のように滑らかで、mouse_posが設定されている正確なポイントにもどりますか? self.speed = 2
http://4.1m.yt/d_TmNNq.gif

関連するコードとself.speed = 1
https://media.giphy.com/media/AAifrctxHHQbe/giphy.gif

例と

例更新内部にある()関数
スプライト.py(スペル/ブレットクラス)

class Spell(pygame.sprite.Sprite): 
    def __init__(self,game,x,y,spelltype,mouse_pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.game = game 
     self.width = TILESIZE 
     self.height = TILESIZE 
     self.type = spelltype 
     self.effects = [ 
       'effect_'+self.type+'_00', 
       'effect_'+self.type+'_01', 
       'effect_'+self.type+'_02' 
     ] 
     self.image = pygame.image.load(path.join(IMG_DIR,"attack/attack_"+self.type+".png")).convert_alpha() 
     self.image = pygame.transform.scale(self.image,(self.width,self.height)) 
     self.rect = self.image.get_rect() 
     self.rect.x = x+self.width 
     self.rect.y = y+self.height 
     self.speed = 1 
     self.mouse_pos = mouse_pos 
     self.idx = 0 

    def update(self): 
     if not self.rect.collidepoint(self.mouse_pos): 
      if self.mouse_pos[0] < self.rect.x: 
       self.rect.x -= self.speed 
      elif self.mouse_pos[0] > self.rect.x: 
       self.rect.x += self.speed 

      if self.mouse_pos[1] < self.rect.y: 
       self.rect.y -= self.speed 
      elif self.mouse_pos[1] > self.rect.y: 
       self.rect.y += self.speed 
     else: 
      self.image = pygame.image.load(path.join(IMG_DIR,"effects/"+self.effects[self.idx]+".png")) 
      self.idx += 1 
      if self.idx >= len(self.effects): 
       self.kill() 
+1

弾丸を特定の方向に発射するには、三角法またはベクトルを使用する必要があります。ここでは、ベクトルとどのように動作するかを示す答えがあります:http://stackoverflow.com/a/42281315/6220679 – skrx

+0

あなたの弾は非常に速くてターゲットを通過する場合は、弾丸の間の線現在の点とその最後の点がターゲットと交差します。 – Lanting

+0

各アップデートで距離がODDかEVENかどうかを確認する必要がありますか? –

答えて

2

ピタゴラスの定理は、n次元空間内の点の間の距離を伝えます。弾丸は異なる角度で異なる速度で、非現実的 を移動しますので、あなたの場合

distance = math.sqrt(sum[ (self.mouse_pos[0] - self.rect.x) ** 2 
         , (self.mouse_pos[1] - self.rect.y) ** 2 
         ])) 
if distance < self.speed: 
    #remove the bullet from the scene 

についてこれは、偉大な解決策ではありません。実際には、45°の角度でsqrt(2)の速度で90 'で1の速度で移動します。

しかし、あなたは三角法の講義をしたくないと思います。

EDIT:三角法の講義です。 プログラムは弾丸をx方向とy方向の両方で最高速度で移動させるため、弾丸を現実的に移動させます。あなたがする必要があるのは、x方向とy方向(ベクトル)が形成する三角形の斜辺が1になるように、速度を両方向で遅くすることです。速度は常に1であるため、この三角形ちょうど単位円であることが起こります。

 m 
     |\ 
     | \ 
sin(A) | \ This speed is 1 
     | \ 
     | A\ 
     ------p 
     cos(A) 

あなたのキャラクターがpであり、そしてマウスをmである場合、あなたはその後、X-速度がAの余弦とyスピード意志になりますA.として、ここでラベルされたそれらの間の角度を見つけますAの正弦である。

どのように角度を見つけるか?あなたはアークタンジェントを使用します... 実際には、ここでコードを使用します。

import math 
if not self.rect.collidepoint(self.mouse_pos): 
     angle = math.atan2((self.mouse_pos[1] - self.rect.y) 
          , (self.mouse_pos[0] - self.rect.x) 
     self.rect.x += self.speed * math.cos(angle) 
     self.rect.y += self.speed * math.sin(angle) 

などです。私のシンボルが混ざっているかもしれません。

関連する問題