2016-11-26 8 views
1

私の船が向いている方向に弾を撃ちたい。私はこの非常に便利なコードを使ってゲームで弾丸を得ることができました:How to create bullets in pygame?私の船が指し示している方向に弾を撃つ

私は参照のためにいくつかのコードを提供しましょう。以下は私の船を回転させてその方向に動かすためのコードのセットです。また、Offset = 0。以下は

'''Directional commands for the sprite''' 
if pressed[pygame.K_LEFT]: offset_change += 4 
if pressed[pygame.K_RIGHT]: offset_change -= 4 
if pressed[pygame.K_UP]: 
    y_change -= cos(spaceship.angle) * 8 
    x_change -= sin(spaceship.angle) * 8  
if pressed[pygame.K_DOWN]: 
    y_change += 5 
if event.type == pygame.KEYUP: 
    if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT or event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
     x_change = 0 
     y_change = 0 
     offset_change = 0 

'''changes X/Y based on the value of X/Y_Change''' 

spaceship.angle += offset_change   
spaceship.startY += y_change 
spaceship.startX += x_change 

宇宙船コードが入っているクラスです。私は以前、私は

を変更を考えていた言及し、「どのように箇条書きを作成する...」リンクの一部として今

class Spaceship(): 
'''Class attributed to loading the spaceship''' 
    def __init__(self, char, startX, startY, Angle): 
     '''Loads in the image and sets variables''' 
     self.char = char 
     self.startX = startX 
     self.startY = startY 
     self.angle = Angle 
     self.space = load_item(self.char) 
     self.drawChar() 

    def drawChar(self): 
     '''Draws the image on the screen''' 
     #Code is from Pygame documentation 
     #Due to limitations of Pygame the following code had to be used with a few of my own manipulations 
     rot_image = pygame.transform.rotate(self.space,self.angle) 
     rot_rect = self.space.get_rect() 
     rot_rect.center = rot_image.get_rect().center 
     rot_image = rot_image.subsurface(rot_rect).copy() 
     gameDisplay.blit(rot_image,(self.startX,self.startY)) 

for b in range(len(bullets)): 
    bullets[b][1] -= 8 

~bullets[spaceship.startX][spaceship.startY] -= 8コードの行がbullets[x][y]を表していたと私は信じていました。しかし、私はTypeError: list indices must be integers, not floatと提示されました。

私の推測は間違っていると思います。どのようなアイデアを提案することができます私の弾丸は、私はそれが欲しいと思いますか?

+0

(PythonのスタイルPEP008に探して検討してくださいガイド)。ちょっとしたヒント: '=='が繰り返されるのではなく、[pygame.K_RIGHT、pygame.K_LEFT、...] 'にevent.keyを使うことができます。 – CodenameLambda

+0

@ CodeLambdas私はここで何を探しているのか分かりません。 – Lucky38i

+0

私は単純な物理シミュレーションを行うPointMassクラスを含む答えを書いていましたが、それはあまりにも大きすぎると思いました。そのため、以下に簡単な答えがあります。以前のコメントの内容は、コードを読みやすくするためのヒントです。 – CodenameLambda

答えて

1

bはリストbulletsの中の箇条書きのインデックスであり、0または1はx座標とy座標です。

次のようにあなたがそれらを更新することができ、角度と速度でそれらの値に変更:

for bullet in bullets: # as 'bullets' is a list of lists 
    bullet[0] += math.cos(angle) * speed 
    bullet[1] += math.sin(angle) * speed 

別の、より多くのオブジェクト指向アプローチ:

class Vector(tuple): 
    def __new__(cls, *args): 
     if len(args) == 1 and hasattr(args[0], "__iter__"): 
      return super().__new__(cls, args[0]) 
     else: 
      return super().__new__(cls, args) 

    def __add__(self, other): 
     return Vector(a + b for a, b in zip(self, other)) 

    def __sub__(self, other): 
     return Vector(a - b for a, b in zip(self, other)) 

    def __neg__(self): 
     return Vector(-i for i in self) 

    def __mul__(self, other): 
     return Vector(i * other for i in self) 

    def __rmul__(self, other): 
     return self.__mul__(other) 

    def __div__(self, other): 
     return Vector(i/other for i in self) 

    def __truediv__(self, other): 
     return self.__div__(other) 


class Bullet(object): 
    def __init__(self, position, angle, speed): 
     self.position = Vector(position) 
     self.speed = Vector(math.cos(angle), math.sin(angle)) * speed 

    def tick(self, tdelta=1): 
     self.position += self.speed * tdelta 

    def draw(self): 
     pass # TODO 


# Construct a bullet 
bullets.append(Bullet(position, angle, speed) 

# To move all bullets 
for i in bullets: 
    i.tick() # or i.tick(tdelta) 
+0

これはややうまく動作し、私は自分のコードについて謝っていますが、まだ学習しています(Uni一年目)。それはある程度は機能しますが、ある角度ではうまくいかず、私の船を回転させると弾丸がジッターして方向を変えることがあります。 – Lucky38i

+0

もう一つのアプローチを追加して、クラス。 – CodenameLambda

+0

@ Lucky38iあなたがそれについて考えているならば、これが起こるという論理です:船の角度を指定すると、すべての弾の角度を保存するのではなく、結果としてすべての弾の角度も変わります。弾丸を表すリストにそれらのアングルを格納する必要があります。 – CodenameLambda

関連する問題