1

这个程序的目标是让一个绿色圆圈在屏幕上循环上下跳动。我已经让它下降并再次备份,但不是让它再次下降。

import pygame, sys, time, random
from pygame.locals import *
from time import *

pygame.init()
windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("Bounce")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

info = pygame.display.Info()
sw = info.current_w
sh = info.current_h
y= 0
yy= sh

while True:
    windowSurface.fill(BLACK)
    pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)
    sleep(.006)
    y+= 1
    if y>sh:
        pygame.draw.circle(windowSurface, GREEN , (250,yy), 13, 0)
        sleep(.0001)
        yy +=-1
    if yy<-.00001:
        y=0
        y+= 1
        pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)

    pygame.display.update()

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
4

4 回答 4

3

在您的if yy < -.00001:块中,我认为您正在尝试将状态重置为程序开始时的状态。如果是这种情况,您忘记设置yy = sh.

换句话说:

if yy<-.00001:
    y=0
    yy=sh   # <- add this line
    y+= 1
    pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)

不过总的来说,我同意半身人。这段代码太复杂了。我建议使用状态变量来记录球是向上还是向下移动,然后在循环中检查该变量并增加或减少位置。当你到达屏幕的另一端时,交换状态变量来改变球的方向。

编辑:试试这个:

import pygame, sys, time, random
from pygame.locals import *
from time import *

pygame.init()
windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("Bounce")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

info = pygame.display.Info()
sw = info.current_w
sh = info.current_h
y = 0

# Initial direction is down
direction = 1

while True:
    windowSurface.fill(BLACK)
    pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)
    #print "Drawing at 250,", y
    sleep(.006)
    y += direction
    if y >= sh:
        # Changes the direction from down to up
        direction = -1
    elif y <= 0:
        # Changes the direction from up to down
        direction = 1

    pygame.display.update()

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

注意:希望这对您有用。我没有安装 pygame,所以我只在 pygame 内容被注释掉并且print调用被替换而不是绘制命令的情况下运行它。无论如何,它对我有用。

于 2013-04-08T01:41:25.950 回答
2

对于您尝试制作的动画,您的代码似乎太复杂了。

您正在寻找模拟“弹跳效果”的东西可能是 sin 函数(因为它在 -1 和 1 之间振荡):

t = 0
speed = 0.01
maxHeight = 200
while True:
    windowSurface.fill(BLACK)
    pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)
    sleep(.006)
    t += 1
    y = int( ( sin(t*speed) + 1) * maxHeight / 2 )

    pygame.draw.circle(windowSurface, GREEN , (250, y , 13, 0)

    pygame.display.update()

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

不要忘记放在from math import sin代码的顶部。

如果你想实现一些逼真的效果,你可能应该使用球的速度和加速度,而不是使用“sin”函数来模拟弹跳效果。

于 2013-04-07T23:57:08.253 回答
0

使用一个while循环让你的球反弹。它应该一遍又一遍地循环代码。当它没有第二次下降时会发生什么?它会抛出错误吗?它只是冻结吗?

于 2014-07-06T22:46:17.687 回答
0

您可以添加一个简单的解决方法是计数器变量,因此每次您的球改变方向时,variable +=1在经过一定数量的更改后程序停止。假设这就是你想要它做的。

于 2014-11-20T19:41:34.213 回答