'problemes on entity instantiation?
I'm working on the pygame code for a game. I have a problem with the characters in my game: I can't instantiate characters (npcs) that aren't in the main map. As my other maps are not loaded at launch, my code gives me an error saying that the characters (npcs) of my code do not exist. How can I instantiate the characters of another map than the main one, so as not to have an error?.
Here is my code, thanks a lot for your help!
from dataclasses import dataclass
import playsound as playsound
import pygame, pytmx, pyscroll
from src.player import NPC
@dataclass
class Portal:
from_world: str
origin_point: str
target_world: str
teleport_point: str
@dataclass
class Music:
musicCarte: str # cette data classe permet de ranger les musqiue dans une liste , pareil pour les portails en haut
@dataclass
class Map:
name: str
walls: list[pygame.Rect]
group: pyscroll.PyscrollGroup
tmx_data: pytmx.TiledMap
portail: list[Portal]
# création des listes
npcs: list[NPC]
music: str
class MapManager:
def __init__(self, screen, player,):
self.maps = dict() # "house -> Map("House", walls, group)
self.screen = screen # permet davoir le screen des cartes pour l'afficher
self.player = player # donne accées au joueur
self.current_map = "CrapouliWolrd"
self.map2 = "village"
self.register_map("CrapouliWolrd", portail=[
Portal(from_world="CrapouliWolrd", origin_point="enter_house", target_world="Maison_perso",
teleport_point="spawn_house", ),
# ici on rentre les nouvelles maps avec leurs musique et leurs portails
Portal(from_world="CrapouliWolrd", origin_point="enter_Foret", target_world="Foret",
teleport_point="spawn_Foret", )],
npcs=[
NPC("Perso", nb_points=2)],
music="../music/scandinavianz-nature-7504.mp3"
)
self.register_map("Maison_perso", portail=[
Portal(from_world="Maison_perso", origin_point="exit_house", target_world="CrapouliWolrd",
teleport_point="spawn_sortie",)
], music="../music/mercantile-the-legend-of-zelda-the-wind-waker-hd-ost.mp3")
self.register_map("village", portail=[
Portal(from_world="village", origin_point="entrer_house", target_world="Maison_perso",
teleport_point="spawn_house", ),
Portal(from_world="village", origin_point="exit_village", target_world="Foret",
teleport_point="spawn_Foret", )
] , npcs=[
NPC("paul", nb_points=4),
NPC("robin", nb_points=1)
]
)
self.register_map("Foret", portail=[
Portal(from_world="Foret", origin_point="exit_foret", target_world="CrapouliWolrd",
teleport_point="spawn_zone1", ),
Portal(from_world="Foret", origin_point="enter_village", target_world="village",
teleport_point="spawn_village"),
], # music="../music/mercantile-the-legend-of-zelda-the-wind-waker-hd-ost.mp3"
)
self.teleport_player("Player")
self.teleport_npcs()
def check_collisions(self):
# portails
for Portal in self.get_map().portail:
if Portal.from_world == self.current_map:
point = self.get_object(Portal.origin_point)
rect = pygame.Rect(point.x, point.y, point.width, point.height)
if self.player.feet.colliderect(rect):
copy_portal = Portal
self.current_map = Portal.target_world
self.teleport_player(copy_portal.teleport_point)
# collision
for sprite in self.get_group().sprites():
if sprite.feet.collidelist(self.get_walls()) > -1:
sprite.move_back()
def teleport_player(self, name,):
point = self.get_object(name)
self.player.position[0] = point.x
self.player.position[1] = point.y
self.player.save_location()
#pygame.mixer.Sound(self.get_map().music).play()
def register_map(self, name, portail=[],
npcs=[], music=[]): # oublie pas de remettre la musique # on renseigne les listes ici
tmx_data = pytmx.util_pygame.load_pygame(
f"../Map/{name}.tmx") # PERMET DOUVRIR LA MAP SUIVANT SON NOM ! grace a f""
map_data = pyscroll.data.TiledMapData(tmx_data)
map_layer = pyscroll.orthographic.BufferedRenderer(map_data, self.screen.get_size())
map_layer.zoom = 3
# DEFINIt la liste des rectangle de collision
walls = [] ##et donc plus besoisn davoir self.walls pouisque le self est initialisé au debut
for obj in tmx_data.objects:
if obj.type == "colision":
walls.append(pygame.Rect(obj.x, obj.y, obj.width, obj.height))
# dessiner le groupe de calques
group = pyscroll.PyscrollGroup(map_layer=map_layer, default_layer=6)
group.add(self.player) # ici on instancie le joueur dans les calques
# RECUPERER TOUT LES NPCS POUR LES AJOUTER AU GROUPE
for npc in npcs:
group.add(npc)
# cree un onjet map
self.maps[name] = Map(name, walls, group, tmx_data, portail, npcs, music)
def get_map(self):
return self.maps[self.current_map] # CETTE FONCTIOn permet d'afficher l'actuelle carte qui est en currentmap soit ici CrapouliWOrld
def get_group(self):
return self.get_map().group # recupere le joueur dans la carte
def get_walls(self):
return self.get_map().walls # recupere les murs de la maps
def get_object(self, name):
return self.get_map().tmx_data.get_object_by_name(name)
def teleport_npcs(self):
for map in self.maps:
map_data = self.maps[map]
npcs = map_data.npcs
for npc in npcs:
npc.load_points(self)
npc.teleport_spawn()
# permet de rentrer simplement get_object pour faire allusion a un objet du decors
def draw(self):
self.get_group().draw(self.screen)
self.get_group().center(self.player.rect.center)
def update(self):
self.get_group().update()
self.check_collisions()
for npc in self.get_map().npcs:
npc.move()
Error: KeyError: 'paul_path1'
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
