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 show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console...

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