我创建了一个“字符”对象和一个“块”组 我使“字符”对象可以平滑移动 我希望“字符”不与“块”重叠当前碰撞阻止的工作方式如下:“字符”对象可能与“块”对象重叠,但是如果释放键,“字符”将退出“块” ”。我想修复它
# an object that can move
class Character():
def __init__(self, screen, ai_settings):
self.screen = screen
self.ai_settings = ai_settings
self.screen_rect = screen.get_rect()
self.image = pygame.image.load('images/character.bmp')
self.rect = self.image.get_rect()
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
self.moving_up = False
self.moving_down = False
self.moving_left = False
self.moving_right = False
def update(self):
if self.moving_up:
self.rect.y -= self.ai_settings.CHARACTER_SPEED_FACTOR
if self.moving_down:
self.rect.y += self.ai_settings.CHARACTER_SPEED_FACTOR
if self.moving_left:
self.rect.x -= self.ai_settings.CHARACTER_SPEED_FACTOR
if self.moving_right:
self.rect.x += self.ai_settings.CHARACTER_SPEED_FACTOR
class Block(Sprite):
def __init__(self, screen, x, y):
super().__init__()
self.screen = screen
self.image = pygame.image.load('images/block.bmp')
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
尝试撞块
def check_keydown_events(event, character, blocks):
if event.key == pygame.K_UP:
#Start up smoothly moving up
character.moving_up = True
for block in blocks:
if character.rect.colliderect(block.rect):
character.rect.top = block.rect.bottom
#Attempt to block a collision
答案 0 :(得分:0)
根据您的描述(Character
精灵在检测到冲突之前最终重叠了Block
),看来问题出在Character
的步进运动上。
查看代码:
class Character( ... ):
def update(self):
if self.moving_up:
self.rect.y -= self.ai_settings.CHARACTER_SPEED_FACTOR
...
运动只是应用self.ai_settings.CHARACTER_SPEED_FACTOR
的变化量,更新屏幕,然后 then 检查碰撞。这显示Character
暂时与Block
重叠。
解决此问题的一种方法是检查Character.update()
中的冲突。因此,如果说向上移动 X 个像素会导致碰撞,则仅移动可用像素数量,然后设置self.moving_up = False
。