Sar*_*rah 6 python random pygame
所以我正在制作一个PyGame,棒球从上面掉下来,底部的用户必须接球.球以随机的速度下降,但是我很难让球以不同的速度下落.
例如,我目前的球代码是:
def update(self):
if self.is_falling:
"""Move the ball down."""
self.y += random.randint(10, 200) / 100
self.rect.y = self.y
Run Code Online (Sandbox Code Playgroud)
在这里,当我运行程序时,球以不同的速度下降,但它几乎不同.如果我改变数字使其达到(10,20000)/ 100那么每个球都会快速下降.那是什么原因?似乎随机数不是那么随机.我使用的功能错了吗?
我想让每个球以非常不同的速度下降,例如一个非常快,另一个非常慢.我希望它是随机数,以便用户可以玩许多不同的速度......
我想知道,如果有随机函数,我可以设置生成的随机数之间的特定间隔?或者我应该尝试不同的方法?如果是这样,我该怎么做?
我是Python的初学者,所以如果你能尽可能简单地解释,那将非常感激!
部分问题在于子像素距离。我认为你的主要问题是你的y动作。看一下 的方程self.y +=,有一半的情况会导致像素距离仅为单个像素。当将其添加到 self.rect 时,舍入(或截断)将使小于 1 像素的量消失。例如,生成的随机整数是99,然后除以100,就是0.99个像素。在Python中int(0.99)是零。因此,大约一半的时间,运动为零,另一半的时间,运动仅为 1 个像素,因为int(150/100)=> 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
Run Code Online (Sandbox Code Playgroud)
另外,正如 @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
Run Code Online (Sandbox Code Playgroud)
我喜欢根据实时计算让事物发生变化。这需要对象速度和帧间时间来计算对象移动了多少。我喜欢这个,因为如果你想在程序中添加重力(或其他),很容易计算新位置。
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
Run Code Online (Sandbox Code Playgroud)