地图移动时为什么人物会卡进地图,地图不移动人物移动就不会卡进地图(请求讲解)
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 生成】
这个问题可能是由于以下几个原因导致的:
地图移动时,人物的位置计算错误:在移动地图的过程中,可能没有正确地更新人物的位置。需要对人物位置的计算进行检查,确保在地图移动时正确更新人物的坐标。
地图边界检测错误:在移动地图的过程中,可能没有正确地检测地图边界,导致人物越界进入地图。需要对地图边界进行严格的检测,确保人物不能越过地图边界。
地图碰撞检测错误:在移动地图的过程中,可能没有正确地检测人物和地图物体的碰撞,导致人物卡进地图。需要使用适当的碰撞检测算法,如pygame的碰撞蒙版检测功能,确保人物能够正确地与地图物体进行碰撞检测。
以下是对代码的一些建议:
在map_draw
方法中,需要更新人物的坐标,即self.hero_x
和self.hero_y
,以确保人物能够正确地在地图上移动。
在移动地图时,需要检测地图边界。可以使用屏幕宽度与地图宽度的差值来进行边界检测。如果地图的x坐标小于0或大于地图宽度减去屏幕宽度,则停止移动地图。
在碰撞检测中,可以使用pygame的碰撞蒙版功能来进行物体间的碰撞检测。在map_draw
方法中,可以创建人物的碰撞蒙版,并与地图物体的碰撞蒙版进行检测,以判断是否发生碰撞。
在碰撞检测后,需要对人物的位置进行调整,以防止人物卡进地图。可以将人物的坐标设置为与碰撞物体的边界相交的位置,以确保人物的位置不会卡进地图。
请注意,以上是一些常见的解决方案和建议。如果问题仍然存在,可能需要进一步检查代码和逻辑,以找出更具体的问题所在。如果你有代码的其他部分或更详细的问题描述,可以提供给我,我将尽力帮助解决问题。
【相关推荐】
python调试三板斧 https://ask.csdn.net/questions/7908322/54130133