Py学习  »  Python

用python实现刮刮卡的交互效果

Crossin的编程教室 • 3 年前 • 226 次点击  



大家好,欢迎来到 Crossin的编程教室 !


我们经常在App或者游戏里看到模拟“刮刮卡”的交互效果,即:用手指来回涂抹一块遮盖的图层,然后露出下面隐藏的内容。这个是模拟现实中刮刮卡彩票的操作,所以在软件里拿来做抽奖,非常的直观和有代入感。


今天我们就来尝试用python模拟下这样的效果。让我们愉快地开始吧~


开发环境

安装Python并添加到环境变量,安装 pygame 模块

pip install pygame

先睹为快

效果如下:



视频中的图片是网上随手下载的,所有很多清晰度不高,看起来有点粗糙。大家可以自己修改成高清版。

原理简介

原理其实很简单。首先从文件夹中随机读取一张图片:

def readImageRandomly():    filenames = os.listdir(IMAGEDIR)    filenames = [f for f in filenames if f.split('.')[-1] in SUPPORTEXTS]    imgpath = os.path.join(IMAGEDIR, random.choice(filenames))    return pygame.transform.scale(pygame.image.load(imgpath), SCREENSIZE)

然后将图片绑定到pygame的屏幕上:

screen.blit(image_used, (0, 0))


接着定义一个surface,并设置为灰色,覆盖在图片上,这样图片一开始是看不到的:

surface = pygame.Surface(SCREENSIZE).convert_alpha()surface.fill(GRAY)screen.blit(surface, (0, 0))



当检测到我们按下鼠标左键并在屏幕内划过时,将划过鼠标的那片surface区域设置为透明的白色,从而使得其下方的图片可见:

mouse_event_flags = pygame.mouse.get_pressed()if mouse_event_flags[0]:    pygame.draw.circle(surface, WHITE, pygame.mouse.get_pos(), 40)elif mouse_event_flags[-1]:    surface.fill(GRAY)    image_used = readImageRandomly()


当然,为了方便切换图片,我们加了一个点击鼠标右键可以随机重新载入一张图片的功能。组织一下代码,使它可以正常运行:

def main():    pygame.init()    pygame.mixer.init()    pygame.mixer.music.load(BGMPATH)    pygame.mixer.music.play(-1, 0.0)    pygame.mouse.set_cursor(*pygame.cursors.diamond)    screen = pygame.display.set_mode(SCREENSIZE)    pygame.display.set_caption('刮刮乐——微信公众号:Charles的皮卡丘')    surface = pygame.Surface(SCREENSIZE).convert_alpha()    surface.fill(GRAY)    image_used = readImageRandomly()      while True:        for event in pygame.event.get():            if event.type == pygame.QUIT:                pygame.quit()                sys.exit(-1)        mouse_event_flags = pygame.mouse.get_pressed()        if mouse_event_flags[0]:            pygame.draw.circle(surface, WHITE, pygame.mouse.get_pos(), 40)        elif mouse_event_flags[-1]:            surface.fill(GRAY)        image_used = readImageRandomly()        screen.blit(image_used, (0, 0))        screen.blit(surface, (0, 0))        pygame.display.update()


大功告成~


大家可以给这个功能再加一点趣味性,比如做成一个抽奖小程序,看看今晚是吃红烧牛肉还是香菇炖鸡(味的方便面)。这个就看各位的发挥啦~


源代码

https://pan.baidu.com/s/1th2oYE5Q0E_0iNx20i6qhQ 

提取码:t6om


如果文章对你有帮助,欢迎转发/点赞/收藏~

作者:Charles未晞

来源:Charles的皮卡丘


_往期文章推荐_

用python模拟地球飞越火星




如需了解付费精品课程教学答疑服务
请在Crossin的编程教室内回复: 666

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/110471
 
226 次点击