> 文章列表 > 大爽pygame入门教程 第一节 基础知识 练习提示与答案

大爽pygame入门教程 第一节 基础知识 练习提示与答案

欢迎来到"大爽pygame入门教程"!我是大爽歌,B站小UP主,同时也是编程一对一辅导老师。今天咱们要探讨的是怎样在Pygame中实现逐行展示文本的特效,重点是如何通过鼠标点击来触发每行文本的显示。说到这儿,我突然想到,鼠标点击就像魔法棒一样,轻轻一点,就能让文字乖乖出现,是不是很酷?哈哈!

首先,我们要解决的问题是如何让文本一行一行地显示出来,而不是一次性全盘托出。这里的秘诀就在于控制一个计数器i,每次点击鼠标时,i就增加一次,从而控制显示的行数。这样,文本就像排队一样,按顺序出场,绝不抢镜头!(想象一下,你的文本正在后台排着队,等待你的“魔法点击”来叫它们上台表演。)

接下来,我们需要考虑的是如何让文本在屏幕上居中对齐。这可不能让文本跑到角落里当“小透明”。居中对齐的计算其实不难,只要知道整个窗口的宽度和每一行文本的宽度,就能轻松算出左边的横坐标。公式就是:xi = (窗口宽度 - 文本宽度) / 2。这样,文本就会稳稳地站在屏幕中央,仿佛在对观众说:“看我多有气质!”

那么,如何把这些想法付诸实践呢?答案就在代码里!在代码006a.py中,我们初始化了pygame,创建了一个300x300的窗口,并使用了“kaiti”字体来渲染文本。每次点击鼠标时,i就会增加,直到所有的文本都展示完毕。文本的居中对齐则是通过计算xi和yi的坐标来实现的。这样,文本不仅逐行出现,还整整齐齐地站在中央,毫无违和感。

说到这儿,你可能会想,这样的技术还有哪些应用场景呢?比如,在制作互动式学习软件时,可以通过点击来逐步展示知识点;或者在游戏界面中,通过点击来解锁新的关卡提示。甚至,你还可以将这个逻辑扩展到其他交互元素上,比如按钮、滑块等,让它们在特定条件下才出现,增加了游戏的趣味性和互动性。

还有一个值得思考的问题是,如何优化这个过程呢?如果文本非常长,逐行渲染会不会导致性能问题?其实,Pygame的渲染效率还是非常高的,但如果你有数千行文本,可能需要分批加载或使用缓存机制来提升效率。此外,还可以添加一些动画效果,比如淡入淡出,让文本的出现更加优雅。

最后,我想提醒大家,在编程过程中一定要注重用户体验。比如,可以添加音效,让每次点击都有声音反馈,这样用户会觉得更加有趣和互动。另外,如果文本展示完毕后,还可以自动停止,或者提示用户已无更多内容,避免用户不停地点击却看不到变化。

整体而言,逐行展示文本是一个简单但灵活的技术,可以在很多场景下大显身手。希望大家通过这节教程,不仅能学会如何实现,还能从中激发更多的创意,把Pygame的交互性发挥得淋漓尽致!下次再见,我们再来聊聊Pygame的其他酷炫功能。记得点赞、收藏、关注,咱们不见不散!

大爽pygame入门教程 第一节 基础知识 练习提示与答案

作者自我介绍:大爽歌, b站小UP主 ,编程1对1辅导老师

1 逐行展示

思路提示

  1. 点击触发

之前的多行展示,是通过循环实现的。
这一回要点击触发一行的展示,不能直接使用循环了。
这里我们往更深层次去思考一下:
之前循环的本质是一个不断增长的i,
所以我们这里可以实现一个随按键点击不断增长的i,
i增长后再使用差不多的循环体语句即可。

  1. 居中对齐

纵坐标计算和之前差不多,
也是设置一个初始的sy
之后每次yi可由
sy + i * 行高 计算得出

关键是横坐标的计算
其计算示意图如下

大爽pygame入门教程 第一节 基础知识 练习提示与答案

整个窗口宽度为WIDTH
文本框宽度为text_width
文本框居中对齐的话,
文本框左边的横坐标xi计算公式如下
xi=12WIDTH−12text_widthxi = \\frac 1 2 WIDTH - \\frac 1 2 text\\_width xi=21WIDTH21text_width










参考答案

代码006a.py如下

import pygame
import sysWIDTH, HEIGHT = 300, 300pygame.init()
win = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()lines = ["竹枝词","唐·刘禹锡","","山桃红花满上头","蜀江春水拍山流","花红易衰似郎意","水流无限似侬愁"
]font = pygame.font.SysFont("kaiti", 24)
sy = 40
i = 0win.fill("lavender")while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:if i < len(lines):line = lines[i] # 通过索引取到对用的行text = font.render(line, True, "red")text_width, text_height = text.get_size()yi = sy + i * 30 # 计算对应的纵坐标,索引即行号,30是行高xi = WIDTH //