I have run into a big road block as my code is not updating points and health when player collides with coins or falls in pits. I have successfully created my own map and assigned all properties. The id of my gold coin is 163. I have spent a week now reviewing my code but can't see where the issue is; especially with collision not updating points either in console or on the screen. More confusing is the keyError concerning id. Not sure why since I am using exactly the id for the coin as printed in the console and same as in my tiled map. Here is my main code and the fetch_properties code.
def run(self):
player_right_frame = 0 # index to track members of right image list
player_left_frame = 0 # index to track members of left image list
player_jump_frame = 0 # index to track jumping image
quit = False
player_speed = 10
player_health = 100 #allows decrement of health of player
player_points = 0
clock = pygame.time.Clock()
direction = 'stand' # by default, sprite starts by standing
ground_position = self.screen.get_height() - 355
x = 170
y = ground_position
while not quit:
self.redraw()
points_image = self.font.render(f"Points: {player_points}", 1, white)
health_image = self.font.render(f'Health: {player_health}', 1, yellow)
self.screen.blit(points_image, (100, 5))
self.screen.blit(health_image, (200, 5))
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
quit = True
if event.key == K_RETURN:
pause = False
elif event.type == KEYUP:
direction = 'stand'
elif event.type == QUIT:
quit = True
keys = pygame.key.get_pressed() # checking pressed keys
if keys[K_UP]:
# check to see if solid tile is above the player
above_tile = fetch_tile_properties(self.tmx_data, x + image_width, y - player_speed,self.view_hole)
if not above_tile['solid']:
y -= player_speed
# check to see if player is on ground to allow a jump
if on_tile['ground']:
player_jump_frame = 10
elif keys[K_DOWN]:
pass # no longer needed since gravity takes care of coming down
if keys[K_RIGHT]:
right_tile = fetch_tile_properties(self.tmx_data, x + image_width + player_speed, y + image_height/2, self.view_hole)
if not right_tile['solid']:
# move right
x += player_speed
direction = 'right'
# check property of tile player is standing on now
elif keys[K_LEFT]:
left_tile = fetch_tile_properties(self.tmx_data, x - player_speed, y + image_height/2, self.view_hole)
if not left_tile['solid']:
# move left
x -= player_speed
direction = 'left'
# check property of tile player is standing on now
on_tile = fetch_tile_properties(
self.tmx_data, x + image_width/2, y + image_height, self.view_hole)
# Check player collision
collided = fetch_tile_properties(self.tmx_data, x + image_width, y, self.view_hole)
player_health = player_health + collided['health']
player_points = player_points + collided['points']
# Quit game once player is out of life
if player_health <= 0:
quit = True
# Remove coin that is collected by player via collision check
if collided['id'] == 163:
player_points = player_points + collided['points']
tile_x = collided['x']
tile_y = collided['y']
# remove coin touched from tmx_data
self.tmx_data.layers[0].data[tile_y][tile_y] = 0
# self.tmx_data.layers[0].remove(tile_x, tile_y)
print(on_tile) # testing to see if points or health change values
# check if player is jumping up
if player_jump_frame > 0:
y -= player_speed
direction = 'up'
player_jump_frame = player_jump_frame - 1
# check if player is on a solid otherwise fall down
elif on_tile['ground'] == False:
direction = 'down'
y += player_speed
def fetch_tile_properties(tmxdata, x, y, view_hole):
view_x = x - view_hole[0]
view_y = y - view_hole[1]
tile_x = view_x // 35 # scaling by size of the tile
tile_y = view_y // 35 # ensuring only the integer value of division
try:
properties = tmxdata.get_tile_properties(
tile_x, tile_y, 0) # this would be a dictionary returned
except ValueError:
properties = {id: -1, 'canClimb': False, 'ground': False, 'health': -99999,
'points': 0, 'provide': '', 'require': '', 'solid' : False
}
# check if player is moving in free space, no tiles beneath it
if properties is None:
# specify defined custom properties since the get_properties function only
# works for where there is a tile. Use id of -1 to check error
# and free space motion
properties = {id: -1, 'canClimb': False, 'ground': False, 'health': 0,
'points': 0, 'provide': '', 'require': '', 'solid': False}
# Since properties is a dictionary, we can append extra data to it
# useful data would be the position of the tile player is colliding wit
# or standing on
properties['x'] = tile_x
properties['y'] = tile_y
return properties
source https://stackoverflow.com/questions/73015011/pygame-keyerror
Comments
Post a Comment