Bonjour,
je programme depuis maintenant 1 an en pythons et j'ai décidé de programmer un petit jeu. Aprés avoir suivie un tuto sur le module pygame, j'ai suivie un tuto détailler pour coder le jeu (https://www.youtube.com/watch?v=ooITOxbYVTo&t=2900s malheureusement je tombe sur le code d'erreur: line 926, in get_object_by_name
return self.objects_by_name[name]
KeyError: 'enter_house'
A chaque fois que je lance la derniére partie du programme. Pourtant j'ai bien définit dans ma map Tiled l'objet 'enter_house'.
SI vous pouviez m'aider se serait trés gentils car étant débutant j'ai mis une vigtaine d'heure pour écrire ce bout de code. Si vous voulez les fichier extacte avec notamment la carte n'hésitez pas à m'envoyer un email à ***@*** .
Le code :
Main:
import pygame import pytmx import pyscroll from game import Game
if __name__=='__main__': pygame.init() game = Game() game.run()
game:
import pygame import pyscroll import pytmx
from player import Player
class Game : def __init__(self): # créer la fenetre du jeu, self.screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("pygamon (v1)")
#charger la carte depuis le tmx tmx_data = pytmx.util_pygame.load_pygame('carte.tmx') # specifier le fichier qui contitnt la carte map_data= pyscroll.data.TiledMapData(tmx_data) #extraire les donné de la carte map_layer = pyscroll.orthographic.BufferedRenderer(map_data, self.screen.get_size())# regrouper tt les calques map_layer.zoom= 2
#générer un joueur player_position = tmx_data.get_object_by_name("player") self.player =Player(player_position.x,player_position.y)
# definir une liste des rectangles de collision self.walls =[] for obj in tmx_data.objects: if obj.type == "collision": self.walls.append(pygame.Rect(obj.x,obj.y, obj.width, obj.height))
# dessiner le groupe de calque self.group = pyscroll.PyscrollGroup(map_layer=map_layer, default_layer = 10) self.group.add(self.player)
#definir le rect de collision pour entrer dans la maison enter_house =tmx_data.get_object_by_name('enter_house') self.enter_house_rect = pygame.Rect(enter_house.x,enter_house.y, enter_house.width, enter_house.height)
def switch_house(self): # créer la fenetre du jeu, self.screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("pygamon (v1)")
# charger la carte depuis le tmx tmx_data = pytmx.util_pygame.load_pygame('house.tmx') # specifier le fichier qui contitnt la carte map_data = pyscroll.data.TiledMapData(tmx_data) # extraire les donné de la carte map_layer = pyscroll.orthographic.BufferedRenderer(map_data, self.screen.get_size()) # regrouper tt les calques map_layer.zoom = 2
# definir une liste des rectangles de collision self.walls = [] for obj in tmx_data.objects: if obj.type == "collision": self.walls.append(pygame.Rect(obj.x, obj.y, obj.width, obj.height))
# dessiner le groupe de calque self.group = pyscroll.PyscrollGroup(map_layer=map_layer, default_layer=10) self.group.add(self.player)
# definir le rect de collision pour entrer dans la maison enter_house = tmx_data.get_object_by_name('enter_house') self.enter_house_rect = pygame.Rect(enter_house.x, enter_house.y, enter_house.width, enter_house.height)
#recupérer le spawn dans la maison spawn_house_point = tmx_data.get_object_by_name('spawn_house') self.player.position[0] = spawn_house_point.x self.player.position[1] = spawn_house_point.y-20
def switch_world(self): # créer la fenetre du jeu, self.screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("pygamon (v1)")
# charger la carte depuis le tmx tmx_data = pytmx.util_pygame.load_pygame('carte.tmx') # specifier le fichier qui contitnt la carte map_data = pyscroll.data.TiledMapData(tmx_data) # extraire les donné de la carte map_layer = pyscroll.orthographic.BufferedRenderer(map_data, self.screen.get_size()) # regrouper tt les calques map_layer.zoom = 2
# definir une liste des rectangles de collision self.walls = [] for obj in tmx_data.objects: if obj.type == "collision": self.walls.append(pygame.Rect(obj.x, obj.y, obj.width, obj.height))
# dessiner le groupe de calque self.group = pyscroll.PyscrollGroup(map_layer=map_layer, default_layer=10) self.group.add(self.player)
# definir le rect de collision pour entrer dans la maison enter_house = tmx_data.get_object_by_name('enter_house') self.enter_house_rect = pygame.Rect(enter_house.x, enter_house.y, enter_house.width, enter_house.height)
# recupérer le spawn dans la maison spawn_house_point = tmx_data.get_object_by_name('enter_house_exit') self.player.position[0] = spawn_house_point.x self.player.position[1] = spawn_house_point.y + 20
def update(self): self.group.update() self.map=1 #verifier entré dans la maison if self.map==1 and self.player.feet.colliderect(self.enter_house_rect): self.switch_house() self.map =2
if self.map ==2 and self.player.feet.collidelist(self.enter_house_rect): self.switch_world() self.map =1
#vérification collision for sprite in self.group.sprites(): if sprite.feet.collidelist(self.walls) > -1 : sprite.move_back()
def run(self): clock = pygame.time.Clock() # maitenir la fenetre + pouvoir la fermer running = True while running:
self.player.save_location() self.handle_input() self.update() self.group.center(self.player.rect) #centrer la caméra sur le joueur self.group.draw(self.screen) # dessiner la carte pygame.display.flip() # on actualise
for event in pygame.event.get(): if event.type == pygame.QUIT: running = False clock.tick( 60)
pygame.quit()
player:
import pygame class Player(pygame.sprite.Sprite) : #charge l'image def __init__(self, x,y): super().__init__() self.sprite_sheet = pygame.image.load('player.png') self.image =self.get_image(0, 0) self.image.set_colorkey([0,0,0]) #enleve la couleur noir du fond du joueur self.rect =self.image.get_rect() self.position =[x, y] self.images= {
Que fait cette méthode get_object_by_name de cet objet tmx_data ? On peut voir le code de cette méthode ?
Je ne sais pas comment sont ordonnées les données de ta carte de jeu, mais si python râle parce qu'il ne trouve pas ce 'enter_house' dans ta map, c'est qu'elle n'y est pas. Tu n'aurais pas fait une erreur de casse de caractères ? Sinon, montre également les quelques lignes de ta map où se situe cette valeur enter_house.
La ligne 926, c'est laquelle ? des
get_object_by_name('enter_house')
, il y en a plusieurs dans ton code.
Montre aussi le traceback complet de l'erreur que python indique.