簡體   English   中英

矩形為什么不移動?

[英]Why isn't the rectangle moving?

這是我的代碼:

import pygame
from pygame.locals import *

#define the player
class Player(pygame.sprite.Sprite):
 def __init__(self):
  super(Player, self).__init__()
  self.surf = pygame.Surface((50, 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)

  #keep player on the screen
  if self.rect.left < 0:
   self.rect.left = 0
  elif self.rect.right > 400:
   self.rect.right = 400

#initialization
pygame.init()

#create the screen object
screen = pygame.display.set_mode((400, 600))

#instantiate the player
player = Player()

running = True

#main loop
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

 #draw the player to the screen
 screen.blit(player.surf, (200, 550))

 pressed_keys = pygame.key.get_pressed()

 player.update(pressed_keys)

 #update the display
 pygame.display.flip()

一切都顯示出來了,但是我不能用箭頭鍵移動矩形,而不會顯示任何錯誤,請幫助。 我還添加了一個打印,以檢查pressed_keys是否起作用,並且在不移動矩形的情況下進行打印。

很高興看到您正在使用pygame :D

在Python中,編寫“好”代碼很重要,這意味着代碼應遵循所有語法規則,適當縮進,最重要的是,清晰易讀。

以下是一些修正代碼的准則(遵循PEP 8准則):

  1. 始終將代碼縮進4個空格或制表符

  2. 注釋字符( "#" )后面應始終有一個空格,即: "# <= there's a space there"

  3. 空的連續新行絕不應該太多

  4. 在列表/元組/集合中的逗號后留一個空格,即(10, 10, 10)


以下是一些pygame指南:

  1. 您不應在每個循環中顯式使用pygame.key.get_pressed()檢查按鍵是否正常

  2. for event in pygame.event.get()檢查按鍵for event in pygame.event.get()

  3. 使用clock.tick設置幀速率,最小幀速率應為30,這將使程序保持恆定速度

  4. 始終用一種顏色填充屏幕,即使它是黑色, screen.fill((0, 0, 0))

  5. 每次循環后重新填充屏幕。 screen.fill((0, 0, 0))


這就是您一直在等待的東西, 如何解決您的問題 其實很簡單。 screen.blit(player.surf, (200, 550))你阻擊器它在您的位置設置(200, 550) 相反,您可能想要將其更改為screen.blit(player.surf, player.rect) ,這會將player screen.blit(player.surf, player.rect)到其位置(“ rect ”)。


以下是我所有建議的完整修改版代碼:

import pygame
from pygame.locals import *


# define the player
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.surf = pygame.Surface((50, 25))
        self.surf.fill((255, 255, 255))
        self.rect = self.surf.get_rect()

    def update(self, pressed_keys):
        if pressed_keys == K_LEFT:
            self.rect.move_ip(-5, 0)
        if pressed_keys == K_RIGHT:
            self.rect.move_ip(5, 0)
        # keep player on the screen
        if self.rect.left < 0:
            self.rect.left = 0
        elif self.rect.right > 400:
            self.rect.right = 400

# initialization
pygame.init()

# create the screen object
screen = pygame.display.set_mode((400, 600))
screen.fill((0, 0, 0))

# instantiate the player
player = Player()

# instantiate the ticker
clock = pygame.time.Clock()

# mainloop
running = True
while running:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
            elif event.key == K_LEFT:
                player.update(event.key)
            elif event.key == K_RIGHT:
                player.update(event.key)
        elif event.type == QUIT:
            running = False

    screen.fill((0, 0, 0))
    # draw the player to the screen
    screen.blit(player.surf, player.rect)
    # update the display
    pygame.display.flip()
    clock.tick(30)

暫無
暫無

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

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