碰撞后穿过墙壁

2024-05-29 05:01:26 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们,我需要帮助解决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

Tags: keyselfeventworldgetifdist世界
1条回答
网友
1楼 · 发布于 2024-05-29 05:01:26

从问题和您在评论中的回答来看,似乎只要注册了三个或更多个按键,就会触发故障,导致COLLISION_DIRECTION和{}和{}不适当地更新。在

考虑这样一个事实:如果玩家沿着X或Y轴的某个方向移动,那么他们不可能同时朝相反的方向移动。还要考虑这样一个事实:如果玩家同时按下多个键,主游戏循环中的代码允许覆盖COLLISION_DIRECTION的值;例如,如果W、A和S同时按下,最后的COLLISION_DIRECTION将是"LEFT"。在

我假设你允许对角线运动,所以我们要做的是使COLLISION_DETECTION同时对x轴和y轴有意义。然后,我们必须将按键检查的次数限制在两次(一次用于x轴,一次用于y轴),这样就不会发生三按钮问题。在

在主游戏循环中:

## Instead of one COLLISION_DIRECTION, we now have two separate variables:
## COLLISION_DIRECTION_X and COLLISION_DIRECTION_Y

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        key = pygame.key.get_pressed()

        ## Using elif so we don't mess up COLLISION_DIRECTION_Y
        if key[pygame.K_w]:
            COLLISION_DIRECTION_Y = "UP"
        elif key[pygame.K_s]:
            COLLISION_DIRECTION_Y = "DOWN"

        ## Using elif so we don't mess up COLLISION_DIRECTION_X
        if key[pygame.K_d]:
            COLLISION_DIRECTION_X = "RIGHT"
        elif key[pygame.K_a]:
            COLLISION_DIRECTION_X = "LEFT"

相应地更新碰撞检测:

^{pr2}$

然后,在您的handle_keys函数中:

 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))

        ## Restrict joystick x-input checking, because we logically
        ## cannot be both greater and less than zero

        if joystick_x < 0:
            self.x += DIST_WORLD
        elif joystick_x > 0:
            self.x -= DIST_WORLD

        ## Restrict joystick y-input checking, because we logically
        ## cannot be both greater and less than zero

        if joystick_y < 0:
            self.y += DIST_WORLD
        elif joystick_y > 0:
            self.y -= DIST_WORLD

    ## Restrict keypress vertical axis checking for the same reason
    if key[pygame.K_w]:
        self.y += DIST_WORLD
    elif key[pygame.K_s]:
        self.y -= DIST_WORLD

    ## Restrict keypress horizontal axis checking for same reason
    if key[pygame.K_a]:
        self.x += DIST_WORLD
    elif key[pygame.K_d]:
        self.x -= DIST_WORLD

我希望这有帮助!如果代码没有做到这一点,我很抱歉,但至少,我希望我在代码之前的评论能提供一些见解。在

相关问题 更多 >

    热门问题