1.这里因为生成了一个随机数,通过随机数获得不同底层图片的前缀名(如 1.jpg ,2.jpg ,3.jpg等等),达到每次刮可能获得不同底层图片。(当然也可一直生成同一底层图片,即取消随机数)
先看效果:
2.关键代码(2处关键):
第一处是如何让一张图片在另一张图片上面,这里运用到了pygame.surface.blit(),刚好可以达到此时效果。
draw_surface = pygame.Surface(image.get_size(), flags=pygame.SRCALPHA)
draw_surface.blit(image_surface, (0, 0)) # blit 将一个图像绘制到另一个图像上方
draw_surface.blit(mask_surface, (0, 0))
第二处是如何在表层达到刮刮乐效果,这里比较简单,直接运用擦除即可。
for event in pygame.event.get():
if event.type == pygame.MOUSEMOTION:
if pygame.mouse.get_pressed()[0]: #鼠标左键
# 在表层上绘制擦除线条 圆形
pygame.draw.circle(mask_surface, (0, 0, 0, 0), event.pos, 30)
3.全部代码:
import pygame
import random
# 初始化 Pygame
pygame.init()
a=random.randint(1,4) #可通过随机数获取随机图片
mask_image = pygame.image.load("qs.jpg") #表层图片
image = pygame.image.load(f"{a}.jpg") #底层图片
# 创建屏幕和加载图片
#屏幕大小根据实际修改
screen = pygame.display.set_mode(image.get_size())
# 将表层图片缩放至与底层图片相同大小
mask_image = pygame.transform.scale(mask_image, image.get_size())
# 转换表层和底层图片的表面类型为 alpha 模式 其实就是改变了透明度
mask_surface = mask_image.convert_alpha()
image_surface = image.convert_alpha()
# 游戏主循环
def main_loop():
while True:
for event in pygame.event.get():
if event.type == pygame.MOUSEMOTION:
if pygame.mouse.get_pressed()[0]: #鼠标左键
# 在表层上绘制擦除线条 圆形
pygame.draw.circle(mask_surface, (0, 0, 0, 0), event.pos, 30)
if event.type == pygame.QUIT:
pygame.quit()
return
# 将底部图片和表层图片绘制到 draw_surface 上
draw_surface = pygame.Surface(image.get_size(), flags=pygame.SRCALPHA)
draw_surface.blit(image_surface, (0, 0)) #image_surface blit 将一个图像绘制到另一个图像上方
draw_surface.blit(mask_surface, (0, 0)) #mask_surface
# 在屏幕上绘制合成后的表面
screen.blit(draw_surface, (0, 0))
pygame.display.flip()
if __name__ == "__main__":
main_loop()
4.素材
底层图片:
表层图片(原表层图片太大没法压缩,就随便放了一个图):