1

私は Pygame を学んでおり、ほとんどの人と同じように (私が思うに)、それを操作するために小さなゲームを書いています。そうは言っても、私の質問に自由に答えてください。

したがって、問題は私の「ボス」オブジェクトにあります。上からゲームにドロップし、360 度の円でランダムな数のショットを発射し始めるはずです。うまくいくこともありますが、予期していなかったことがいくつか起こっていることに気付きました。1) 弾丸は一定の速度で移動しているはずですが、時間の経過とともに速度が低下しているように見え、X 平面よりも Y 平面に沿って速く移動します。 1 つのショットが少し大きく見えることがよくあるので、いくつかはオーバーラップしていることを確認してください)、いくつかは右下に撃ち、もう 1 つは反対方向に撃ちます。それはすべきではありません。というわけで、これがコードです。射撃の計算を投稿してから、弾丸 (ファイアボール) のインスタンスを投稿します。残りは、私が見たものからかなり典型的です。

def shoot (self, shots, time_passed):

    angle = (math.pi*2)/shots
    for i in xrange(shots):
        bullet = Fireball("fireball.png", self.direction, 100)
        bullet.angle = angle
        bullet.pos = ((math.sin(bullet.angle) * bullet.speed) * time_passed,
                      (math.cos(bullet.angle) * bullet.speed) * time_passed)
        Fireball.container.remove(bullet)
        EnemyFireball.container.add(bullet)
        bullet.rect.center = self.rect.center
        angle += angle

そして、これは弾丸です:

class Fireball (pygame.sprite.Sprite):

    container = pygame.sprite.Group()

    def __init__ (self, image, direction, speed):
        pygame.sprite.Sprite.__init__ (self, self.container)

        self.image = pygame.image.load(image).convert_alpha()
        self.rect = self.image.get_rect()
        self.radias = ((self.rect.width/2 + self.rect.height/2)/2)
        self.speed = speed
        self.direction = direction
        self.angle = -1

    def update (self, time_passed):

        if self.angle != -1:
            self.rect.move_ip(self.pos)
        else:
            self.rect.move_ip(0, (self.speed*time_passed) * self.direction)
        if self.rect.bottom < 0: self.kill()
        if self.rect.top > 2000: self.kill()

絵を描いてよろしいですか... 0 <-- ボスと弾丸の線。

私が期待するもの:

\|/  
-0-  
/|\

私が見ているもの:

\  
 0-  
 |\  

…そして真っ直ぐ下の弾丸は常に大きく見えるので、重なっていると思いますが、理由はわかりません。Time_passed は、Clock.tick(60) の間で計算された時間であり、shots 引数は 8 ~ 16 の間の乱数です。

すべてが理にかなっていることを願っています。そうでない場合は、お知らせください。私は明確にしようとします。助けてくれてありがとう。

さらにコンテキストが必要な場合は、ソースへのリンクを次に示します。心配しないでください。http://code.google.com/p/scroller-practice/source/browse/

4

1 に答える 1

2

2 つの変数で角度を維持する必要があります。

それを行う正しい方法は

curr_angle = 0
angle_step = (math.pi*2)/shots

そして、各ループの終わりに

curr_angle += angle_step

あなたがそれを行う方法では、角度 angle、次に 2*angle、次に 4*angle などになります。

他のすべての部分を取り除き、ループだけを持っている場合

angle = (math.pi*2)/shots
for i in xrange(shots):
    angle += angle 

角度をインクリメントするのではなく、毎回角度を2倍にしていることは明らかです。

于 2013-01-11T23:15:17.137 に答える