Flash As3面向对象游戏结构(类架构)

Flash As3面向对象游戏结构(类架构),flash,actionscript-3,oop,architecture,Flash,Actionscript 3,Oop,Architecture,游戏说明: 不同级别的测验,每个级别有不同类型的视觉问题。 到目前为止的OOP:游戏板(其中有人回答问题)、对话框、高分、控制器/级别控制器 我有一个名为Controller的文档类,用于初始化游戏: public function Controller() { initGame(); } function initGame() { xmlGameData = levels, questions xml highscore:HighScore = new H

游戏说明: 不同级别的测验,每个级别有不同类型的视觉问题。
到目前为止的OOP:游戏板(其中有人回答问题)、对话框、高分、控制器/级别控制器

我有一个名为Controller的文档类,用于初始化游戏:

public function Controller() 
{
    initGame();
}    

function initGame() 
{
    xmlGameData = levels, questions xml
    highscore:HighScore = new HighScore();
    startGame();
}

function startGame() 
{
    levelController = new LevelController( this, xmlGameData );
}
然后我开始将对“文档类/主时间轴”的引用传递给我的不同对象,这些对象本身扩展了MovieClip或Sprite

public function LevelController(docClass, xml)
{
   mainTimeLine = docClass;
   xmlGameData = xml;

   loadGameBoard(); 
   nextLevel();
} 

function loadGameBoard()
{
   gameBoard = new GameBoard(mainTimeLine, this);
   mainTimeLine.addChild(gameBoard);
}

经过一段时间后,这会变得相当混乱,我想知道更好的方法来控制不同的对象(如GameBoard和HighScore)和状态(级别)以及动作(回答问题、下一个问题等),可能是从一个控制点开始的。

嗯。。。我想你的问题是 “有什么比我这里的更好的游戏管理结构?” 虽然没有明确说明,但我会尽力回答这个问题

我不认为多态性是你所做事情的最佳解决方案。OOP不仅仅是一系列对象。它将功能分组为有用的对象

我建议在控制器中增加更多功能

1.) a main object with all the following functionality that will be present 
    throuhout the game
    a.) go to level (next/previous)
    b.) keep track of score
    c.) controll the state of the game
    d.) anything else that exists throughout the game

2.) level objects that handle level specific information
    a.) interactivity of the questions such as buttons etc.
    b.) managing the correct answer and the impact it has on the score in main

嗯。。。我想你的问题是 “有什么比我这里的更好的游戏管理结构?” 虽然没有明确说明,但我会尽力回答这个问题

我不认为多态性是你所做事情的最佳解决方案。OOP不仅仅是一系列对象。它将功能分组为有用的对象

我建议在控制器中增加更多功能

1.) a main object with all the following functionality that will be present 
    throuhout the game
    a.) go to level (next/previous)
    b.) keep track of score
    c.) controll the state of the game
    d.) anything else that exists throughout the game

2.) level objects that handle level specific information
    a.) interactivity of the questions such as buttons etc.
    b.) managing the correct answer and the impact it has on the score in main

我在控制游戏的“UI”和“支持”功能(屏幕流、分数提交、级别提升)时所做的是在主游戏控制器类中放置一系列静态函数,该类处理显示/隐藏游戏屏幕的所有逻辑,通过levelData数组推进迭代器,并处理来自一个中心位置的所有服务器端提交

它基本上是一个包含一系列静态函数的类,例如:

public static function LoadUserData() {}
public static function SaveUserData() {}
public static function PlayNextLevel() {}
public static function SubmitScore() {}
public static function ShowLevelPlayScreen() {}
public static function ShowLevelPauseScreen() {}
public static function ShowGameOverScreen() {}
等等


这些控制器中只有一个,因此打包在静态函数中就可以做到这一点,使其易于从代码中的任何地方访问,并且在语法上比将其转换为单个控件更简洁。

我在控制游戏的“UI”和“支持”功能方面做了些什么(屏幕流、分数提交、级别提升)是在主游戏控制器类中放置一系列静态函数,该类处理显示/隐藏游戏屏幕的所有逻辑,通过levelData数组推进迭代器,并处理来自一个中心位置的所有服务器端提交

它基本上是一个包含一系列静态函数的类,例如:

public static function LoadUserData() {}
public static function SaveUserData() {}
public static function PlayNextLevel() {}
public static function SubmitScore() {}
public static function ShowLevelPlayScreen() {}
public static function ShowLevelPauseScreen() {}
public static function ShowGameOverScreen() {}
等等

这些控制器中只有一个,因此打包在静态函数中就可以做到这一点,使其易于从代码中的任何位置访问,并且在语法上比将其转换为单例调用更简洁。

我就是这样做的

由于这是Flash,我使我的游戏对设计师友好。这意味着我每帧实例化一个对象。我知道人们会对我投反对票,但我知道很多设计师为此感谢我(他们在处理图形时不必修改任何代码)

基本上,将每个可见对象(可以“蒙皮”)子类化为MovieClip。让它通过自定义事件与通常位于的位置进行通信,例如“board”(也是MovieClip)

下面是一个简单的单词搜索游戏的示例,它将帮助您更好地理解我所说的内容。

以下是我的操作方法

由于这是Flash,我使我的游戏对设计师友好。这意味着我每帧实例化一个对象。我知道人们会对我投反对票,但我知道很多设计师为此感谢我(他们在处理图形时不必修改任何代码)

基本上,将每个可见对象(可以“蒙皮”)子类化为MovieClip。让它通过自定义事件与通常位于的位置进行通信,例如“board”(也是MovieClip)


下面是一个简单的单词搜索游戏的示例,它将帮助您更好地理解我所说的内容。

Fire Crow的想法是正确的。您要做的是将游戏中的更改与游戏本身分开。因此,您的控制器对象将包含适用于所有级别的游戏功能,例如分数、显示精灵te、GUI信息和参考当前关卡的关卡数组。您的游戏由一系列关卡组成,因此它们自然应该由关卡对象表示。每个关卡都知道如何绘制自身和处理玩家的输入。关卡对象可以在完成时通知控制器,然后控制器可以显示e数组中的下一个级别。

Fire Crow的想法是正确的。您要做的是将游戏中的更改与游戏本身分开。因此,您的控制器对象将包含适用于所有级别的游戏功能,例如分数、显示精灵、GUI信息和引用当前级别的级别数组ame由一系列关卡组成,因此它们自然应该由关卡对象来表示。每个关卡都知道如何绘制自身并处理玩家的输入。关卡对象可以在完成后通知控制器,然后控制器可以显示阵列中的下一关卡。

这是一个经常犯的错误。无意冒犯,但说到OOP,这种方法违背了它的每一条原则。这是一篇关于这个主题的好文章:。除此之外,请随意使用谷歌“单身是邪恶的”.而且使用类作为全局对象更糟糕,因为单例至少允许通过多态性重用。back2dos-我不同意那篇文章的一些观点。作为程序员,我们应该始终努力做到这一点