KheyError self.object_by_name()

Fermé
blacksior - 17 juin 2022 à 18:37
 hibou_joyeux - 18 juin 2022 à 13:17
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 handle_input(self):
pressed = pygame.key.get_pressed()

if pressed[pygame.K_DOWN]:
self.player.move_haut()
self.player.change_animation('down')
elif pressed[pygame.K_UP]:
self.player.move_bas()
self.player.change_animation('up')
elif pressed[pygame.K_LEFT]:
self.player.move_gauche()
self.player.change_animation('left')
elif pressed[pygame.K_RIGHT]:
self.player.move_droite()
self.player.change_animation('right')

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= {

'down' : self.get_image(0, 0),
'left' : self.get_image(0,32),
'right': self.get_image(0,64),
'up': self.get_image(0,96)
}
self.feet=pygame.Rect(0,0,self.rect.width*0.5, 12)
self.old_position = self.position.copy()
self.speed = 2

def save_location(self):
self.old_position=self.position.copy()



def change_animation(self, name):
self.image= self.images[name]
self.image.set_colorkey((0,0,0))



def move_droite(self):
self.position[0] += self.speed

def move_gauche(self):
self.position[0] -= self.speed

def move_haut(self):
self.position[1] += self.speed

def move_bas(self):
self.position[1] -= self.speed



def update (self): #met a jour la position du joueur
self.rect.topleft = self.position
self.feet.midbottom = self.rect.midbottom

def move_back(self):
self.position =self.old_position
self.rect.topleft = self.position
self.feet.midbottom = self.rect.midbottom




def get_image(self, x, y):
image = pygame.Surface([32,32])
image.blit(self.sprite_sheet,(0,0), (x,y,32,32))
return image


Merci d'avance de votre réponse .



Configuration: Windows / Chrome 102.0.0.0

1 réponse

Bonjour,

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.
0