嘿,伙计们,我需要帮助解决pygame上的碰撞问题。 我有一个边界图,通过使用遮罩重叠来设置像素完美碰撞。碰撞被检测到没有任何问题,但当涉及到阻止球员通过墙,总是有某种方式被发送通过它。我做了一些尝试(真的很多次),包括当你同时按下三个按钮时冻结播放器,以避免它爆裂,但都没有效果。在
现在,我检查用户按下哪个按钮来设置方向:
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
key = pygame.key.get_pressed()
if key[pygame.K_w]:
COLLISION_DIRECTION = "UP"
if key[pygame.K_s]:
COLLISION_DIRECTION = "DOWN"
if key[pygame.K_d]:
COLLISION_DIRECTION = "RIGHT"
if key[pygame.K_a]:
COLLISION_DIRECTION = "LEFT"
然后根据方向检查碰撞情况。在我最后一次绝望的尝试中,我求助于保存阵列上最后一个非碰撞位置,将世界(我正在移动世界,而不是玩家)转换到该位置,然后减去或增加移动速度:
^{pr2}$我最好的猜测是,我应该阻止所有额外的输入,同时移回安全位置,以避免改变碰撞方向。 你们能帮我什么忙吗?在
world.x和world.y是世界的可变坐标
编辑:我忘了添加world构造函数类
class World(pygame.sprite.Sprite):
def __init__(self):
self.sprite = pygame.image.load('bin\\assets\\test.png')
self.x = 220
self.y = 45
def draw(self, surface):
surface.blit(self.sprite, (self.x, self.y))
def handle_keys(self):
key = pygame.key.get_pressed()
if pygame.joystick.get_count():
joystick_x = round(my_joystick.get_axis(0))
joystick_y = round(my_joystick.get_axis(1))
if joystick_x < 0:
self.x += DIST_WORLD
if joystick_x > 0:
self.x -= DIST_WORLD
if joystick_y < 0:
self.y += DIST_WORLD
if joystick_y > 0:
self.y -= DIST_WORLD
if key[pygame.K_w]:
self.y += DIST_WORLD
if key[pygame.K_s]:
self.y -= DIST_WORLD
if key[pygame.K_a]:
self.x += DIST_WORLD
if key[pygame.K_d]:
self.x -= DIST_WORLD
从问题和您在评论中的回答来看,似乎只要注册了三个或更多个按键,就会触发故障,导致}和{}不适当地更新。在
COLLISION_DIRECTION
和{考虑这样一个事实:如果玩家沿着X或Y轴的某个方向移动,那么他们不可能同时朝相反的方向移动。还要考虑这样一个事实:如果玩家同时按下多个键,主游戏循环中的代码允许覆盖
COLLISION_DIRECTION
的值;例如,如果W、A和S同时按下,最后的COLLISION_DIRECTION
将是"LEFT"
。在我假设你允许对角线运动,所以我们要做的是使
COLLISION_DETECTION
同时对x轴和y轴有意义。然后,我们必须将按键检查的次数限制在两次(一次用于x轴,一次用于y轴),这样就不会发生三按钮问题。在在主游戏循环中:
相应地更新碰撞检测:
^{pr2}$然后,在您的
handle_keys
函数中:我希望这有帮助!如果代码没有做到这一点,我很抱歉,但至少,我希望我在代码之前的评论能提供一些见解。在
相关问题 更多 >
编程相关推荐