[英]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准則):
始終將代碼縮進4個空格或制表符
注釋字符( "#"
)后面應始終有一個空格,即: "# <= there's a space there"
空的連續新行絕不應該太多
在列表/元組/集合中的逗號后留一個空格,即(10, 10, 10)
以下是一些pygame
指南:
您不應在每個循環中顯式使用pygame.key.get_pressed()
檢查按鍵是否正常
for event in pygame.event.get()
檢查按鍵for event in pygame.event.get()
使用clock.tick
設置幀速率,最小幀速率應為30,這將使程序保持恆定速度
始終用一種顏色填充屏幕,即使它是黑色, screen.fill((0, 0, 0))
每次循環后重新填充屏幕。 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.