我正在编写一个简单的pygame程序,它只包含在屏幕上移动一个框。盒子移动得非常快,我想知道如何控制速度。在我的代码中,更新的位置移动1而不是更小,因为如果数字不是整数,则会使事情变得更复杂。
import os, sys
import pygame
from pygame.locals import *
pygame.init()
mainClock = pygame.time.Clock()
WINDOWWIDTH = 400
WINDOWHEIGHT = 400
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption("Box")
BLACK = (0, 0, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
size1 = 20
size2 = 2
#character = pygame.Rect(30, 30, 20, 30)
player = pygame.Surface((40,40))
pos1 = 100
pos2 = 100
MOVESPEED = 6
x = 1
while True:
if pos1 == WINDOWWIDTH - 40 and pos1 > 0:
pos1 -= 1
x += 1
elif pos1 < WINDOWWIDTH - 40 and x == 1:
pos1 += 1
elif x ==2:
pos1 -= 1
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
pos1 -= 5
if event.key == K_RIGHT:
pos1 += 4
windowSurface.fill(WHITE)
#screen.blit(character)
windowSurface.blit(player, (pos1, pos2))
pygame.display.update()
答案 0 :(得分:7)
你应该在你的“while True:”循环中放入以下代码:
clock.tick([insert fps here])
并将其放在循环之前的某处:
clock=pygame.time.Clock()
这将不允许循环运行的次数超过您每秒输入的次数,并且希望减慢该多维数据集的速度。
答案 1 :(得分:2)
只是不要在循环的每次迭代中改变位置。
而不是
while True:
if ... :
pos1 += 1
...
像这样使用somethinig:
tmp = 0
while True:
if ... :
tmp += 1
if tmp == 10:
pos1 += 1
tmp = 0
...
或
tmp = 0
while True:
if ... and not tmp % 10:
pos1 += 1
...
您可以将10
调整为适合您的值。
此外,您可能希望限制程序的帧速率以使用Clock获得(或多或少)恒定帧速率。
答案 2 :(得分:2)
毕竟你可以使用花车存储位置。将while循环中的更新值更改为更小的值,例如pos1 += 0.25
。然后确保blit整数:windowSurface.blit(player, (int(pos1), int(pos2)))
。
答案 3 :(得分:0)
我通常也会对大多数位置使用整数但是当我说pygame将我的对象/ sprite / ...绘制到屏幕时,我总是将位置除以10,这样我就有10步值,因为对象移动了一步屏幕上。
组织这个并不太难。
答案 4 :(得分:0)
您可以拥有的最小速度为1,但是有一种方法可以通过控制时间来进一步降低速度。
例如,以每100ms而不是每帧的速度移动1的框会使移动看起来明显变慢。
请参阅以下实现:
# initialize clock object outside of main loop
clock = pygame.time.Clock()
time = 0
while 1:
time = time + clock.get_time()
if time >= 100:
# Your movement implementation here
time = 0 # Reset timer at the end