python – 使用pyglet切换场景
作者:互联网
任何人都可以推荐如何在pyglet中切换场景.
即
>菜单>游戏
>游戏>菜单
>菜单>救命
>等
我能想到的唯一方法是使用不同的窗口,我很确定这是完全错误的方法.或者通过重载所有窗口的事件函数.
对不起,如果我没有说清楚,但任何帮助将不胜感激
解决方法:
我不是很有经验,但是对于它的价值,我使用的方法如下.它不能识别明确的“状态”或“场景”,而是依赖于将离散项目添加(和删除)到我的游戏世界中.每个这样的项目可以具有其自己的密钥处理程序,并且知道如何以及何时创建其他这样的项目.
一个具体的例子:
GameItem是可以放入世界的所有项目的子类.它是一个简单的属性集合,没有任何行为.它由游戏世界中的项目(如布什,玩家等)以及像ScoreDisplay和MainMenu等HUD项目进行子类化.
World只是GameItems的集合.
我的’update’函数遍历世界上的所有项目,如果有更新方法则调用它们.
我的’draw’函数类似地迭代遍历世界中的所有项目,绘制每个项目. (他们中的许多人可能只是通过简单地调用类似pyglet的Batch.draw来绘制)
在应用程序启动时,我添加到世界的第一个项目之一是MainMenu对象.它有一个on_key_down方法.
World.add查看正在添加的项目.如果一个项有一个on_key_down方法,那么它将这个处理程序添加到pyglet键处理程序堆栈. (同样地,它在World.remove中撤消了这个)(实际上,在反思时,我猜想world.add在添加项目时会引发一个事件.如果应用程序的键盘处理程序模块感兴趣,那么在接收其中一个事件时它就会添加项目的关键人物,但这有点附带问题)
MainMenu.on_key_handler方法查看按下的键,如果它是启动游戏的键,则它会进行一系列调用:
# Do everything needed to start the game
# For dramatic pacing, any of these might be scheduled to be
# called in a second or so, using pyglet.clock.schedule_once
world.add(player)
camera.to_follow(player)
world.add(scoredisplay)
# Finally, remove the main menu from the world
# This will stop showing it on screen
# and it will remove its keyboard event handler
world.remove_item(self)
这只是一个简单的例子,但希望你可以看到,如果不是开始游戏,主菜单可以通过将它们添加到世界或任何此类事物来显示二级菜单.
一旦进入游戏,您可以通过在所有不再需要的项目上调用“world.remove”来更改“场景”,并在新场景中的所有项目上调用“world.add”.
使用这种技术的游戏的一个例子是之前的pyweek条目SinisterDucks:
http://code.google.com/p/brokenspell/
(虽然,公平地说,它在游戏过程中没有明显的“场景”.它仅仅使用这种技术来管理菜单,屏幕上的游戏等)
标签:python,pyglet 来源: https://codeday.me/bug/20190903/1798050.html