在上一教程中,我们将值和函数从游戏中分离出来,现在我们已经解决了这个问题,我们将创建一个事件管理器,该事件管理器在单击鼠标时可以轻松调用函数。
因此,当我第一次创建一个在屏幕上单击时显示消息的函数时,它看起来像这样:
如果event.type == pygame.MOUSEBUTTONDOWN:
image_display(screen,'mount.jpg',(0,0))
large_text_display(* normal_message,text)
很简单,对不对? 但是由于我们的目标是创造一款新颖的游戏,因此需要具有可点击性。 每次单击,都会出现一个新框架。 这使我们跳出了框框。
由于无法存储函数调用(在我们的情况下),因此我们需要创建另一个函数来处理此问题。
def perform(lst):
lst [0](* lst [1:len(lst)])
此代码调用一个函数(例如message_display)并将所有参数传递给它。 因此,您基本上可以调用我们之前定义的任何函数,并存储该函数调用。
好吧,那会的。 尝试调用它,应该可以。
表演([image_display,screen,(231,100),'pandas.jpg'])
perform([[large_text_display,screen,white,pygame.Rect(1366,168,600,0),freemono,40,[1366,168,lightblue,120],“ Aww,so cute!”])

这不是我们在本教程中创建框架的方式。 我们将这些值存储在包含所有事件的列表中。 这是我如何想象此列表结构的:
[#整个游戏开始
[#帧的开始
[function_call_with_fixed_args,our_args],[another_function_call_with_fixed_args,our_args]
]#帧结束
]#整个游戏结束
第一层是游戏的基础,所有事件将在整个游戏中发生。 然后是第二层,这是将在特定帧中发生的所有事件。 最后,第三层是事件的存储位置。
让我们在for循环中插入先前定义的函数:
事件中的操作[curr_event]:
执行(动作)
在完成所有 Pygame的检查后添加它,否则可能会滞后。
哦,我也忘了提及curr_event
变量,它有助于跳过框架。 for循环在特定框架内进行迭代,轻松显示该框架中要显示的所有内容。 在主函数的开头创建变量,并添加以下条件:
如果event.type == pygame.MOUSEBUTTONDOWN:
curr_event + = 1
这是您的events
列表的外观:
事件= [
[[large_text_display,* normal_message,text],[image_display,screen,(0,0),'pandas.jpg']],
[[large_text_display,* not_normal_message,text2],[image_display,screen,(0,0),'pandas.jpg]]
]
现在,以该列表为例创建自己的列表,然后运行代码。 (并且不要忘记在for循环之前添加一个screen.fill(white)
, 以便在显示新屏幕时擦除前一个屏幕。


哇,现在看起来很棒。 尽管如此,您还是不想手动编写事件。 现在,让我们编写一些自动执行此功能的函数。
def create_event(func,args):
返回func + [args]
def new_frame(事件,*行为):
events.append([* acts])
第一个函数在传递函数名及其参数时创建一个事件。 第二个传递所有事件时会创建一个整个框架。
请记住,第一个“事件”参数不是您传递的帧列表。 这只是原始events
列表。 而且,您甚至可以将函数事件传递到列表中,而无需传递它们。
好吧,让我们尝试使用这些功能。
图片=帧(图片显示,屏幕,(0,0),'pandas.jpg'])
text = frame(text_display,* normal_message,'哇,那太短了!')
newframe(事件,图像,文本)
图片=帧(图片显示,屏幕,(0,0),'pandas.jpg'])
text =框架(text_display,* normal_message,“绝对惊人!”)
newframe(事件,图像,文本)
这太短了! 您可能已经注意到,我们使用同一张图片创建一个场景,但花了6行代码。 让我们再次简化代码。
def场景(事件,img_list,img_name,text_list,text):
img_frame =框架(img_list,img_name)
text_frame =框架(text_list,文本)
new_frame(事件,img_frame,text_frame)
这是参数列表的外观:
image_vars = [image_display,screen,(0,0)]
background1 = [事件,image_vars,'pandas.jpg']
为什么我们可以创建一个大的变量来创建background1
变量呢? 好吧,您可能不想在整个游戏中都有一个固定的背景。 但是,当创建另一个背景时,您将分配一个大变量。 这样可以更轻松地创建新背景。
此时,您可以只用一行创建一个新框架! 简直太短了! 只是寻找自己!
场景(* background1,normal_message,“哇,那还要短!”)
场景(* background1,not_normal_message,“难以置信!”)
令人振奋! 至此,我们可以创建具有线性情节的小说! 但是还有很多事情要做,例如按钮,选择,音乐和其他东西!
多余的东西:
我的教程中没有包含的东西是shape()
函数。
shape()
函数可在对话框窗口内正确调整文本大小。 没有此功能,文本将如下所示:

它不是至关重要的,但仍然具有以下优点:
def形状(x,y,xspace = 0,yspace = 0):
返回[x + xspace,y + yspace,(size [0] —(x * 2)),(size [1] — y)]
该函数返回传递pygame.Rect
函数的参数列表。
本教程的内容差不多。 感谢您的阅读!