【问题标题】:Pygame strange collision detectionPygame 奇怪的碰撞检测
【发布时间】:2022-02-19 03:20:16
【问题描述】:

我想尝试用pygame制作平台游戏。

出于某种原因,如果我只检查 x 或 y 碰撞,一切正常,但只要我每次我的玩家撞到地面或天花板时都检查它们,它就会传送到方块的一侧。我尝试了一些打印语句来验证是否发生了碰撞,如果两个碰撞检查都在玩家落地时激活,而不检查它在侧面传送的碰撞,则它没有。

这是我的代码,使用collision_x()collision_y() 方法处理冲突:

       # Get player input
    def get_player_input(self):
        global do_move, player_speed_y, player_speed_x
        do_move = True
        key = pygame.key.get_pressed()
        if key[pygame.K_d] and do_move:
            self.player.move_ip(player_speed_x, 0)
            self.pos_0_x = self.player.x + player_speed_x
        elif key[pygame.K_a] and do_move:
            self.player.move_ip(-player_speed_x, 0)
            self.pos_0_x = self.player.x - player_speed_x

        elif key[pygame.K_s] and do_move:
            self.player.move_ip(0, player_speed_y)
            self.pos_0_y = self.player.y + player_speed_y
        elif key[pygame.K_w] and do_move:
            self.player.move_ip(0, -player_speed_y)
            self.pos_0_y = self.player.y - player_speed_y

    # Get collisions with the player on x
    def collisions_x(self):
        global do_move, player_speed_x
        self.map_gen()
        for sprite in self.tiles.sprites():
            if sprite.rect.colliderect(self.player):
                if self.player.x > self.pos_0_x:    # Check if player is colliding on his left side
                    do_move = False
                    self.player.x = self.player.x + 1
                    self.player.y = self.pos_0_y

                if self.player.x < self.pos_0_x:  # Check if player is colliding on his right side
                    do_move = False
                    self.player.x = self.player.x - 1
                    self.player.y = self.pos_0_y

    # Get collisions with the player on y
    def collisions_y(self):
        global do_move, player_speed_y
        self.map_gen()
        for sprite in self.tiles.sprites():
            if sprite.rect.colliderect(self.player):
                if self.player.y < self.pos_0_y:  # Check if player is colliding on his bottom side
                    do_move = False
                    player_speed_y = 0
                    self.player.y = self.player.y - 1

                if self.player.y > self.pos_0_y:  # Check if player is colliding on his top side
                    do_move = False
                    self.player.y = self.player.y + 1

    # Put the player on the screen
    def update_player(self, surface):
        self.get_player_input()
        self.collisions_x()
        self.collisions_y()
        pygame.draw.rect(WIN, (200, 0, 0), self.player)

【问题讨论】:

标签: python pygame collision


【解决方案1】:

最后,我部分设法解决了这个问题。现在,碰撞发生没有问题。我现在唯一不能开始工作的是,当玩家落地时,由于某种未知的原因,它不能再向左移动了。

这是更新后的代码:

这是重力函数

def apply_gravity(self):
    self.player.y += player_speed_y + 0.5 * gravity

collisions_x() 函数处理 x 次碰撞

   def collisions_x(self):
    global player_speed_x
    self.map_gen()
    for sprite in self.tiles.sprites():
        if self.player.colliderect(sprite):
            if self.player.right > sprite.rect.right:  # Check if player is colliding on his left side
                self.player.left = sprite.rect.right
            if self.player.left < sprite.rect.left:  # Check if player is colliding on his right side
                self.player.right = sprite.rect.left

collisions_y() 函数处理 y 碰撞(目前仅向下)

def collisions_y(self):
    global player_speed_y
    for sprite in self.tiles.sprites():
        if self.player.colliderect(sprite):
            if player_speed_y > 0:
                self.player.bottom = sprite.rect.top

然后在循环中调用这个函数在屏幕上绘制所有内容

   def update_player(self, surface):
    self.get_player_input()
    self.apply_gravity()
    self.collisions_x()
    self.collisions_y()
    pygame.draw.rect(surface, (200, 0, 0), self.player)

这是一个简短的视频,表明我的问题是什么样的:

https://www.youtube.com/watch?v=IVRG0Th75YI

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多