3 回答

TA貢獻1830條經驗 獲得超3個贊
稍微調整一下數(shù)字,20000 與 200 相比有很大的跳躍。因為您現(xiàn)在得到的值是 10/100 和 200/100。這是 0.1 到 2 像素,所以我不認為它們會有很大不同。你跳到 10/100 到 20000/100,這是一個巨大的速度,大約是 200 像素上限與原始 2。所以這就是你的問題??赡苁?200 到 2000 甚至 200 到 2500 的范圍。你不需要像你說的球開始很快下降那樣大的調整。我以前也做過類似的游戲,我可以說你只需要稍微調整一下數(shù)字。

TA貢獻1827條經驗 獲得超4個贊
如果這是 Python 2,則有問題
random.randint(10, 200) / 100
因為除法將在整數(shù)數(shù)學中完成。你應該使用
random.randint(10, 200) / 100.
另一個問題是您在每次更新(可能是每一幀)時選擇隨機步驟,這不會產生速度的錯覺,而是更多的隨機抖動運動。選擇一個隨機速度可能會更好,但至少在幾幀甚至整個秋季動畫中保持相同。

TA貢獻1796條經驗 獲得超4個贊
部分問題是亞像素距離。我認為你的主要問題是你的y動作??纯催@個方程self.y +=,有一半的時間它會導致像素距離只有一個像素。將其添加到 self.rect 時,舍入(或截斷)將使小于 1 像素的數(shù)量消失。比如生成的隨機整數(shù)是99,再除以100,就是0.99一個像素。在pythonint(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
同樣正如@6502 指出的那樣,這將產生生澀的隨機運動。最好在 class 中生成每次更新像素的速度__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
我喜歡根據(jù)實時計算讓事情發(fā)生變化。這需要對象速度和幀間時間來計算對象移動了多少。我喜歡這個,因為如果你想在程序中添加重力(或其他),很容易計算新的位置。
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
添加回答
舉報