Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 游戏速度问题_Python_Pygame_Clock - Fatal编程技术网

Python 游戏速度问题

Python 游戏速度问题,python,pygame,clock,Python,Pygame,Clock,我偶然发现了这种奇怪的速度行为,我无法为自己解释。如果主循环中的print clock.tick()行未被勾选,则红方块在屏幕宽度上移动更流畅。有人能解释为什么会这样吗 import pygame from pygame.locals import * class Box(pygame.sprite.Sprite): def __init__(self,color,init_pos): super(Box, self).__init__() sel

我偶然发现了这种奇怪的速度行为,我无法为自己解释。如果主循环中的
print clock.tick()
行未被勾选,则红方块在屏幕宽度上移动更流畅。有人能解释为什么会这样吗

import pygame
from pygame.locals  import *


class Box(pygame.sprite.Sprite):

    def __init__(self,color,init_pos):
        super(Box, self).__init__()
        self.image=pygame.Surface([50,50])
        self.image.fill(color)
        self.rect=self.image.get_rect()
        self.rect.topleft=init_pos
        self.speed=300
    def update(self,time_passed):
        moved_distance=self.speed*time_passed
        self.rect.left+=moved_distance

pygame.init()
screen=pygame.display.set_mode([640,480])
box=Box((255,0,0),(0,0))
clock=pygame.time.Clock()

while True:
    for e in pygame.event.get():
        if e.type==QUIT:
            pygame.quit()
    screen.fill((0,0,0))
    time_passed=clock.tick()/1000.0
    box.update(time_passed)
    print clock.tick() #this line uncommented moves the red sqaure faster, why?
    screen.blit(box.image,box.rect)

    pygame.display.flip()  

clock.tick
正在更新游戏时钟,应每帧调用一次。在您的代码中,您不仅要打印经过的毫秒数,还需要在只需要一次的情况下多次更新游戏时钟(将函数传递到
print
,仍将调用该函数)

您也没有为
时钟使用可选的
帧速率
参数。勾选
功能可用于锁定帧速率或屏幕变化速度。如果未锁定,对象可能会以不同的速度移动——正如您所说的那样更流畅

如果要打印经过的毫秒数,只需打印
time\u passed
变量即可

以下是关于
时钟的信息供参考。勾选我的答案所用的

关于你在评论中的后续问题:

我将打印行更改为打印“你好!”并且它仍然具有与打印clock.tick()相同的效果。我的目标不是移动或不移动红场,而是理解为什么打印对速度有如此大的影响。当在主循环中的某个位置放置打印时,它也会加速循环,一旦打印被注释,移动就处于空闲状态

与主循环中的任何其他代码一样,
print
语句将占用CPU时间。时钟更新之间经过的时间越多,
经过的时间越长

该值越大,长方体移动越快。假设自上次更新以来需要10毫秒,因此
timed\u已通过
=10/1000.0=0.01秒。我们调用您的
框。更新
,移动距离
为300*0.01=3。太好了,它向右移动了3个单位。但是,它可能会移动得更快或更慢,因为您没有锁定帧速率,因此速度将发生变化

现在,时钟更新之间经过的时间越短,
经过的时间越短。您注释掉
print
语句,该框处于空闲状态;为什么?假设自上次更新以来需要1毫秒,因为您没有处理
print
语句或任何其他代码<代码>经过的时间
=1/1000.0=0.001秒。我们更新您的红方块和移动距离
=300*0.001=0.3


盒子应该向右移动多少个单位?0为什么?因为
rect.left
是一个整数。0.3将变为0,即框处于空闲状态。

时钟。勾号
正在更新游戏时钟,应每帧调用一次。在您的代码中,您不仅要打印经过的毫秒数,还需要在只需要一次的情况下多次更新游戏时钟(将函数传递到
print
,仍将调用该函数)

您也没有为
时钟使用可选的
帧速率
参数。勾选
功能可用于锁定帧速率或屏幕变化速度。如果未锁定,对象可能会以不同的速度移动——正如您所说的那样更流畅

如果要打印经过的毫秒数,只需打印
time\u passed
变量即可

以下是关于
时钟的信息供参考。勾选我的答案所用的

关于你在评论中的后续问题:

我将打印行更改为打印“你好!”并且它仍然具有与打印clock.tick()相同的效果。我的目标不是移动或不移动红场,而是理解为什么打印对速度有如此大的影响。当在主循环中的某个位置放置打印时,它也会加速循环,一旦打印被注释,移动就处于空闲状态

与主循环中的任何其他代码一样,
print
语句将占用CPU时间。时钟更新之间经过的时间越多,
经过的时间越长

该值越大,长方体移动越快。假设自上次更新以来需要10毫秒,因此
timed\u已通过
=10/1000.0=0.01秒。我们调用您的
框。更新
,移动距离
为300*0.01=3。太好了,它向右移动了3个单位。但是,它可能会移动得更快或更慢,因为您没有锁定帧速率,因此速度将发生变化

现在,时钟更新之间经过的时间越短,
经过的时间越短。您注释掉
print
语句,该框处于空闲状态;为什么?假设自上次更新以来需要1毫秒,因为您没有处理
print
语句或任何其他代码<代码>经过的时间
=1/1000.0=0.001秒。我们更新您的红方块和移动距离
=300*0.001=0.3


盒子应该向右移动多少个单位?0为什么?因为
rect.left
是一个整数。0.3将变为0,即框处于空闲状态。

我将打印行更改为
打印“你好!”
,它仍然具有与打印
时钟.勾选()相同的效果。
。我的目标不是移动或不移动红场,而是理解为什么打印<代码>会对速度产生如此大的影响。当你在主循环的某个地方放置
print
时,它也会加速循环,只要
print
被注释,移动就处于空闲状态。@AmirTeymuri请查看我最初答案的更新。现在这绝对有意义了!我将打印行更改为
打印“你好!”
,它仍然与打印
clock.tick()
具有相同的效果。我的目的不是要移动或不移动红场,而是要理解为什么要放置一个标记