所以我正在制作一个PyGame,棒球从上面掉下来,底部的用户必须接住球。球以随机速度下落,但是我很难让球以不同速度下落。
例如,我当前的球代码是:
def update(self):
if self.is_falling:
"""Move the ball down."""
self.y += random.randint(10, 200) / 100
self.rect.y = self.y
在这里,当我运行程序时,球以不同的速度下落,但几乎没有什么不同。如果我将数字更改为(10,20000)/ 100,则每个球的掉落速度都非常快。请问是什么原因?似乎随机数不是那么随机。我使用的功能是否错误?
我想让每个球以非常不同的速度下降,例如一个非常快,而另一个非常慢。而且我希望它是随机数,以便用户可以以许多不同的速度进行游戏...
我想知道是否可以在生成的随机数之间设置特定间隔的随机函数?还是应该尝试其他方法?如果是这样,我应该怎么做?
我是Python的初学者,所以如果您能尽可能简单地进行解释,将不胜感激!
答案 0 :(得分:2)
如果这是Python 2,则存在问题
random.randint(10, 200) / 100
因为除法将在整数数学中完成。 您应该使用
random.randint(10, 200) / 100.
另一个问题是,您在每次更新(可能是每帧)时都选择了随机步长,这不会给人一种速度上的错觉,而是给人一种更多的随机抖动的感觉。 最好像您一样选择随机速度,但至少在几帧甚至整个秋季动画中都将其保持不变。
答案 1 :(得分:1)
部分问题是亚像素距离。我认为您的主要问题是您的y
运动。看一下self.y +=
的等式,一半时间将导致只有一个像素的像素距离。将其添加到self.rect后,舍入(或截断)将使少于1个像素的数量消失。例如,生成的随机整数为99,然后除以100,即为0.99像素。在python中,int(0.99)
为零。因此,自int(150/100)
=> 1
以来,大约有一半的时间移动为零,另一半的移动仅为1个像素。 (每190个瞬间中就有一个是2像素。)
def update(self):
if self.is_falling:
"""Move the ball down."""
self.y += random.randint(10, 200) / 100
self.rect.y = self.y
也正如@ 6502指出的那样,这将产生随机的随机运动。最好在类__init__
中生成每次更新像素,并坚持这样做。
def __init__( self, ... ):
...
self.fall_speed = random.randint(10, 200) # pixels per update
def update(self):
if self.is_falling:
"""Move the ball down."""
self.y += self.fall_speed
self.rect.y = self.y
我喜欢根据实时计算来推动事情发展。这需要物体速度和帧间时序来确定物体已移动了多少。我喜欢这样,因为如果您想在程序中添加重力(或其他),则很容易计算新位置。
class FallingSprite( pygame.sprite.Sprite ):
""" A falling sprite. Falls at a constant velocity in real-time """
def __init__( self, image ):
pygame.sprite.Sprite.__init__( self )
self.image = image
self.rect = self.image.get_rect()
self.fall_speed = random.randint(10, 200) # pixels / second
self.last_update = int( time.time() * 1000.0 )
self.rect.center = ( random.randrange( 0, WINDOW_WIDTH ), 0 )
def update( self ):
# There may have been movement since the last update
# so calculate the new position (if any)
if ( self.fall_speed > 0 ):
time_now = int( time.time() * 1000.0 )
time_change = time_now - self.last_update # How long since last update?
if ( time_change > 0 ):
distance_moved = time_change * self.fall_speed / 1000
now_x, now_y = self.rect.center # Where am I, right now
updated_y = now_y + distance_moved
# Did we fall off the bottom of the screen?
if ( updated_y > WINDOW_HEIGHT ):
# sprite disappears
self.kill()
else:
self.rect.center = ( now_x, updated_y )
self.last_update = time_now
答案 2 :(得分:0)
稍微调整一下数字,20000是从200跳出的一个非常大的数字。由于现在得到的值是10/100和200/100。这是0.1到2像素,所以我不认为它们会有很大的不同。您跳到10/100到20000/100,这是一个巨大的速度,相对于原始2像素,它的上限约为200像素。所以这就是您的问题。也许范围在200到2000甚至200到2500之间。您不需要大的调整,因为您说球开始非常迅速地下降。我以前做过相同类型的游戏,可以说您只需要稍微调整一下数字即可。