实现类似黑客帝国的字符流特效屏保
程序员文章站
2024-03-18 20:12:34
...
看了几篇实现特效的帖子,都是大同小异,不知道出处是哪里了都,我的实现方法和他们稍有不同,同样是用pygame。一看之下才发现,原来这种技术论坛搬砖的也这么多。
先上代码,再逐行解释,刚学pygame,不足之处,亲各位朋友多多指教吧。
'''实现黑客帝国代码雨特效屏保,本来先分成三个函数来写,但是不好讲解,只好都拼成一个了,将就看吧'''
#这个列表是我们要展示的字符,有数字10,0-9数字,所有英文字符三种,可以通过方向键切换
texts=['10'*10,''.join(str(i) for i in range(10)),string.ascii_letters]
def main():#游戏循环主函数
pygame.init()#初始化pygame,必备
width,height = max(pygame.display.list_modes())#算出屏幕最大的分辨率,由于要制作屏保必须全屏,所以要列出显示器的最大分辨率
screen=pygame.display.set_mode((width,height),FULLSCREEN,32)#全屏显示,创建screen对象,参数为全屏
pygame.display.set_caption('黑客帝国')#全屏之后没有标题栏,这句仅供学习
my_font=pygame.font.SysFont("arial", 20)#引入字体对象
font_height= my_font.get_linesize()#或者用my_font.get_height()返回字体高度,为了使显示的字符不重叠,我们需要获得字符的高度。
columnspan=20#代码流初始间距,可*调整
text_index=0#选择显示的初始在列表的下标
timedely=30#延迟时间,代码流的流动速度
# time_f = pygame.time.Clock()仅供学习时钟对象
while True:#游戏主循环
screen.fill((0,0,0))#填充屏幕黑色rgb颜色,此处其他帖子都是再添加一个半透明的screen对象,实现字符流渐变效果
for event in pygame.event.get():#监控鼠标动作事件
if event.type == QUIT:#如果点击标题栏关闭按钮触发该事件
pygame.quit()#退出pygame
sys.exit()#退出解释器
elif event.type == pygame.KEYDOWN:#键盘按下事件
if event.key == pygame.K_q:#按下键为q则退出游戏,由于使全屏没有标题栏所以需要快捷键退出
pygame.quit()
sys.exit()
elif event.key == pygame.K_LEFT:
text_index +=1#单击方向左键更换字符流
if text_index == len(texts):
text_index=0
elif event.key == pygame.K_RIGHT:
columnspan += 10#右键增加字符流之间的间距
if columnspan > width/4:
columnspan = 20
elif event.key == pygame.K_DOWN:
timedely += 10#方向下键,减慢流动速度
if timedely >200:
timedely=30
# time_f.tick(130)
pygame.time.delay(timedely)#延迟时间
for x in range(0,width,columnspan):#字符的x左边循环
y=random.randrange(font_height,height)#y坐标在字符高度和屏幕高度之间随机选择
for s in texts[text_index]:
#这里使不同的地方,通过随机选择字符的前景色,实现渐变的效果,绿色从0-255随机选择
font_screen=my_font.render(s,1,(0,random.randrange(0,255),0),(0,0,0))
#显示出字符
screen.blit(font_screen,(x,y))
#每一个字符y坐标递减一个字符高度
y -= font_height
if y<0:#如果y小于0了,则初始成屏幕高度
y=height
pygame.display.update()#刷新游戏界面
if __name__ == "__main__":
main()
图我就不截图了,大家可以复制下来自己运行看看。由于pygame的中文教程非常少,我就找到过一本,大部分是英文资料,我这种四级都没过的,啃起来挺困难,幸亏有百度翻译。
顺便提供一些pygame的常用api
'''
*******************窗口模式
FULLSCREEN Creates a display that fills the entire screen.
DOUBLEBUF Creates a “double-buffered” display. Recommended for HWSURFACE or OPENGL.
HWSURFACE Creates a hardware-accelerated display (must be combined with theFULLSCREEN flag).
OPENGL Creates an OpenGL renderable display.
RESIZABLE Creates a resizable display.
NOFRAME Removes the border and title bar from the display.
*******************颜色位深
8 bits 256 colors, chosen from a larger palette of colors
15 bits 32,768 colors, with a spare bit
16 bits 65,536 colors
24 bits 16.7 million colors
32 bits 16.7 million colors, with a spare 8 bits
********************事件
QUIT User has clicked the close button. none
ACTIVEEVENT Pygame has been activated or hidden. gain, state
KEYDOWN Key has been pressed. unicode, key, mod
KEYUP Key has been released. key, mod
MOUSEMOTION Mouse has been moved. pos, rel, buttons
MOUSEBUTTONDOWN Mouse button was pressed. pos, button
MOUSEBUTTONUP Mouse button was released. pos, button
JOYAXISMOTION Joystick or pad was moved. joy, axis, value
JOYBALLMOTION Joy ball was moved. joy, ball, rel
JOYHATMOTION Joystick hat was moved. joy, hat, value
JOYBUTTONDOWN Joystick or pad button was pressed. joy, button
JOYBUTTONUP Joystick or pad button was released. joy, button
VIDEORESIZE Pygame window was resized. size, w, h
VIDEOEXPOSE Part or all of the Pygame window was exposed. none
USEREVENT A user event has occurred. code
'''
'''
#pygame.event.set_blocked(MOUSEMOTION)阻止事件可传入事件名或者事件名列表
#pygame.event.set_blocked([KEYDOWN, KEYUP])
#pygame.event.set_blocked(None)传入None可解除所有阻止事件
#pygame.event.set_allowed()允许事件,用法同上
#my_font = pygame.font.SysFont("arial", 16)实用系统字体,如果查找不到将实用系统默认字体
#my_font = pygame.font.Font("my_font.ttf", 16)#通过文件创建字体
#text_surface = my_font.render("Pygame is cool!", True, (0,0,0), (255, 255, 255))#用于把文字表面对象。参数说明:输入文字,抗锯齿,前景色,背景色
#pygame.image.save(name_surface, "name.png")文字保存成图片
#blank_surface = pygame.Surface((256, 256))#创建表面对象
#blank_alpha_surface = pygame.Surface((256, 256), flags=SRCALPHA, depth=32)
#my_rect3 = Rect(100, 100, 200, 150)
#my_rect4 = Rect((100, 100), (200, 150))#创建矩形对象
# screen.set_clip(0, 0, 640, 300)#裁剪分割屏幕对象,分区显示
# draw_map()
# screen.set_clip(0, 300, 640, 180)
# draw_panel()
# my_font_image = Pygame.load("font.png")
# letters = []
# letters["a"] = my_font_image.subsurface((0,0), (80,80))#设置子表面
# letters["b"] = my_font_image.subsurface((80,0), (80,80))
#screen.fill((0, 0, 0))屏幕填充颜色,也可接受矩形对象
pygame.key.get_focused()如果程序获得焦点返回True,如果没有返回False
pygame.key.get_pressed()返回所有键的布尔值列表,如果键被按下则相应的键值变为1
pygame.key.get_mods()检查是否按下了修饰键,如需要检查左侧shift键是否按下:pygame.key.get_mods() & KMOD_LSHIFT
pygame.key.set_mods()设置键组合pygame.key.set_mods(KMOD_SHIFT | KMOD_ALT)
pygame.key.set_repeat()设置重复按键,当一直按下某键多久开始重复,参数一为初始延迟值毫秒,和间隔延迟值,如果无参数调用则禁用重复
pygame.key.name()通过键码位返回键的名字配合pygame.key.get_pressed()使用,参数为该函数各个值下标也就是码位
pygame.mouse.get_pressed()返回左中右三个鼠标键是否被按下的布尔值元组
pygame.mouse.get_rel()以元组的形式返回鼠标的相对移动距离
pygame.mouse.get_pos()以元组形式返回鼠标当前坐标
pygame.mouse.set_pos()设置鼠标坐标位置
pygame.mouse.set_visible()更改标准鼠标光标的可见性。如果False,光标将不可见
pygame.mouse.get_focused()如果pygame窗口正接收鼠标活着窗口位于顶部返回True
pygame.mouse.set_cursor()设置标准光标图像。这是很少需要的,因为通过将图像blitting到鼠标坐标可以获得更好的结果。
pygame.mouse.get_cursor()获取标准光标图像
'''
希望以上的内容对你有所帮助,如果也想啃啃英文可以加我QQ109054964,共同学习进步。
上一篇: 80行C代码实现ncurses版贪吃蛇!
推荐阅读