【问题标题】:Player not moving玩家不动
【发布时间】:2018-09-02 17:53:08
【问题描述】:

我在学习 OOP 和 pygame.sprite.Sprite 类的同时在 pygame 中编写游戏,以及 rect 附带的属性,但是由于某种原因,在编写了这个非常简单的代码之后,玩家并没有移动到右边,它只向左移动,并且没有碰撞检测代码,一旦它的坐标等于宽度,它就会停止移动。 这是为什么呢?

import pygame
import random

width = 800
height = 600

black = (0, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
red = (255, 0, 0)
white = (255, 255, 255)

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Shmup")
clock = pygame.time.Clock()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(green)
        self.rect = self.image.get_rect()
        self.rect.centerx = width/2
        self.rect.bottom = height - 10
        self.x_change = 0
        self.speedx = 0.2

    def change_left(self):
        self.x_change += -self.speedx

    def change_right(self):
        self.x_change += self.speedx

    def move_left(self):
        self.rect.x += self.x_change

    def move_right(self):
        self.rect.x += self.x_change

    def stop_move_left(self):
        self.x_change = 0

    def stop_move_right(self):
        self.x_change = 0


player = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)

exitGame = False
while not exitGame:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exitGame = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                player.change_left()
            if event.key == pygame.K_d:
                player.change_right()
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                player.stop_move_left()
            if event.key == pygame.K_d:
                player.stop_move_right()

    player.move_left()
    player.move_right()
    screen.fill(white)
    all_sprites.draw(screen)
    pygame.display.update()

pygame.quit()
quit()

【问题讨论】:

    标签: pygame


    【解决方案1】:

    您的代码的问题是您只是将player.rect.x 增加或减少0.2,并且pygame 将位置存储为整数。如果将player.rect.x 的值设置为280 并减去0.2,它应该变成279.8,但实际上它变成了279,因为转换为整数!向左移动时该值确实会发生变化,但向右移动时,该值会增加0.2,但这只是四舍五入回到原始值。

    注意:由于int() 函数在 Python 中的工作方式,-0.2 被舍入为 0,这就是为什么块无法移动超出窗口边界的原因,即使没有任何明确的“碰撞”检测”代码正在执行。

    解决此问题的快速简便的方法是将self.speedx 值更改为1 或更大:

    self.speedx = 1
    

    希望这个回答对你有帮助,如果你对这个回答还有什么疑问,欢迎在下方留言!

    【讨论】:

      【解决方案2】:

      如果您真的想使用浮点数进行移动,则需要将实际位置存储为单独的属性,在精灵移动时先更改它,然后再更新矩形位置(因为self.rect 是用作 blit 位置)。

      我建议将实际位置和速度存储为pygame.math.Vector2 对象。然后,您只需将速度添加到位置向量并将rect.center(或其他矩形属性之一)设置为新位置。

      import pygame
      from pygame.math import Vector2
      
      width = 800
      height = 600
      
      green = (0, 255, 0)
      white = (255, 255, 255)
      
      pygame.init()
      screen = pygame.display.set_mode((width, height))
      clock = pygame.time.Clock()
      
      class Player(pygame.sprite.Sprite):
          def __init__(self):
              pygame.sprite.Sprite.__init__(self)
              self.image = pygame.Surface((50, 40))
              self.image.fill(green)
              self.rect = self.image.get_rect(midbottom=(width/2, height-10))
              self.pos = Vector2(self.rect.center)
              self.velocity = Vector2(0, 0)
      
          def update(self):
              self.pos += self.velocity
              self.rect.center = self.pos
      
      
      player = Player()
      all_sprites = pygame.sprite.Group(player)
      
      exitGame = False
      while not exitGame:
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  exitGame = True
              elif event.type == pygame.KEYDOWN:
                  if event.key == pygame.K_a:
                      player.velocity.x = -0.8
                  elif event.key == pygame.K_d:
                      player.velocity.x = 0.8
              elif event.type == pygame.KEYUP:
                  if event.key == pygame.K_a:
                      player.velocity.x = 0
                  elif event.key == pygame.K_d:
                      player.velocity.x = 0
      
          all_sprites.update()  # Calls the `update` methods of the sprites.
      
          screen.fill(white)
          all_sprites.draw(screen)
          pygame.display.update()
          clock.tick(60)
      
      pygame.quit()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-04
        • 2022-12-16
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多