为什么说在函数pygame中未定义左上角?

鸭鸭

我正在使用Python 2.7,也正在使用Pygame。我一直想旋转图像,这就是到目前为止。

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()

这就是所谓的函数:

rotate(screen, player, topleft, player_angle)

我不知道问题是什么,但是它说“ topleft”没有定义。确实令人困惑,因为在导入Pygame时不应该单独定义topleft吗?我在互联网上找不到任何有用的答案,所以您可以帮我吗?

拉比德76

将参数添加topleft到函数中rotate传递(x, 600)给参数:

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))

我建议从函数返回碰撞盒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)

请参阅如何使用PyGame围绕其中心旋转图像?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么NavigationView中的动画从左上角开始?

为什么PyGame坐标系的原点在左上角?

为什么角半径仅应用于自定义视图的左上角和右上角?

为什么Java 2D起源在左上角?

为什么我的画布仅加载左上角的图像?

为什么图像的左上角有水印?

在KDE Windows中,左上角的按钮是什么?

Python:为什么在我调用函数时说未定义变量?

从editext中删除左上角提示

为什么jsHint说“未定义'setInterval'”

HTML为什么说我的变量未定义?

为什么我的反应表说列未定义?

为什么总是说用户未定义?

为什么我的代码说我的对象未定义?

为什么说我的变量未定义?

为什么在 Vue 3 函数中未定义“this”

为什么在eval中未定义函数?

为什么在 React 的 addEventListener 函数中未定义 props

当我尝试使用 pygame.transform.rotate 旋转它时,为什么我的精灵会重置到屏幕的左上角?

为什么我的函数未定义?

为什么函数返回未定义?

为什么窗口的左上角有一个奇怪的白色矩形?

为什么无法在Unity中使用wmctrl将窗口移至左上角?

当基础组件重新渲染时,为什么popper跳到左上角?

为什么在此... div画中的左上角有方形集会

为什么slideDown从左上角而不是整个宽度扩展图像?

例如,当我想用 <4> 使其变大时,为什么文本会移到左上角?

为什么我的函数的es6版本说“无法读取未定义的属性'forEach'”

在Sublime中,界面左上角的向左/向右箭头按钮有什么作用?