0

我正在尝试编写一个程序,该程序可以获取文本并将其动画化以在循环上弹跳,就像球弹到地板上一样。我使用了一段类似的代码,我找到了一个起点,因为我对 Pygame 还是很陌生(谢谢 Pete Shinners,不管你是谁),但是在更新代码并玩了很长时间之后,我仍然不能让它正确地闪烁到屏幕上。文本从渲染区域上方开始,然后逐渐进入视图,但文本的顶部被截断。

我已经尝试在窗口周围移动 blitted 区域并调整程序正在使用的矩形和表面的大小,但似乎没有什么可以解决它。

import os, sys, math, pygame, pygame.font, pygame.image
from pygame.locals import *

def bounce():
    # define constants
    G = 0.98
    FLOOR = 0
    COEFFICIENT = 0.8
    #define variables
    ball = 500
    direction = 'DOWN'
    v = 0
    count = 0
    #create array to store data
    array = [ball]
    while True:
        if count == 4:
            return array
        elif ball > FLOOR and direction == 'DOWN':
            v += G
            if (ball - v) >= FLOOR:
                ball = ball - v
                array.append(round(ball,2))
            else:
                ball = FLOOR
                array.append(round(ball,2))
                direction = 'UP'
                v *= COEFFICIENT
                count += 1
        elif ball >= FLOOR and direction == 'UP':
            v -= G
            if (ball + v) >= FLOOR:
                ball = ball + v
                array.append(round(ball,2))
                if v <= 0:
                    direction = 'DOWN'
            else:
                ball = FLOOR
                array.append(ball)
                direction = 'UP'
                v *= COEFFICIENT

class textBouncy:
    array = bounce()

    def __init__(self, font, message, fontcolor, amount=10):
        # Render the font message
        self.base = font.render(message, 0, fontcolor)
        # bounce amount (height)
        self.amount = amount
        #size = rect of maximum height/width of text
        self.size = self.base.get_rect().inflate(0, amount).size
        #normalise array to meet height restriction
        self.array = [round(-x/(500/amount),2) for x in array]

    def animate(self): 
        # create window surface s
        s = pygame.Surface(self.size)
        # height = max inflated height
        height = self.size[1]
        # define a step-sized rectangle in the location of the step
        src = Rect(0, 0, self.base.get_width(), height)
        # moves the message according to the array list. 
        dst = src.move(0, self.array[i])
        if (i + 1) == len(self.array):
            global i
            i = 0
        # blits the information onto the screen
        s.blit(self.base, dst, src)
        return s

entry_info = 'Bouncing ball text'

if __name__ == '__main__':
    pygame.init()

    #create text renderer
    i = 0
    array = bounce()
    bigfont = pygame.font.Font(None, 60)
    white = 255, 255, 255
    renderer = textBouncy(bigfont, entry_info, white, 16) 
    text = renderer.animate()

    #create a window the correct size
    win = pygame.display.set_mode(text.get_size())
    win.blit(text, (0, 10))
    pygame.display.flip()

    #run animation loop
    finished = 0
    while True:
        pygame.time.delay(10)
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        text = renderer.animate()
        i += 1
        win.blit(text, (0, 10)) # blits the finished product from animate
        pygame.display.flip()
4

2 回答 2

0

(引用)“这一切都归结为数学真的”凯所以你需要 - 当你想让它上升时的 y 轴和 + x 轴让它向侧面移动你可以让它上下移动它是水平的,然后当它到达一个点时,它将停止水平移动,只是上下颠簸+每次更多

那是我的 100 美元,我花了 5 分钟才写完

于 2013-07-01T09:57:14.830 回答
0

在重新审视这个之后,我设法解决了这个问题 - 我需要添加我所删除的所有内容以补偿反弹。所以在 __init__ 函数中:

self.array = [round(-x/(500/amount),2)**+self.amount** for x in array]

现在完美运行:)

于 2013-07-06T14:41:14.367 回答