2012-06-08 151 views
1

我正在寫一個簡單的pygame程序,只包括在屏幕上移動一個框。盒子移動速度非常快,我想知道如何控制速度。在我的代碼中,更新的位置被移動1而不是更小,因爲如果數字不是整數,它會使事情更加複雜。pygame中物體的速度?

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

回答

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得到(或多或少)恆定的幀率。

+0

是的使用時鐘確實是你想要做的,如果你想在不同的計算機上類似的速度 - 如果你不想浪費整個處理器移動那個盒子 – kratenko

2

畢竟您可以使用浮動來存儲位置。將while循環中的更新值更改爲更小的值,例如pos1 += 0.25。然後只要確保blit整數:windowSurface.blit(player, (int(pos1), int(pos2)))

7

你應該把下面的代碼位在你的「而真正的」循環某處:

clock.tick([insert fps here]) 

和循環之前把這個地方:

clock=pygame.time.Clock() 

這將不允許循環運行次數超過每秒輸入的次數,並希望減慢該立方體的速度。

+1

這是唯一真正有用的答案。爲什麼要移動一個小於一個像素的物體,這沒有意義?增加一個FPS限制一定會解決問題。 –

0

我通常也對大多數位置使用整數,但是當我說pygame將我的對象/ sprite/...繪製到屏幕上時,我總是將位置除以10,以便我有10個步驟的值,步驟在屏幕上。

組織這並不難。