0

我试图让我的乒乓球游戏以特定的 fps 运行循环,但我尝试了几件事,但没有奏效,我没有被教导如何使用 pygame 速度/时钟,所以我必须弄清楚我自己出去

我正在尝试使循环以一定的速度运行以使其看起来更平滑,因为如果我编辑 dx 或更改它时它所处的位置,它看起来很厚实,所以而不是桨 10 x 向下(看起来矮胖)我想将它向下移动 1 倍,所以它向下移动的速度与 10 倍一样快,但更平滑

完整代码

import pygame #how to fix paddle widths from hitting ball
import sys
pygame.init()
screenSize = (800,600)
screen = pygame.display.set_mode((screenSize),0)
pygame.display.set_caption("HajarPongBasicCollision")

# colours
WHITE = (255,255,255)
BLACK = (0, 0, 0)
GREEN = (0,255,0)
RED = (255,0,0)
BLUE = (0,0,255)
PURPLE = (154, 136, 180)

screen.fill(BLACK)
pygame.display.update()
# retrieve screen measurements
screenw = screen.get_width()
screenh = screen.get_height()

# retrieve position of center of screen
centerx= 400 #tried not to use hard coded values but program gives me an error when i use screenw/2 ASK MR H TO HELP WITH NO HARD CODED VALUES (HCV)
centery= 300

# variables for first paddle
p1x = 10
p1y = 10
p1w = 10
p1h = 100

p1dy = 0
p1_score = 0

# variables for second paddle
p2w = 10
p2h = 100
p2x = screenw - 20
p2y = 10

p2dy = 0
p2_score = 0

# variable for ball
bx = 400 #HCV
by = 300 #HCV
br = 9
bdx = 1
bdy = 1

# speed of loop
fpsClock = pygame.time.Clock()
FPS = 60

go = True
while go:
    fpsClock.tick(FPS)
    for event in pygame.event.get():
        if event.type ==pygame.QUIT:
            go = False
        elif event.type == pygame.KEYDOWN:
            # control for the first paddle
            if event.key == pygame.K_w:
                    p1dy = -1
            elif event.key == pygame.K_s:
                    p1dy = 1
            # controls for the second paddle
            elif event.key == pygame.K_UP:
                    p2dy = -1
            elif event.key == pygame.K_DOWN:
                    p2dy = 1
            elif event.key == pygame.K_q:
                    go = False
        # stops rectangles from going continously
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:
                p1dy = 0
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                p2dy = 0

    # stops paddle one from going off the screen
    if (p1y < 0):
        p1dy = 0
        p1y = 0
    if (p1y + p1h > screenh):
        p1dy = 0
        p1y = screenh - p1h

    # stops paddle two from going off the screen
    if (p2y < 0):
        p2dy = 0
        p2y = 0
    if (p2y + p2h > screenh):
        p2dy = 0
        p2y = screenh - p2h

    # stops ball from going off the screen
    if (bx + br >= screenw):
        bx = centerx
        by = centery
    elif (bx <= br):
        bx = centerx
        by = centery

    if (by + br >= screenh):
        bdy = -bdy
    elif (by <= br):
        bdy = -bdy

    # detects if ball hit paddles
    if bx - br <= p1x + p1w and by >= p1y and by <= p1y + p1h:
        bdx = -bdx

    if bx + br >= p2x and by >= p2y and by <= p2y + p2h:
        bdx = -bdx

    # moves the rectangles
    p1y = p1y + p1dy
    p2y = p2y + p2dy

    # moves the ball
    bx = bx + bdx
    by = by + bdy

    # removes screen trail
    screen.fill(BLACK)

    # draws the rectangles
    pygame.draw.rect(screen, WHITE,(p1x, p1y, p1w, p1h))
    pygame.draw.rect(screen, WHITE,(p2x, p2y, p2w, p2h))
    pygame.draw.circle(screen, WHITE, (bx, by), br, 0)
    pygame.display.update()

pygame.quit()
sys.exit()
4

1 回答 1

0

将对象的速度与 fps 分离。
这样,如果您希望物体移动得更快,则无需更改 fps,只需增加物体的速度即可。如果计算机出现性能问题并且无法保持可靠的 fps。您的游戏仍然以相同的速度运行,只是显示的帧数更少。

import time
...
# speed of objects
ball_speed = 50
paddle_speed = 200
...
last_update = time.time()
while True:
    ...
    dt = time.time() - last_update
    ...
    # moves the ball
    bx += bdx * ball_speed * dt
    ...
    pygame.draw.circle(screen, WHITE, (int(bx), int(by)), br, 0)
    ...
    last_update = time.time()
于 2019-10-05T17:22:09.513 回答