Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 复制曲面并在屏幕上快速显示_Python_Pygame_Paint - Fatal编程技术网

Python 复制曲面并在屏幕上快速显示

Python 复制曲面并在屏幕上快速显示,python,pygame,paint,Python,Pygame,Paint,所以我正在开发我的pygame版本的Paint,目前正在开发UNDO属性。我已经找到了保存屏幕的方法(我想使用deque),但无法找到如何保存屏幕上的内容,在屏幕上保存内容的方法是什么,这样每当屏幕上发生更改时,我就可以将内容附加到deque上,如果用户单击“撤消”按钮,我就可以返回到旧屏幕。我尝试过copy()方法,但我想我没有正确地实现它 如果你能给我一个例子,告诉我如何blit旧曲面的副本,那将是非常有帮助的 希望我说得够清楚。这里有一个制作屏幕表面副本的快速示例 它调用window.co

所以我正在开发我的pygame版本的Paint,目前正在开发UNDO属性。我已经找到了保存屏幕的方法(我想使用deque),但无法找到如何保存屏幕上的内容,在屏幕上保存内容的方法是什么,这样每当屏幕上发生更改时,我就可以将内容附加到deque上,如果用户单击“撤消”按钮,我就可以返回到旧屏幕。我尝试过copy()方法,但我想我没有正确地实现它

如果你能给我一个例子,告诉我如何blit旧曲面的副本,那将是非常有帮助的


希望我说得够清楚。

这里有一个制作屏幕表面副本的快速示例

它调用
window.copy()
,在开始时以及每当用户单击
[KEEP]
时创建一个“撤消点”。如果用户单击
[UNDO]
,复制的曲面将重新显示在屏幕上以擦除现有曲面

我不确定保存屏幕副本是否是一种很好的方法,因为它会占用大量内存。更好的方法是将图形基本体存储在列表中,然后在撤消时只重新绘制多达N-1个条目

import pygame

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE

DARK_BLUE = (   3,   5,  54 )
YELLOW    = ( 250, 250,   0 )
RED       = ( 200,   0,   0 )


### initialisation
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Undo Example")


font = pygame.font.SysFont('freesansbold.ttf', 30)
undo_text = font.render( "[UNDO]", True, YELLOW )
undo_rect = undo_text.get_rect()
undo_rect.x = 50
keep_text = font.render( "[KEEP]", True, YELLOW )
keep_rect = keep_text.get_rect()
keep_rect.x = 200

window.fill( DARK_BLUE )

### The undo buffer
undo_save = None

### Main Loop
clock = pygame.time.Clock()
pen_down = False
last_point = None
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.MOUSEMOTION ):
            mouse_pos = event.pos
            if ( pen_down ):
                if ( last_point != None ):
                    pygame.draw.line( window, RED, last_point, mouse_pos )
                    last_point = mouse_pos
        elif ( event.type == pygame.MOUSEBUTTONDOWN ):
            pen_down = True
            if ( last_point == None ):
                last_point = event.pos
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            pen_down = False
            last_point = None

            ### Handle the KEEP/UNDO button presses
            if ( undo_rect.collidepoint( event.pos ) ):
                if ( undo_save != None ):
                    window.blit( undo_save, ( 0, 0 ) )
                    print( "UNDO Image Restored" )
            if ( keep_rect.collidepoint( event.pos ) ):
                undo_save = window.copy()
                print( "UNDO Image Saved" )

    window.blit( undo_text, undo_rect )
    window.blit( keep_text, keep_rect )

    # Update the window, but not more than 60fps
    pygame.display.flip()

    # make the first undo automatically
    if ( undo_save == None ):
        undo_save = window.copy()

    # Clamp FPS
    clock.tick(60)


pygame.quit()

屏幕是一个表面。可以使用
copy()
复制曲面。是的,我知道,但是在屏幕上显示过去曲面的副本时,不会发生任何事情。。它保持不变。我不知道如何实现它。你确定你正在屏蔽曲面的副本,而不是屏蔽对现有曲面的引用吗?没有任何代码,我们只能猜测。谢谢你,这真的帮助了很多,我相信这将帮助其他人,因为直到现在,我还没有得到的闪动保存的屏幕部分。