Skip to main content

Pygame keyError

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

Popular posts from this blog

How to split a rinex file if I need 24 hours data

Trying to divide rinex file using the command gfzrnx but getting this error. While doing that getting this error msg 'gfzrnx' is not recognized as an internal or external command Trying to split rinex file using the command gfzrnx. also install'gfzrnx'. my doubt is I need to run this program in 'gfzrnx' or in 'cmdprompt'. I am expecting a rinex file with 24 hrs or 1 day data.I Have 48 hrs data in RINEX format. Please help me to solve this issue. source https://stackoverflow.com/questions/75385367/how-to-split-a-rinex-file-if-i-need-24-hours-data

ValueError: X has 10 features, but LinearRegression is expecting 1 features as input

So, I am trying to predict the model but its throwing error like it has 10 features but it expacts only 1. So I am confused can anyone help me with it? more importantly its not working for me when my friend runs it. It works perfectly fine dose anyone know the reason about it? cv = KFold(n_splits = 10) all_loss = [] for i in range(9): # 1st for loop over polynomial orders poly_order = i X_train = make_polynomial(x, poly_order) loss_at_order = [] # initiate a set to collect loss for CV for train_index, test_index in cv.split(X_train): print('TRAIN:', train_index, 'TEST:', test_index) X_train_cv, X_test_cv = X_train[train_index], X_test[test_index] t_train_cv, t_test_cv = t[train_index], t[test_index] reg.fit(X_train_cv, t_train_cv) loss_at_order.append(np.mean((t_test_cv - reg.predict(X_test_cv))**2)) # collect loss at fold all_loss.append(np.mean(loss_at_order)) # collect loss at order plt.plot(np.log(al...

Sorting large arrays of big numeric stings

I was solving bigSorting() problem from hackerrank: Consider an array of numeric strings where each string is a positive number with anywhere from to digits. Sort the array's elements in non-decreasing, or ascending order of their integer values and return the sorted array. I know it works as follows: def bigSorting(unsorted): return sorted(unsorted, key=int) But I didnt guess this approach earlier. Initially I tried below: def bigSorting(unsorted): int_unsorted = [int(i) for i in unsorted] int_sorted = sorted(int_unsorted) return [str(i) for i in int_sorted] However, for some of the test cases, it was showing time limit exceeded. Why is it so? PS: I dont know exactly what those test cases were as hacker rank does not reveal all test cases. source https://stackoverflow.com/questions/73007397/sorting-large-arrays-of-big-numeric-stings