1

pygame でスプライトに手榴弾を投げさせようとしています。私が望むのは、少し前進してから停止することです。私の問題は、手榴弾をスムーズに前進させることです。次のコードが行うことは、スムーズに移動するのではなく、関心のあるポイントにすぐに移動することです。

【グレネードクラス】

#Grenade Class
class Explosive(pygame.sprite.Sprite):
    def __init__(self, location):
        pygame.sprite.Sprite.__init__(self)
        self.pos = location
        self.image = Nade
        self.rect = self.image.get_rect()
        self.rect.right = self.image.get_rect().right
        self.rect.left = self.image.get_rect().left
        self.rect.top = self.image.get_rect().top
        self.rect.bottom = self.image.get_rect().bottom
        self.rect.center = location
    def move(self):
        if Player.direction == 0:
            self.rect.centery = self.rect.centery - 5
        if Player.direction == 180:
                self.rect.centery = self.rect.centery + 5
        if Player.direction == 90:
            self.rect.centerx = self.rect.centerx + 5
        if Player.direction == 270:
            self.rect.centerx = self.rect.centerx - 5 

【グレネード投擲(メインループ中)】

if event.key == pygame.K_e and grenadeNum > 0:
            Grenade = Explosive([Player.rect.centerx, Player.rect.centery])
            for i in range(1, 10)
                Grenade.move()
4

2 に答える 2

1

表示を更新する必要はありますが、2 つ目の問題があります。現時点では、待機するようにまったく指示していないため、遅延なく 10 回すべての動作を行います。これはちょうど突然になるので、時間をインポートして、そこに time.sleep() を追加したいかもしれません。自己完結型の「for」ループで手榴弾を動かすため、他に何かが起こっている場合、これは停止します。すべてを管理する while ループがある場合は、手榴弾で「更新」関数を呼び出すと、このラウンド中に移動する必要があるかどうかを知るためのカウンターがあります。他のスプライトが何かをする必要がある場合は、それらのメソッドも呼び出すことができます。最後に、プログラムを高速化するために、スプライトが移動する部分でのみ画面を更新できます。これをすべてまとめると、次のようになります。

import time

grenades = pygame.sprite.RenderUpdates()        #initializes a pygame group for sprites

class Explosive(pygame.sprite.Sprite):
def __init__(self, location):
    pygame.sprite.Sprite.__init__(self)
    self.pos = location
    self.image = Nade
    self.rect = self.image.get_rect()
    self.rect.right = self.image.get_rect().right
    self.rect.left = self.image.get_rect().left
    self.rect.top = self.image.get_rect().top
    self.rect.bottom = self.image.get_rect().bottom
    self.rect.center = location
    self.move_counter = 10               #adds a counter for how many rounds left of moving the grenade has
def update(self):
    if self.move_counter > 0:            #checks that self still has turns left to move
        <insert screen variable name>.fill(<insert background color>,self.rect)    #erases self in old location
        if Player.direction == 0:
            self.rect.centery = self.rect.centery - 5
        if Player.direction == 180:
                self.rect.centery = self.rect.centery + 5
        if Player.direction == 90:
            self.rect.centerx = self.rect.centerx + 5
        if Player.direction == 270:
            self.rect.centerx = self.rect.centerx - 5
        pygame.display.update(self.draw((screen)))    #draws self in new location
        self.move_counter -= 1           #subtracts one from the counter to mark that another turn of moving has passed by

while True:
    grenades.update()
    #anything else you want to do in real time here
    time.sleep(0.1)
于 2013-11-17T22:45:19.943 に答える
0

移動するたびに画面を再描画する必要があります。コードは次のとおりだと思います。

pygame.display.update()

したがって、for ループは次のようになります。

for i in range(1, 10)
    Grenade.move()
    pygame.display.update()

これはあまり効率的ではない可能性があるため、より効果的な方法を探してください。たとえば、手榴弾がシーン内の唯一の移動オブジェクトである場合は、それのみを再描画する必要があります。

于 2013-07-10T15:19:47.007 に答える