之前我在python中创建了各种简单的二维游戏,因为它们很简单,我不需要创建这样的东西。但我现在需要它,因为需要回到第四位。 为了向前发展,我需要某种方向......
我大约有200行进入一个新游戏,我还没有开始实际游戏,它目前所有处理窗口,事件和状态
### state machine
def run:
#~setup window
# Current state
state = menu()
running = True
while running:
#~event handler
returns = state.update(events)
if returns == "playgame":
state = game()
state.draw(window)
#menu state
class menu:
def __init__(self):
#~define vars for the menu (buttons, etc...)
self.clickables = [] # filled with gui etc..
self.image = image() # image of the menu
def update(self, events):
for event in events: # go through events
for clickable in self.clickables: # go through clickables
if clickable.testClicked(event.pos) != False: # Returns if clicked
return clickable.testClicked(event.pos)
def draw(self, window):
self.image.draw(window)
#game state
class game(menu): # Exactly the same as menu (just used as example)
def __init__(self):
super(menu).__init__()
#gui button
class button: # Extremely shortened for example use
def __init__(self, do): # do is a string
self.whenClickedDo = do
def testClicked(self, mousePos):
if mousePos in self.myRect: # myRect is the area of the button (Example!)
return self.whenClickedDo
return False
上面这个例子是完全匆忙的,但我思考的问题是......有什么更好的方法来实现这一目标,或者上述是一种可实现的/聪明的做事方式?
TLDR;函数“run”具有值“state”,其可以返回将用于将其自身改变为不同状态的值。这是制作状态机的合理方法吗?
答案 0 :(得分:0)
我用C ++编写了一个简单的游戏引擎,并使用了基于屏幕的系统。我现在试着在python中编写一个简单的版本。这个想法是游戏的每个部分都是不同的屏幕。所以主菜单是一个屏幕,有一个游戏界面(所有动作发生的地方),可能有一个选项屏幕供用户更改设置等等。这些都是由屏幕列表管理,每个屏幕在列表中有一个位置,您可以根据游戏事件在屏幕之间切换。因此,如果主菜单屏幕处于活动状态,当用户点击“播放”按钮时,游戏播放屏幕现在已加载。
我无法想到我的头脑究竟是如何将它移植到python中的,但这应该会让你至少从某个地方开始。
所以屏幕会是这样的类:
class Screen:
# you can have objects in the screen as variables of the class here
# e.g self.player = None
def onEntry(self):
# here you would init the assets for your screen
# this could be the interface, sprites etc
# e.g self.player = Player()
def onExit(self):
# do any clean up
# maybe save player data if this is a gameplay screen
# e.g self.player.save()
def update(self):
# main loop for this screen
# e.g self.player.update()
您游戏的每个特定屏幕都将继承自Screen类,并使用该屏幕的自定义逻辑实现这些功能。然后屏幕列表基本上只是这些自定义Screen类的列表。你的游戏只会在这些屏幕之间翻转。