闯关游戏人物卡进地图

地图移动时为什么人物会卡进地图,地图不移动人物移动就不会卡进地图(请求讲解)

import pygame
import sys
import find

pygame.init()

file = find.File()
data = file.read()
photo = find.data
level = file.read('code/data/level.dat')

class Game:
    def __init__(self, x, y):
        self.screen = pygame.display.set_mode((x, y))
        pygame.display.set_caption('Pixel Level Game')
        self.font = pygame.font.Font(pygame.font.match_font('comicsansms'), 36)
        self.hero = pygame.image.load('code/images/hero.png')
        self.hero_x = 0
        self.hero_y = 550
        self.mask_map = []
        self.mask_map_pos = []
        self.venom_mask = []
        self.venom_mask_pos = []
        self.level = level
        self.speed = 0
        self.map_x = 0
        self.map_move = False
        self.down = 0
        self.up = False
        self.over = False

    def map_draw(self):
        self.mask_map = []
        self.venom_mask = []
        self.mask_map_pos = []
        self.venom_mask_pos = []
        for p in photo:
            for pos in data[self.level][p]:
                image = pygame.image.load('code/images/Tiles/' + p)
                self.screen.blit(image, (pos[0] - self.map_x, pos[1]))
                if 'brick' in p or 'ConveyorBelt' in p or 'IronBlock' in p or 'IronPlate' in p or 'pipe' in p:
                    self.mask_map.append(pygame.mask.from_surface(image))
                    self.mask_map_pos.append((pos[0] - self.map_x, pos[1]))
                elif 'venom' in p:
                    self.venom_mask.append(pygame.mask.from_surface(image))
                    self.venom_mask_pos.append((pos[0] - self.map_x, pos[1]))

    def level_draw(self):
        w, h = self.font.size('Level: ' + str(self.level + 1))
        self.screen.blit(self.font.render('Level: ' + str(self.level + 1), True, (240, 190, 0)), (405 - w / 2, 0))

    def over_draw(self):
        w, h = self.font.size('Game Over!')
        self.screen.blit(self.font.render('Game Over!', True, 'red'), (405 - w / 2, 315 - h / 2))

    def Vic(self):
        global level
        win = True
        for p in photo:
            for pos in data[self.level][p]:
                if pos[0] > self.hero_x:
                    win = False
        if win:
            level += 1
            if len(data) < self.level:
                file.into(self.level, 'code/data/level.dat')
                sys.exit()
            self.__init__(810, 630)

    def draw(self):
        self.screen.fill((80, 190, 220))
        self.map_draw()
        self.screen.blit(self.hero, (self.hero_x, self.hero_y))
        if self.over:
            self.over_draw()
        self.level_draw()

    def keys(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                file.into(self.level, 'code/data/level.dat')
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and not self.over:
                    self.speed = -3
                elif event.key == pygame.K_RIGHT and not self.over:
                    self.speed = 3
                elif event.key == pygame.K_UP and not self.up and not self.over:
                    self.down = -3
                    self.up = True
                elif event.key == pygame.K_SPACE and self.over:
                    self.__init__(810, 630)
            elif event.type == pygame.KEYUP:
                self.speed = 0
        number = 0
        if not self.map_move:
            self.hero_x += self.speed
            for m in self.mask_map:
                if m.overlap(pygame.mask.from_surface(self.hero), (self.hero_x - self.mask_map_pos[number][0], self.hero_y - self.mask_map_pos[number][1])):
                    self.hero_x -= self.speed
                number += 1
            if self.hero_x >= 398:
                self.map_move = True
        elif self.map_move:
            number = 0
            self.map_x += self.speed
            for m in self.mask_map:
                if m.overlap(pygame.mask.from_surface(self.hero), (self.hero_x - self.mask_map_pos[number][0], self.hero_y - self.mask_map_pos[number][1])):
                    self.map_x -= (self.speed * 1.1)
                    self.speed = 0
                number += 1
        self.hero_y += self.down
        number = 0
        for m in self.mask_map:
            if m.overlap(pygame.mask.from_surface(self.hero), (self.hero_x - self.mask_map_pos[number][0], self.hero_y - self.mask_map_pos[number][1])):
                self.hero_y -= self.down
                if self.up and self.down > 0:
                    self.up = False
            number += 1
        number = 0
        for v in self.venom_mask:
            if v.overlap(pygame.mask.from_surface(self.hero), (self.hero_x - self.venom_mask_pos[number][0], self.hero_y - self.venom_mask_pos[number][1])):
                self.over = True
            number += 1
        self.down += 0.1

    @staticmethod
    def update():
        Clock = pygame.time.Clock()
        Clock.tick(60)
        pygame.display.update()


game = Game(810, 630)
def main():
    while True:
        game.draw()
        game.keys()
        game.update()


if __name__ == '__main__':
    main()

什么叫卡进地图?是人跟着地图一起动吗

【以下回答由 GPT 生成】

这个问题可能是由于以下几个原因导致的:

  1. 地图移动时,人物的位置计算错误:在移动地图的过程中,可能没有正确地更新人物的位置。需要对人物位置的计算进行检查,确保在地图移动时正确更新人物的坐标。

  2. 地图边界检测错误:在移动地图的过程中,可能没有正确地检测地图边界,导致人物越界进入地图。需要对地图边界进行严格的检测,确保人物不能越过地图边界。

  3. 地图碰撞检测错误:在移动地图的过程中,可能没有正确地检测人物和地图物体的碰撞,导致人物卡进地图。需要使用适当的碰撞检测算法,如pygame的碰撞蒙版检测功能,确保人物能够正确地与地图物体进行碰撞检测。

以下是对代码的一些建议:

  1. map_draw方法中,需要更新人物的坐标,即self.hero_xself.hero_y,以确保人物能够正确地在地图上移动。

  2. 在移动地图时,需要检测地图边界。可以使用屏幕宽度与地图宽度的差值来进行边界检测。如果地图的x坐标小于0或大于地图宽度减去屏幕宽度,则停止移动地图。

  3. 在碰撞检测中,可以使用pygame的碰撞蒙版功能来进行物体间的碰撞检测。在map_draw方法中,可以创建人物的碰撞蒙版,并与地图物体的碰撞蒙版进行检测,以判断是否发生碰撞。

  4. 在碰撞检测后,需要对人物的位置进行调整,以防止人物卡进地图。可以将人物的坐标设置为与碰撞物体的边界相交的位置,以确保人物的位置不会卡进地图。

请注意,以上是一些常见的解决方案和建议。如果问题仍然存在,可能需要进一步检查代码和逻辑,以找出更具体的问题所在。如果你有代码的其他部分或更详细的问题描述,可以提供给我,我将尽力帮助解决问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

python调试三板斧 https://ask.csdn.net/questions/7908322/54130133