Python 复制曲面并在屏幕上快速显示
所以我正在开发我的pygame版本的Paint,目前正在开发UNDO属性。我已经找到了保存屏幕的方法(我想使用deque),但无法找到如何保存屏幕上的内容,在屏幕上保存内容的方法是什么,这样每当屏幕上发生更改时,我就可以将内容附加到deque上,如果用户单击“撤消”按钮,我就可以返回到旧屏幕。我尝试过copy()方法,但我想我没有正确地实现它 如果你能给我一个例子,告诉我如何blit旧曲面的副本,那将是非常有帮助的Python 复制曲面并在屏幕上快速显示,python,pygame,paint,Python,Pygame,Paint,所以我正在开发我的pygame版本的Paint,目前正在开发UNDO属性。我已经找到了保存屏幕的方法(我想使用deque),但无法找到如何保存屏幕上的内容,在屏幕上保存内容的方法是什么,这样每当屏幕上发生更改时,我就可以将内容附加到deque上,如果用户单击“撤消”按钮,我就可以返回到旧屏幕。我尝试过copy()方法,但我想我没有正确地实现它 如果你能给我一个例子,告诉我如何blit旧曲面的副本,那将是非常有帮助的 希望我说得够清楚。这里有一个制作屏幕表面副本的快速示例 它调用window.co
希望我说得够清楚。这里有一个制作屏幕表面副本的快速示例 它调用
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()
复制曲面。是的,我知道,但是在屏幕上显示过去曲面的副本时,不会发生任何事情。。它保持不变。我不知道如何实现它。你确定你正在屏蔽曲面的副本,而不是屏蔽对现有曲面的引用吗?没有任何代码,我们只能猜测。谢谢你,这真的帮助了很多,我相信这将帮助其他人,因为直到现在,我还没有得到的闪动保存的屏幕部分。