1

メインプログラム:

player = Player("player.png",[10,650])
players = pygame.sprite.Group()
players.add(player)

while True:
    for event in pygame.event.get():
      if event.type == KEYDOWN:
        if event.key == K_RIGHT:
          player.goright()
        if event.key == K_LEFT:
          player.goleft()           
      if event.type == KEYUP:
        if event.key == K_RIGHT:
          player.cangoright = False
        if event.key == K_LEFT:
          player.cangoleft = False

players.update()
players.draw(SCREEN)
pygame.display.update()
clock.tick(FPS)

関連するスプライトの機能:

def update(self):
  if self.cangoright:
    self.rect.left += self.speed
  if self.cangoleft:
    self.rect.left -= self.speed

def goright(self):               
  if self.rect.right <= 1024:
    self.cangoright = True
  else:
    self.cangoright = False

def goleft(self):             
  if self.rect.left >= 0:
    self.cangoleft = True
  else:
    self.cangoleft = False

問題は、「cangoright」フラグと「cangoleft」フラグが正しく機能していないように見えることです。スプライトが画面の端 (左が 0、右が 1024) を超えた場合、フラグを false に設定する必要があるため、更新関数の ifs は false を返す必要がありますが、そうはなりません。

4

3 に答える 3

2

この回答には、いくつかのサンプルmoveメソッドがあります。たぶん、それらがどのように書かれているかを見ると役立つでしょうか?

パドル.ムーブ()

def move(self, *, up=False, down=False):
    if up or (not down and self.keys.up and
              self.position.y - self.size.y > 0):
        self.position -= Point(0, self.move_by)
    if down or (not up and self.keys.down and
                self.position.y + self.size.y < self.height):
        self.position += Point(0, self.move_by)

ボール.ムーブ()

def move(self):
    self.position += self.velocity
    self.bounce()
于 2012-08-09T20:30:18.863 に答える
0

問題の一部は、 でのみ更新leftしていることにあると思いますself.rectleft代わりに と の両方を更新してみてright、状況が変わるかどうかを確認してください。

さらに重要なことに、このコードは少し読みにくく、実行しようとしていることが複雑すぎます。updateキーイベントハンドラーではなく、関数で画面の境界をチェックすることで、より良いサービスが提供される場合があります。実際には、これはゲームの物理の一部であるため、おそらくそこから離れている必要があります。

つまり、イベントループを使用して、プレーヤーの意図を表すフラグをupdate関数に設定します。この関数を使用しupdateて、イベント ループによって設定されたフラグに基づいて、ゲームのルール (物理など) をゲームの状態に適用します。

たぶん、このようなものですか?

while True:
  ...
    for event in pygame.event.get():
      if event.type == KEYDOWN:
        if event.key == K_RIGHT:
          player.goright = True
        if event.key == K_LEFT:
          player.goleft = True
      if event.type == KEYUP:
        if event.key == K_RIGHT:
          player.goright = False
        if event.key == K_LEFT:
          player.goleft = False

  players.update()
  players.draw(SCREEN)
  pygame.display.update()
  clock.tick(FPS)

def update(self):
  if self.goright and self.speed < SPEED_MAX:
    self.speed += ACCEL_INCREMENT
  if self.goright and self.speed > -SPEED_MAX:
    self.speed -= ACCEL_INCREMENT

  new_left_pos = self.rect.left + self.speed
  new_right_pos = self.rect.right + self.speed

  if new_left_pos > 0 and new_right_pos < 1024:
        self.rect.left += self.speed
        self.rect.right += self.speed
于 2012-08-09T19:46:39.330 に答える
0

if 文が少しずれています。

if self.rect.right <= 1024:  #Shouldn't this be < 1024 and not <=
    self.cangoright = True 

同じ:

if self.rect.left >= 0:  #Same thing here
    self.cangoleft = True 

スプライトを画面の端から少し離れたところに配置することで、遠くに行くように見えます。

お役に立てれば。

于 2012-08-09T19:46:49.087 に答える