我正在用pygame编写游戏,同时学习OOP和pygame.sprite.Sprite类,以及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()
答案 0 :(得分:3)
代码的问题在于,您仅将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
希望此答案对您有所帮助,如果您对此答案还有其他疑问,请随时在下面发表评论!
答案 1 :(得分:2)
如果您实际上要使用浮点数进行移动,则需要将实际位置存储为单独的属性,在精灵移动时先进行更改,然后再更新矩形位置(因为{{1} }用作blit位置)。
我建议将实际位置和速度存储为pygame.math.Vector2
个对象。然后,您可以将速度添加到位置矢量,并将self.rect
(或其他rect属性之一)设置为新位置。
rect.center