在pygame中显示闪烁(如何使我的代码更高效)

Bekhruz Niyazov

尽管Python确实很慢,但我想尝试在pygame中制作3D游戏引擎。而且我已经有一个问题:添加多个对象时,显示闪烁。您可以在此处查看我的代码要查看运行test.py文件,tdge.py作为库所需的结果)。如何提高效率?这是此代码的主要部分:

# this function handles the drawing objects on the display
def draw(game, object):

    # updating the background if game.update is True
    if game.update:
        if game.image_path: game.win.blit(game.image, (0, 0))
        else: game.win.fill(game.color)

    # checking the type of the given object
    if type(object) == Cube:

        # getting the height of the game window
        height = game.win.get_height()
        # getting the width of the game window
        width = game.win.get_width()
        # getting the X distance between the object and the user
        distanceX = game.position[0] - object.position[0]
        # getting the Z distance between the object and the user
        distanceZ = game.position[2] - object.position[2]
        # setting the size of the object that user will actually see
        display_size = []
        for size in object.size:
            if game.position[2] < object.position[2]:
                display_size.append(size / distanceZ * 1000)
            else: display_size.append(0)
        # creating a position list, storing the position of an object on a 3D coordinate plane
        position = [width / 2 - distanceX - display_size[0] / 2, height / 2 - object.position[1] - display_size[1] / 2, object.position[2]]

        # if player is not "inside" of the object
        if game.position[0] > position[0] + object.size[0] / 2 or \
            game.position[0] < position[0] - object.size[0] / 2 and \
                game.position[1] > position[1] + object.size[1] / 2 or \
                    game.position[1] < position[1] - object.size[1] / 2 and \
                        game.position[2] > position[2] + object.size[2] / 2 or \
                            game.position[2] < position[2] - object.size[2] / 2:

            # if the rotation of the player is [0, 0, 0]
            if game.rotation == [0, 0, 0]:
                # if the rotation of the object is [0, 0, 0]
                if object.rotation == [0, 0, 0]:
                    # drawing a 2D rectangle
                    pygame.draw.rect(game.win, object.color, ((position[0], position[1]), (display_size[0], display_size[1])))
                # if rotation of the object is not [0, 0, 0]
                else:
                    # if the object is rotated on Y axis
                    if object.rotation[1] != 0:
                        # getting the sizes on X axis
                        y_rotation = object.rotation[1]
                        percent = 100 / (90 / y_rotation)
                        x_size = display_size[0]
                        x0 = x_size / 100 * percent
                        x1 = x_size - x0
                        number = 255 - (255 / 100 * percent)

                        # setting the RGB values
                        color0 = object.color[0] - number if object.color[0] >= number else 0
                        color1 = object.color[1] - number if object.color[1] >= number else 0
                        color2 = object.color[2] - number if object.color[2] >= number else 0

                        # drawing two 2D rectangles based on the data above
                        pygame.draw.rect(game.win, (color0, color1, color2), ((position[0], position[1]), (x0, display_size[1])))
                        pygame.draw.rect(game.win, object.color, ((position[0]+x0, position[1]), (x1, display_size[1])))
                # else:
                    # TODO
                    # write code for displaying object when it is to the right or to the left of the player
                    # pass

        # adding the object if it is not in game.objects
        if object not in game.objects:
            game.objects.append(object)
    else:
        error = "You should provide the object of supported type by this library."
        raise TypeError(error)

    # update the screen so that user will see the difference
    pygame.display.update()
拉比德76

该问题很可能是由于多次致电引起的pygame.display.update()在应用程序循环结束时更新显示就足够了。多次呼叫pygame.display.update()pygame.display.flip()导致闪烁。

删除pygame.display.update()代码中的所有调用,但在应用程序循环结束时调用一次:

def start_game(game, code=None):
    # [...]

    while running:
        # [...]

        pygame.display.update()
        clock.tick(120)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章