简体   繁体   中英

Why does it say that top left is not defined in a function pygame?

I'm using Python 2.7 and I'm also using Pygame. I've been wanting to rotate an image and this is what I've got so far.

import pygame, random
from random import randint
# add parking lot, hunger bar, water bar, shops, drive-thrus, etc...
# add AI car/cars, police cars when going over 30 speed at the road(5 speed in parking lot/drive thru), does not crash when hitting building/other cars(only gets hit back)
# make turning animation
pygame.init()

done = False

x = 465
when = 0
road_stripe_y = 0
road_stripe_y2 = 250
road_stripe_y3 = 500
road_stripe_y4 = 700
speed = 0
gear = 1
ai_car_y = 0
parking_lot_y = -400
player_angle = 0

ground = (50, 100, 0)
road = (64, 64, 64)
black = (0, 0, 0)
white = (255, 255, 255)

screen = pygame.display.set_mode((1000, 800))
screen.fill(ground)

player = pygame.image.load('racing car copy.png')
ai_car = pygame.image.load('ai_racing car.png')
road_stripe = pygame.image.load('costume1 copy.png')

font = pygame.font.Font('freesansbold.ttf', 40)
text = font.render('Gear', True, black, ground)
text2 = font.render(str(gear), True, black, ground)
text2_rect = text2.get_rect()
text_rect = text.get_rect()
text_rect.center = (100, 100)
text2_rect.center = (100, 150)

screen.blit(player, (x, 600))
clock = pygame.time.Clock()

def rotate(screen, player, topleft, player_angle):
    rotated_player = pygame.transform.rotate(player, player_angle)
    new_player_rect = rotated_player.get_rect(center = player.get_rect(topleft = topleft).center)
    screen.blit(rotated_player, new_player_rect.topleft)

while not done == True:
    global gear
    global left
    global right
    pygame.event.get()
    pygame.display.flip()
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_ESCAPE]:
        done = True
    if pressed[pygame.K_a]:
        if not x >= 670 and not speed == 0:
            x += speed/4
    if pressed[pygame.K_d] and not speed == 0:
        if not x <= 280:
            x -= speed/4
    rotate(screen, player, topleft, player_angle)
    player_collison_box = player.get_rect(topleft=(x, 600))
    if pressed[pygame.K_w]:
        if not speed >= 5 and gear == 1:
            speed += 1
        elif not speed >= 15 and gear == 2:
            speed += 1
        elif not speed >= 30 and gear == 3:
            speed += 1
        elif not speed >= 40 and gear == 4:
            speed += 1
        elif not speed >= 80 and gear == 5:
            speed += 1
    else:
        if not speed <= 0:
            speed -= 1
    if speed >= 15 and gear == 2:
        speed -= 1
    if speed >= 5 and gear == 1:
        speed -= 1
    if speed >= 30 and gear == 3:
        speed -= 1
    if speed >= 40 and gear == 4:
        speed -= 1
    if speed >= 80 and gear == 5:
        speed -= 1
    if pressed[pygame.K_1]:
        gear = 1
    elif pressed[pygame.K_2]:
        gear = 2
    elif pressed[pygame.K_3]:
        gear = 3
    elif pressed[pygame.K_4]:
        gear = 4
    elif pressed[pygame.K_5]:
        gear = 5
    screen.fill(ground)
    pygame.draw.rect(screen, road, (240 + x - 465, 0, 500, 1000))
    parking_lot_y += speed
    pygame.draw.rect(screen, road, (400, parking_lot_y, 600, 800))
    screen.blit(road_stripe, (490 + x - 465, road_stripe_y))
    screen.blit(road_stripe, (490 + x - 465, road_stripe_y2))
    screen.blit(road_stripe, (490 + x - 465, road_stripe_y3))
    screen.blit(road_stripe, (490 + x - 465, road_stripe_y4))
    road_stripe_y += speed
    road_stripe_y2 += speed
    road_stripe_y3 += speed
    road_stripe_y4 += speed
    if road_stripe_y >= 850:
        road_stripe_y = -100
    if road_stripe_y2 >= 850:
        road_stripe_y2 = -100
    if road_stripe_y3 >= 850:
        road_stripe_y3 = -100
    if road_stripe_y4 >= 850:
        road_stripe_y4 = -100
    ai_car_y += speed + 30
    if ai_car_y >= 3000:
        ai_car_y = -100
    screen.blit(player, (465, 600))
    text2 = font.render(str(gear), True, black, ground)
    screen.blit(text, text_rect)
    screen.blit(text2, text2_rect)
    screen.blit(ai_car, (325 + x - 465, ai_car_y))
    clock.tick(40)

pygame.quit()

This is what calls the function:

rotate(screen, player, topleft, player_angle)

I don't know what the problem is, but it says that 'topleft' isn't defined. It's really confusing because shouldn't topleft be defined on its own when I imported Pygame? I couldn't find any useful answers on the internet so can you help me?

Add the argument topleft to the function rotate . Pass (x, 600) to the argument:

def rotate(screen, player, topleft, player_angle):
    rect = player.get_rect(topleft = topleft)
    rotated_player = pygame.transform.rotate(player, player_angle)
    new_player_rect = rotated_player.get_rect(center = rect.center)
    screen.blit(rotated_player, new_player_rect.topleft)
rotate(screen, player, (x, 600), player_angle)
player_collison_box = player.get_rect(topleft=(x, 600))

I recommend to return the collision box from the function rotate :

def rotate(screen, player, topleft, player_angle):
    rect = player.get_rect(topleft = topleft)
    rotated_player = pygame.transform.rotate(player, player_angle)
    new_player_rect = rotated_player.get_rect(center = rect.center)
    screen.blit(rotated_player, new_player_rect.topleft)
    return new_player_rect 
player_collison_box = rotate(screen, player, (x, 600), player_angle)

See How do I rotate an image around its center using PyGame?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM