组织游戏模块的最佳方式是什么
what's the best way to organize game modules
我正在写游戏,第一章已经完成了。它有大约 10 个模块 + 游戏引擎。我不是要分步指南,但如果你能告诉我在哪里可以找到信息,那就太好了!
- 如果我将它们放在不同的文件夹中,引擎代码能否以某种方式访问我的模块?(我想至少针对不同文件夹中的不同章节对它们进行排序)
- 有没有不同的、更好的方法来编写引擎代码?(假设我将在游戏中有 50 个章节,大约有 500 个模块,所以将有大约 1000 行引擎代码只是为了导入和称他们为非常非常糟糕的风格)
这是引擎代码:
from sys import exit
from random import randint
import module_intro
import module_house_one
import module_package_zoom
import module_house_two
import module_unboxing
import module_key_letter
import module_letter_key
import module_house_three
import module_end_game
class 引擎(对象):
def __init__(self, scene_map):
self.scene_map = scene_map
def play(self):
current_scene = self.scene_map.opening_scene()
last_scene = self.scene_map.next_scene('finished')
while current_scene != last_scene:
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)
current_scene.enter()
class 地图(对象):
scenes = {
'intro': module_intro.Intro(),
'house_one': module_house_one.HouseOne(),
'package_zoom': module_package_zoom.PackageZoom(),
'house_two': module_house_two.HouseTwo(),
'unboxing': module_unboxing.Unboxing(),
'key_letter': module_key_letter.KeyLetter(),
'letter_key': module_letter_key.LetterKey(),
'house_three': module_house_three.HouseThree(),
'end_game': module_end_game.EndGame()
}
def __init__(self, start_scene):
self.start_scene = start_scene
def next_scene(self, scene_name):
val = Map.scenes.get(scene_name)
return val
def opening_scene(self):
return self.next_scene(self.start_scene)
a_map = Map('intro')
a_game = Engine(a_map)
a_game.play()
例如,您可以使用此目录结构或类似的东西将每一章放入单独的文件夹中:
├── game
│ ├── chapter_one
│ │ ├── __init__.py
│ │ └── main.py
│ ├── chapter_two
│ │ ├── __init__.py
│ │ └── main.py
│ ├── engine.py
│ └── __init__.py
└── main.py
根目录下的main.py
会加载所有章节并开始游戏,可以这样看:
import game.chapter_one.main
import game.chapter_two.main
from game.engine import Engine, SceneMap
print("Starting the engine...")
a_map = SceneMap()
a_game = Engine(a_map)
a_game.play()
并且 Scene
对象可以在 SceneMap
中自动注册,因此您不必手动执行此操作,例如 game.chapter_one.main.py
:
from ..engine import SceneMap
class Scene(object):
def enter(self):
print('Enter chapter 1')
SceneMap.register('intro', Scene)
和game.chapter_two.main.py
:
from ..engine import SceneMap
class Scene(object):
def enter(self):
print('Enter chapter 2')
SceneMap.register('chapter 2', Scene)
SceneMap
可以是这样的:
class SceneMap(object):
scenes = OrderedDict()
@classmethod
def register(cls, name, map_fn):
cls.scenes[name] = map_fn
您的其余逻辑可以与您现在的逻辑类似(每个场景 returns 下一个要播放的场景)。
或者,您可以进一步简化它并依赖 main.py
中的章节导入顺序。
因此,如果您在 main.py
中交换 chapter_one / chapter_two 的导入,它们将以倒序播放。
请参阅此方法的完整示例 here。
我正在写游戏,第一章已经完成了。它有大约 10 个模块 + 游戏引擎。我不是要分步指南,但如果你能告诉我在哪里可以找到信息,那就太好了!
- 如果我将它们放在不同的文件夹中,引擎代码能否以某种方式访问我的模块?(我想至少针对不同文件夹中的不同章节对它们进行排序)
- 有没有不同的、更好的方法来编写引擎代码?(假设我将在游戏中有 50 个章节,大约有 500 个模块,所以将有大约 1000 行引擎代码只是为了导入和称他们为非常非常糟糕的风格)
这是引擎代码:
from sys import exit
from random import randint
import module_intro
import module_house_one
import module_package_zoom
import module_house_two
import module_unboxing
import module_key_letter
import module_letter_key
import module_house_three
import module_end_game
class 引擎(对象):
def __init__(self, scene_map):
self.scene_map = scene_map
def play(self):
current_scene = self.scene_map.opening_scene()
last_scene = self.scene_map.next_scene('finished')
while current_scene != last_scene:
next_scene_name = current_scene.enter()
current_scene = self.scene_map.next_scene(next_scene_name)
current_scene.enter()
class 地图(对象):
scenes = {
'intro': module_intro.Intro(),
'house_one': module_house_one.HouseOne(),
'package_zoom': module_package_zoom.PackageZoom(),
'house_two': module_house_two.HouseTwo(),
'unboxing': module_unboxing.Unboxing(),
'key_letter': module_key_letter.KeyLetter(),
'letter_key': module_letter_key.LetterKey(),
'house_three': module_house_three.HouseThree(),
'end_game': module_end_game.EndGame()
}
def __init__(self, start_scene):
self.start_scene = start_scene
def next_scene(self, scene_name):
val = Map.scenes.get(scene_name)
return val
def opening_scene(self):
return self.next_scene(self.start_scene)
a_map = Map('intro')
a_game = Engine(a_map)
a_game.play()
例如,您可以使用此目录结构或类似的东西将每一章放入单独的文件夹中:
├── game
│ ├── chapter_one
│ │ ├── __init__.py
│ │ └── main.py
│ ├── chapter_two
│ │ ├── __init__.py
│ │ └── main.py
│ ├── engine.py
│ └── __init__.py
└── main.py
根目录下的main.py
会加载所有章节并开始游戏,可以这样看:
import game.chapter_one.main
import game.chapter_two.main
from game.engine import Engine, SceneMap
print("Starting the engine...")
a_map = SceneMap()
a_game = Engine(a_map)
a_game.play()
并且 Scene
对象可以在 SceneMap
中自动注册,因此您不必手动执行此操作,例如 game.chapter_one.main.py
:
from ..engine import SceneMap
class Scene(object):
def enter(self):
print('Enter chapter 1')
SceneMap.register('intro', Scene)
和game.chapter_two.main.py
:
from ..engine import SceneMap
class Scene(object):
def enter(self):
print('Enter chapter 2')
SceneMap.register('chapter 2', Scene)
SceneMap
可以是这样的:
class SceneMap(object):
scenes = OrderedDict()
@classmethod
def register(cls, name, map_fn):
cls.scenes[name] = map_fn
您的其余逻辑可以与您现在的逻辑类似(每个场景 returns 下一个要播放的场景)。
或者,您可以进一步简化它并依赖 main.py
中的章节导入顺序。
因此,如果您在 main.py
中交换 chapter_one / chapter_two 的导入,它们将以倒序播放。
请参阅此方法的完整示例 here。