Python pygame用浮点数平滑移动

2024-09-29 01:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我是python的新手,我正试图通过编写一个小型汽车游戏来学习pygame模块。 游戏的“引擎”是基于滚动的背景,当用户按下“向上”键时,背景会向下移动

我试图使汽车减速(当用户释放“向上”键时),而不是立即停止。 因此,我尝试使用float for loop(使用numpy模块)将背景移动的速度从5降低到0乘以-0.1,但它不能正常工作。 实际情况是,当我释放“向上”键时,游戏会冻结一秒钟,然后背景会不平稳地向下移动几个像素

这是我的代码,希望你能帮我解决:

import pygame
import numpy

pygame.init()
clock = pygame.time.Clock()
run = True

# screen & bg setting
wnw = 500
wnh = 700
wn = pygame.display.set_mode((wnw, wnh))
bgcolor = (70, 190, 255)
bg = pygame.image.load('road.jpg')
bgy = 0
bgy2 = -bg.get_height()

# loading objects
class Car():
    sprite = pygame.image.load('car.gif')
    w = 100
    h = 100
    x = 200
    y = 350
    ver_spd = 5
    hor_spd = 2
car = Car()

def drawbg():
    wn.blit(bg, (0, bgy))
    wn.blit(bg, (0, bgy2))
drawbg()

while run:

    clock.tick(60)

    # keys binding
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        if car.x + car.hor_spd > 0:
            drawbg()
            car.x -= car.hor_spd
    if keys[pygame.K_RIGHT]:
        if car.x + car.hor_spd < wnw - car.w:
            drawbg()
            car.x += car.hor_spd
    if keys[pygame.K_UP]:
        if car.y - car.ver_spd > 0:
            bgy, bgy2 = bg_movement(bgy, bgy2, car.ver_spd)
    def bg_movement(bgy, bgy2, spd):
        drawbg()
        bgy += float(spd)
        bgy2 += float(spd)
        if bgy > bg.get_height():
            bgy = -bg.get_height()
        if bgy2 > bg.get_height():
            bgy2 = -bg.get_height()
        return bgy, bgy2


    for event in pygame.event.get():
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                for i in numpy.arange(5.0, 0.0, -0.1):
                    bgy, bgy2 = bg_movement(bgy, bgy2, float(i))

    wn.blit(car.sprite, (car.x, car.y))

    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        print(event)

pygame.quit()

Tags: eventgetifkeysfloatcarpygamebg
1条回答
网友
1楼 · 发布于 2024-09-29 01:30:52

首先^{}获取所有消息并将它们从队列中删除。因此,第一个或第二个循环都会得到一个事件,但两个循环都不会得到所有事件。这导致一些事件似乎被遗漏了。
在应用程序中实现1个事件循环

一旦UP被释放,就必须设置decelerate状态。减少变量并按每帧中的量向前移动care,只要decelerate > 0

def drawbg():
    wn.blit(bg, (0, int(bgy)))
    wn.blit(bg, (0, int(bgy2)))
drawbg()

def bg_movement(bgy, bgy2, spd):
        bgy += float(spd)
        bgy2 += float(spd)
        if bgy > bg.get_height():
            bgy = -bg.get_height()
        if bgy2 > bg.get_height():
            bgy2 = -bg.get_height()
        return bgy, bgy2

decelerate = 0
while run:

    clock.tick(60)

    # keys binding
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        if car.x + car.hor_spd > 0:

            car.x -= car.hor_spd
    if keys[pygame.K_RIGHT]:
        if car.x + car.hor_spd < wnw - car.w:
            car.x += car.hor_spd
    if keys[pygame.K_UP]:
        decelerate = 0
        if car.y - car.ver_spd > 0:
            bgy, bgy2 = bg_movement(bgy, bgy2, car.ver_spd)

    if decelerate > 0:
        bgy, bgy2 = bg_movement(bgy, bgy2, decelerate)
        decelerate -= 0.1


    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                decelerate = car.ver_spd


    drawbg()
    wn.blit(car.sprite, (car.x, car.y))

    pygame.display.update()

相关问题 更多 >