玩转树莓派《二》——用python实现动画与多媒体
环境:树莓派,系统raspbian,系统自带两个版本的python以及pygame。
1、画板
程序如下:
1 !/home/pi/game_1.py 2 import pygame 3 4 width = 640 5 height = 480 6 radius = 100 7 fill = 1 8 9 pygame.init() #初始化pygame 10 11 window = pygame.display.set_mode((window, height)) 12 window.fill(pygame.Color(255, 255, 255)) # 用白色填充画板 13 while True: 14 pygame.draw.circle(window, pygame.Color(255, 0, 0), 15 (width / 2, height / 2), radius, fill) # 红色画圆 16 pygame.display.update() # 更新图像
输入命令:python game_1.py
运行程序,结果如下:
键盘输入:ctrl + c
终止程序。
然而,由于树莓派图形界面的卡爆,返回到命令窗口再ctrl + c有时候会卡掉,不如直接在pygame窗口上操作来的爽快,其实pygame窗口就是用gui编程的,类似于tkinter模块做成的gui,那么关掉窗口就需要事件输入反应,在原来的game_1.py文件后面加入代码:
1 while True: 2 if pygame.QUIT in [e.type for e in pygame.event.get()]: 3 break
我发现树莓派连接网络这方面真是慢,插上电源启动网络若干分钟才能SSH连接到树莓派ip,至于访问外网,时有时无,有时候由于某种故障,例如长时间不动树莓派或者重启wifi就会导致网络连接失败,putty成为inactive,这个时候只有重新拔插电源才能正常,否则直接SSH会显示time out,只能说没有HDMI线就是麻烦,一重启网络或者重启电脑就会出错。
2、Surface
Surface可想象成一个矩形的图像,可以由多个图像帧组成,用于实现游戏或动画中一个场景,接下来要做的就是合并两张图片。
tips:由于这里需要图片,因此在购买了HDMI转换器后,使用网络还是很方便的,首先方便传图,下载了scrot,下载后直接在命令行输入:scrot即可截取当前屏幕图片,也可以通过输入:scrot -h命令查看帮助文档,比如选择截图范围就可以输入:scrot -s就可以截取想要的图片范围了,保存的图片放在当前路径下,可以使用pi里面自带的picture viewer查看图片。
程序如下:
1 import pygame 2 3 pygame.init() 4 #设置黑色背景surface大小 5 screen = pygame.display.set_mode((450,450)) 6 #加载第一张图片,并将其转换为与当前模式相匹配的模式 7 background = pygame.image.load("banboo.jpg").convert_alpha() 8 theremin = pygame.image.load("panda.jpg").convert_alpha() 9 #将第一张图片与surface合并,并通过参数设置图片合并的位置 10 screen.blit(background, (0,0)) 11 screen.blit(theremin, (135, 150)) 12 while True: 13 pygame.display.update()
结果显示如下:
分析:由上图可以看出,大熊猫并没有被完全显示,因为大熊猫“panda.jpg”这个图片的分辨率大于竹子“banboo.jpg”这个图片,因此才不能显示完整的熊猫图片,因此可以尝试调节大熊猫的像素来适应竹子的像素。
3、在Surface上绘图
如果要绘制一段文字,就需要加载字体,需要用到font模块来加载字体文件并渲染文本。可以先通过pygame.font.get_fonts()函数可以获取pi上的字体列表:
1 import pygame 2 3 pygame.init() 4 for fontname in pygame.font.get_fonts(): 5 print fontname
输出结果如下图:
下面将使用代码加载freemono这个字体来渲染文本:
1 import pygame 2 3 pygame.init() 4 screen = pygame.display.set_mode((725, 92)) 5 #设置字体类型为“freemono”,大小为72号 6 font = pygame.font.SysFont("freemono", 72, bold = 1) 7 textSurface = font.render("I love my pi!", 1, 8 pygame.Color(255, 255, 255)) 9 screen.blit(textSurface, (10, 10)) 10 while True: 11 pygame.display.update()
输出结果如下:
4、处理事件与输入
在pygame中,用户触发的事件会被捕获并以Event的对象形式放入消息队列,而pygame.event模块提供从消息队列中获取未被处理的事件对象并能够对事件进行进一步的处理。接下来将会扩展pygame_1程序来通过捕捉鼠标事件来绘制不同的圆形,原理是越靠近窗口边缘,圆的半径越大。
程序如下图所示:
结果图很漂亮:
5、播放声音
tips:这里,树莓派屏幕右上方出现一个彩色方块的原因时供电不足,建议截usb插口的话,用供电的多接口usb,因为严重供电不足,否则的话播放音乐插耳机的时候各种故障,然后系统崩溃,树莓派发热发烫。
5.1在命令行中输入以下命令打开工具界面:
sudo raspi-config
5.2选择Advanced-option回车后,选择Audio再回车
5.3由于默认的声音输出口试HDMI输出,如果你的HDMI连接的显示屏是没有声音播放口的话建议转为模拟信号输出,也就是耳机输出,选择Forced audio即可
好的,现在你可以百度一个在线音乐,在耳机插孔插上耳机就可以听到音乐了。
6、播放视频
为了不让我的树莓派早夭,我决定去拿供电usb,果然那可恶的小方块不见了,但是不稳定,用电多的时候,还是会随着电源的红色信号灯一闪一闪,小方块也会一闪一闪,可能是供电的电源仍然不够,或者是因为我插上的东西太多了,或许无线鼠标和键盘会比较好。;
pygame.movie模块可以播放视频,前提是视频必须是MPEG1格式的,也就是类似于“.mpg”结尾的视频。当然可以通过安装ffmpeg将其他格式的视频转换为mpg格式。
代码如下:
1 import pygame 2 from time import sleep 3 4 pygame.init() 5 6 screen = pygame.display.set_mode((320, 240)) 7 movie = pygame.movie.Movie("foo.mpg") 8 movie.play() 9 while True: 10 if not(movie.get_play): 11 print("rewind") 12 movie.rewind() # 倒带 13 movie.play() #重新播放 14 if pygame.QUIT in [event.type for event in pygame.event.get()]: 15 break
温馨提示:在pygame.examples模块中有很多完整的实例程序,可以在/usr/share/pyshared/pygame/exalmpes目录中找到源代码。