簡體   English   中英

pygame 精靈不隨 self.rect.move_ip 移動

[英]pygame sprite not moving with self.rect.move_ip

我正在 pygame 中開發一款游戲,我已經在屏幕上繪制了基本繪圖,但用戶輸入讓我感到困惑。 我有一個播放器 class:

class Player(pygame.sprite.Sprite):
  def __init__(self):
    super(Player, self).__init__()
    self.surf = pygame.Surface((75, 25))
    self.surf.fill((255, 255, 255))
    self.rect = self.surf.get_rect()

  def update(self, pressed_keys):
    if pressed_keys[K_UP]:
        self.rect.move_ip(0, -5)
    if pressed_keys[K_DOWN]:
        self.rect.move_ip(0, 5)
    if pressed_keys[K_LEFT]:
        self.rect.move_ip(-5, 0)
    if pressed_keys[K_RIGHT]:
        self.rect.move_ip(5, 0)
    pygame.event.pump()

但是每當我按下按鍵時,什么都沒有發生。 這是繪制內容的腳本的結尾:

while running:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
        elif event.type == QUIT:
            running = False
    
    pressed_keys = pygame.key.get_pressed()

    player.update(pressed_keys)

    screen.fill((0, 0, 0))

    surf = pygame.Surface((50, 50))

    surf.fill((0, 0, 0))
    rect = surf.get_rect()

    screen.blit(player.surf, (SCREEN_WIDTH/2, SCREEN_HEIGHT/2))

    pygame.display.flip()

我不知道發生了什么,但我找不到任何關於此的解決方法。 一切都畫對了,但沒有別的。

您必須在存儲在rect屬性中的 position 處對播放器進行blit

screen.blit(player.surf, (SCREEN_WIDTH/2, SCREEN_HEIGHT/2))

screen.blit(player.surf, player.rect)

來自blit(source, dest, area=None, special_flags=0)上的文檔

在此 Surface 上繪制source Surface。 可以使用dest參數定位平局。 dest參數可以是一對坐標,表示 blit 左上角的 position 或Rect

移動player

class Player(pygame.sprite.Sprite):
  def __init__(self):
    super(Player, self).__init__()
    self.surf = pygame.Surface((75, 25))
    self.surf.fill((255, 255, 255))
    self.rect = self.centered()

  def update(self, pressed_keys):
    if pressed_keys[K_UP]:
        self.move(0, -5)
    if pressed_keys[K_DOWN]:
        self.move(0, 5)
    if pressed_keys[K_LEFT]:
        self.move(-5, 0)
    if pressed_keys[K_RIGHT]:
        self.move(5, 0)
    pygame.event.pump()

  def draw_on(surface):
    surface.blit(self.surf, self.rect)

  def move(x, y):
    self.rect.move_ip(x,y)

  def centered():
    return self.surf.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2)) 

注:為Player添加了一些功能

  • move用向量 (x,y) 移動玩家
  • centered position 為中心,在恆定的屏幕尺寸內
  • draw_on在給定的表面(如screen )上繪制玩家精靈/表面

閱讀有關如何使用get_rect()居中的Surface文檔:

您可以將關鍵字參數值傳遞給此 function。 這些命名值將在返回之前應用於 Rect 的屬性。 一個示例是mysurf.get_rect(center=(100, 100))為 Surface 創建一個以給定 position 為中心的矩形。

然后替換:

    screen.blit(player.surf, (SCREEN_WIDTH/2, SCREEN_HEIGHT/2))

經過:

    # new player is centered, moved player not
    player.draw_on(screen)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM