Python Pygame-缩放到长度不工作100%的时间

Python Pygame-缩放到长度不工作100%的时间,python,python-3.x,pygame,Python,Python 3.x,Pygame,我做了一个pygame游戏,两辆车围绕一个足球场比赛,并试图进球。我添加了一个boost功能,只要按下up按钮,倒计时计时器就会启动,当不再按下该键时,倒计时计时器就会停止。当计时器=0时,增压功能停止。这在70-80%的情况下都能正常工作,但会出现奇怪的小故障 (小故障1)有时,即使在松开向上箭头后,提升的速度仍保持不变,计时器也不会打开 (小故障2)另一个奇怪的小故障是当boosttimer变为0时,用户按住向上和一个侧向箭头,然后放开侧向箭头(向左或向右),提升的速度仍然显示 下面是我的代

我做了一个pygame游戏,两辆车围绕一个足球场比赛,并试图进球。我添加了一个boost功能,只要按下up按钮,倒计时计时器就会启动,当不再按下该键时,倒计时计时器就会停止。当计时器=0时,增压功能停止。这在70-80%的情况下都能正常工作,但会出现奇怪的小故障

(小故障1)有时,即使在松开向上箭头后,提升的速度仍保持不变,计时器也不会打开

(小故障2)另一个奇怪的小故障是当boosttimer变为0时,用户按住向上和一个侧向箭头,然后放开侧向箭头(向左或向右),提升的速度仍然显示

下面是我的代码,希望有人能帮忙

import pygame
from pygame.math import Vector2
import time

pygame.font.init()
pygame.init()


WIDTH = 1150
HEIGHT = 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Rocket League")
clock = pygame.time.Clock()
start_ticks = pygame.time.get_ticks()
REDGOAL = pygame.Surface((50, 150), pygame.SRCALPHA)
REDGOAL.fill((255, 0, 0))
redgoal_rect = REDGOAL.get_rect(topleft=(0, 340))
redgoal_mask = pygame.mask.from_surface(REDGOAL)


REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
    REDCAR_ORIGINAL, (255, 0, 0), [(0, 30), (50, 20), (50, 10), (0, 0)])
redangle = 180
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)

redspeed = 5
dx = 0
dy = 0
x = 800
y = 500
pos_red = Vector2(x,y)
vel_red = Vector2(-redspeed,0)
redrect = redcar.get_rect(center=pos_red)
redangle = 180
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
mask_red = pygame.mask.from_surface(redcar)
def starttimer():
    global timer
    timer -= dt

def starttimer1():
    global timer1
    timer1 -= dt





def redboost():
    font4 = pygame.font.Font(None, 72)
    timer10 = int(timer)
    timer11 = round(timer10, 1)
    timer12 = str(timer11)
    global timer13
    timer13 = font4.render(timer12, False, (255,0,0))


timer = 3
dt = 1

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False


    redboost()
    print(timer)



    if redrect.top < 0 and vel_red.y < 0:
        redrect.top = 0
        pos_red = Vector2(redrect.center)
    elif redrect.bottom > screen.get_height() and vel_red.y > 0:
        redrect.bottom = screen.get_height()
        pos_red = Vector2(redrect.center)
    if redrect.left < 0 and vel_red.x < 0:
        redrect.left = 0
        pos_red = Vector2(redrect.center)
    elif redrect.right > screen.get_width() and vel_red.x > 0:
        redrect.right = screen.get_width()
        pos_red = Vector2(redrect.center)


    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        redangle += 5
        vel_red.rotate_ip(-5)
        redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pygame.mask.from_surface(redcar)
    elif keys[pygame.K_RIGHT]:
        redangle -= 5
        vel_red.rotate_ip(5)
        redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pygame.mask.from_surface(redcar)
    elif keys[pygame.K_UP]:
        vel_red.scale_to_length(10)
        starttimer()


    if  keys[pygame.K_UP] and keys[pygame.K_RIGHT]:
        starttimer()

    elif  keys[pygame.K_UP] and keys[pygame.K_LEFT]:
        starttimer()

    elif  keys[pygame.K_UP] and keys[pygame.K_LEFT] and keys [pygame.K_RIGHT]:
        starttimer()






    if event.type == pygame.KEYUP:
        if event.key == pygame.K_UP:
            vel_red.scale_to_length(5)

    elif timer <= 0:
        vel_red.scale_to_length(5)



    elif keys[pygame.K_DOWN]:
        vel_red.scale_to_length(2)

    pos_red += vel_red
    redrect.center = pos_red

    if timer <= 0:
        timer = 0
        vel_red.scale_to_length(5)
    elif timer == 0:
        timer = 0
        vel_red.scake_to_length(5)


    if keys[pygame.K_UP] and timer == 0:
        vel_red.scale_to_length(5)


    screen.fill((50,200,50))
    screen.blit(redcar, redrect)
    screen.blit(timer13, (950,750))


    pygame.display.flip()
    pygame.display.update()
    dt = clock.tick(30)/1000
导入pygame
从pygame.math导入向量2
导入时间
pygame.font.init()
pygame.init()
宽度=1150
高度=800
screen=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题(“火箭联盟”)
clock=pygame.time.clock()
start\u ticks=pygame.time.get\u ticks()
REDGOAL=pygame.Surface((50150),pygame.SRCALPHA)
REDGOAL.fill((255,0,0))
redgoal_rect=redgoal.get_rect(左上方=(0340))
redgoal\u mask=pygame.mask.from\u surface(redgoal)
REDCAR_ORIGINAL=pygame.Surface((50,30),pygame.SRCALPHA)
pygame.draw.polygon(
红车原版,(255,0,0),[(0,30),(50,20),(50,10),(0,0)])
红色角度=180
redcar=pygame.transform.rotate(redcar\u原始,redangle)
redspeed=5
dx=0
dy=0
x=800
y=500
位置红色=矢量2(x,y)
vel_red=矢量2(-redspeed,0)
redrect=redcar.get_rect(中心=pos_red)
红色角度=180
redcar=pygame.transform.rotate(redcar\u原始,redangle)
mask_red=pygame.mask.from_surface(redcar)
def starttimer():
全局计时器
定时器-=dt
def starttimer1():
全局计时器1
定时器1-=dt
def redboost():
font4=pygame.font.font(无,72)
定时器10=int(定时器)
timer11=四舍五入(timer10,1)
timer12=str(timer11)
全球时间13
timer13=font4.render(timer12,False,(255,0,0))
计时器=3
dt=1
运行=真
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
redboost()
打印(计时器)
如果redrect.top<0且vel_red.y<0:
redrect.top=0
位置红色=矢量2(红色直线中心)
elif redrect.bottom>screen.get_height()和vel_red.y>0:
redrect.bottom=screen.get_height()
位置红色=矢量2(红色直线中心)
如果redrect.left<0且vel_red.x<0:
redrect.left=0
位置红色=矢量2(红色直线中心)
elif redrect.right>screen.get_width()和vel_red.x>0:
redrect.right=screen.get_width()
位置红色=矢量2(红色直线中心)
keys=pygame.key.get_pressed()
如果键[pygame.K_左]:
红色角度+=5
红色水平。旋转ip(-5)
redcar=pygame.transform.rotate(redcar\u原始,redangle)
redrect=redcar.get_rect(center=redrect.center)
mask_red=pygame.mask.from_surface(redcar)
elif keys[pygame.K_RIGHT]:
红色角度-=5
红色水平。旋转ip(5)
redcar=pygame.transform.rotate(redcar\u原始,redangle)
redrect=redcar.get_rect(center=redrect.center)
mask_red=pygame.mask.from_surface(redcar)
elif keys[pygame.K_UP]:
红色水平刻度至长度(10)
starttimer()
如果键[pygame.K_UP]和键[pygame.K_RIGHT]:
starttimer()
elif键[pygame.K_向上]和键[pygame.K_向左]:
starttimer()
elif keys[pygame.K_UP]和keys[pygame.K_LEFT]以及keys[pygame.K_RIGHT]:
starttimer()
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_UP:
红色水平刻度至长度(5)

elif timer我重新排列事件处理代码,并在事件循环中缩放速度向量,而不是在主循环中缩放速度向量,以开始提升。那么什么时候↑ 按下时,缩放向量一次,然后在释放键时将其重置。在while循环中,您仍然可以检查
if键[pygame.K_UP]:
以减少计时器,如果计时器为0: redrect.bottom=screen.get_height() 位置红色=矢量2(红色直线中心) 如果redrect.left<0且vel_red.x<0: redrect.left=0 位置红色=矢量2(红色直线中心) elif redrect.right>screen.get_width()和vel_red.x>0: redrect.right=screen.get_width() 位置红色=矢量2(红色直线中心) 屏幕填充((50200,50)) 屏幕。blit(redcar、redrect) pygame.display.set_标题(“{.2f}.”格式(计时器)) #调用display.flip或display.update,但不能同时调用两者。 pygame.display.flip() dt=时钟滴答声(30)/1000 pygame.quit()
为什么之前有一个没有if的elif?很抱歉,这是本问题中没有提到的其他代码的一部分。请发布一个。很抱歉,提供的代码片段不起作用。它通过了一个关于
elif
的错误,该错误位于代码中,并且没有伴随
if
。此外,该代码似乎没有任何输出机制;打印故障速度或显示图形。如果没有这些修复,似乎不可能回答您的问题。对不起,昨天一整天都不在,但我将代码编辑为最低限度,非常感谢,效果非常好,我从未想过将Keydown放入事件循环中,非常有用
import pygame
from pygame.math import Vector2


pygame.init()

WIDTH = 1150
HEIGHT = 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Rocket League")
clock = pygame.time.Clock()

REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
    REDCAR_ORIGINAL, (255, 0, 0), [(0, 30), (50, 20), (50, 10), (0, 0)])
redangle = 180
redspeed = 5
x = 800
y = 500
pos_red = Vector2(x,y)
vel_red = Vector2(-redspeed,0)
redrect = redcar.get_rect(center=pos_red)
redangle = 180
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
mask_red = pygame.mask.from_surface(redcar)

timer = 3
dt = 1

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == pygame.KEYDOWN:
            # Start boosting.
            if event.key == pygame.K_UP:
                vel_red.scale_to_length(10)
            # Slow down.
            elif event.key == pygame.K_DOWN:
                vel_red.scale_to_length(2)
        elif event.type == pygame.KEYUP:
            # Stop boosting. Reset the velocity.
            if event.key == pygame.K_UP:
                vel_red.scale_to_length(5)
            elif event.key == pygame.K_DOWN:
                vel_red.scale_to_length(5)

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        redangle += 5
        vel_red.rotate_ip(-5)
        redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pygame.mask.from_surface(redcar)
    elif keys[pygame.K_RIGHT]:
        redangle -= 5
        vel_red.rotate_ip(5)
        redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
        redrect = redcar.get_rect(center=redrect.center)
        mask_red = pygame.mask.from_surface(redcar)

    if keys[pygame.K_UP]:  # If boosting.
        timer -= dt

    if timer <= 0:  # Reset the velocity.
        timer = 0
        vel_red.scale_to_length(5)

    # Movement.
    pos_red += vel_red
    redrect.center = pos_red

    # Bounds checking.
    if redrect.top < 0 and vel_red.y < 0:
        redrect.top = 0
        pos_red = Vector2(redrect.center)
    elif redrect.bottom > screen.get_height() and vel_red.y > 0:
        redrect.bottom = screen.get_height()
        pos_red = Vector2(redrect.center)
    if redrect.left < 0 and vel_red.x < 0:
        redrect.left = 0
        pos_red = Vector2(redrect.center)
    elif redrect.right > screen.get_width() and vel_red.x > 0:
        redrect.right = screen.get_width()
        pos_red = Vector2(redrect.center)

    screen.fill((50,200,50))
    screen.blit(redcar, redrect)
    pygame.display.set_caption('{:.2f}'.format(timer))
    # Call either display.flip or display.update but not both.
    pygame.display.flip()
    dt = clock.tick(30)/1000

pygame.quit()