游戏开发的世界太大了。本文仅对程序实现的抽象逻辑作了浅显的阐述。
当我去设计一个游戏的时候,一种玩法,包括规则,游戏对象和一系列的游戏系统,纸可以写下来,可以用嘴说出来,但是当我想用程序来实现这堆东西的时候,有一些困难。
例如,我们都玩五子棋,五子棋有一个明确的规则:“一个人,一个字交替放置棋子,前五个连赢。”在现实世界中,我们不需要考虑五子棋的硬件配置,拿一张白纸,画一个水平和垂直的网格,两个人就可以完成一场五子棋游戏,或者使用普通的棋盘和棋子。不管你玩什么,都很容易。
但是当我们制作五子棋游戏时,我们需要使用软件来实现这些东西,例如“棋子”和“棋盘”。
此外,作为一个抽象概念,“游戏规则”和“成败判断”也需要软件来实现,这就要求更多的是“用计算机思考”。
所以我花了一些时间,依靠有限的本科计算机基础和一些自学的零碎知识,总结出了一个总体的游戏框架设计。
一、随机开个头
首先,我将阐述大的抽象概念。没有必要被“抽象”这个词吓倒。什么是抽象是结论的总结。就像自行车一样,飞机和汽车都被抽象为“车辆”。在这里,我将总结这些事物的共性,从而产生了“车”的抽象概念。
视频游戏程序框架,我认为她是一个循环(循环)过程,“启动游戏——杀死敌人/解密/突破/……”游戏胜利/失败-开始游戏,对,关键词,循环,过程。
这一概念的进一步完善导致了GameState和GameController的出现。至于为什么会有这两个概念,我参考了UE4提供的GameState和GameMode类,以及Flash中前辈编写的游戏逻辑。到目前为止,我将它们总结为GS和GC。至于更先进的学术论述,我的知识有限。这一水平仍未达到最新水平。
二.GameState
GameState是对游戏状态的描述。最基本的两个是游戏玩法(开始游戏)和游戏结束(结束游戏)。游戏结束不能被理解为游戏结束,玩家通常看到。游戏结束,玩家通常看到的意味着游戏失败。在这里,概念仅仅意味着游戏的结束,因为不管你是赢是输,游戏都结束了.
在此基础上,可以对其进行扩展,如现在的游戏会有主菜单、暂停、或多人模式、游戏设置等,所以我们可以在游戏庄园中添加主菜单、游戏顶层、多人游戏、游戏选项等。
在游戏状态管理中GameState的用途是什么?最重要的是让你清楚地知道如何编写游戏,或者给你一个起点。对于管理游戏过程的便利性,便于后续游戏程序的功能扩展,减少游戏系统的耦合等方面,存在着太多的问题。
至于如何使用GameState,它是用来切换的,作为一个标志来识别游戏的当前状态。
在此之前,我阅读了《游戏AI编程案例的本质》一书,该书详细介绍了FSM在游戏AI中的应用和扩展。因此,使用FSM进行游戏处理是不合适的。《Lua游戏开发实践指南》中提到了“对于Singleton,只要方便就可以使用它们”。虽然这句话太过充实,但也不符合中国人的思维,也不符合辩证法(笑声),但在一定程度上也显示了单例的实用性和普遍性。此外,使用Singleton的FSM来处理GameState对我来说非常棒。
当然,以上是对抽象概念的阐述。最终,当涉及到游戏编程时,它必须根据一些编程语言的语法和特征来实现。在这里,我还给出了一个Unity c#的原型代码,它可以看作是伪代码。
Unity的C#的原型代码:
publicclassS_GameState : MonoBehaviour {
publicenumGameState
{
GamePlay,
GamePause,
GameOver,
GameReady,
GameInit
}
publicstaticS_GameState Instance;
privateGameState m_GameState;
void Awake()
{
Instance = this;
}
publicGameState GetGameState()
{
returnm_GameState;
}
publicvoid ToGamePlay()
{
m_GameState = GameState.GamePlay;
}
publicvoid ToGamePause()
{
m_GameState = GameState.GamePause;
}
publicvoid ToGameOver()
{
m_GameState = GameState.GameOver;
}
publicvoid ToGameInit()
{
m_GameState = GameState.GameInit;
}
}
补记:
对于FSM和Singleton,最好咨询谷歌老师。但是,这里我将详细介绍FSM的一些应用。FSM在早期的游戏AI的构建中使用过。毕竟,在科研领域,游戏AI与AI是不同的。游戏AI不是为了让玩家无法打败而建立的。基本上游戏AI是一套规则,比如《黑暗之魂3》中的第一个BOSS。古达,其中一条规则是,混血之后,一切都会改变。当它改变时,会有动画,不会攻击。玩家可以轻易地砍下一块体力,然后全身撤退。这条规则几百次也不会改变。
回到最初的话题,FSM在AI游戏中广泛使用的地位已经基本被行为树所取代。然后FSM一直从事角色动画的管理,如第三人称玩家角色的动画切换,UE4和Unity使用FSM来管理动画状态切换。
GameController
在GameState之后,是时候谈谈GameController了。
游戏管理员用来管理游戏的规则,如启动游戏,创建玩家的角色、敌人、地图等。玩家按ESC暂停游戏,玩家通关,精彩,游戏结束;
GameController比GameState更具体。GameController基本上是在GameState switch之后处理一系列的任务。游戏产业仍然是五子棋。例如,游戏产业从主菜单切换到游戏玩法。GameController将加载一个加载画面,加载后取消加载画面,并显示一个棋盘等待。当然,OnLoading也可以用作游戏状态。不管你是否想要游戏的OnLoading状态,它都在灵活性选项中(笑声)。
有必要对游戏状态进行检测,如果游戏在某一时刻改变了状态,那么作为GameController,你就得做点什么,这么快!快!辛苦!
所以在一个单独的线程中,整个while (true)会不断迭代,以确定游戏状态是否已被切换。
当然,GameController也可以使用Singleton。我认为这很好。它既能异步执行,又能快速、全面地满足快速、准确的要求。它还分离了渲染线程和游戏逻辑线程。并行优化/降级似乎非常好(笑声)。对于小型游戏,多线程可能会用牛刀杀死鸡,但却会恶化游戏。的性能。
但是现在游戏引擎有一个函数叫per frame,所以把游戏状态检测放在里面也很好。在这里,我们提供了一个c#统一代码作为参考。
Unity的C#的原型代码:
void Awake()
{
Instance = this;
}
void Start()
{
m_StartWait = newWaitForSeconds(m_StartDelay);
m_EndWait = newWaitForSeconds(m_EndDelay);
StartCoroutine(GameStateOperator());
}
IEnumeratorGameStateOperator()
{
while(true)
{
switch(S_GameState.Instance.GetGameState())
{
caseS_GameState.GameState.GameInit:
GameInit();
break;
caseS_GameState.GameState.GameReady:
GameReady();
break;
caseS_GameState.GameState.GamePlay:
GamePlay();
break;
caseS_GameState.GameState.GamePause:
GamePause();
break;
caseS_GameState.GameState.GameOver:
GameOver();
break;
}
yieldreturnnull;
}
}
补记:
这里使用Unity的伪线程(co-threading)来促进多线程的引用,同时也使代码结构更加清晰。
四、状态切换
GameState提供了游戏状态切换,GameController提供了状态切换后的工作处理,所以问题来了,什么是切换GameState?
自然,GameObejct, player roles, Npc, a bullet, some trigger,键盘操作等等。回到上面,查看GameState的切换函数使用的是public。这就是为什么,不管怎样,它都是静态的,有点裸露。我认为它很好(笑)。
例如,回到最初的主题,玩家角色可能具有HP属性。当HP==0时,GameOver调用GameState的状态切换函数并调用GameOver。此时,GameController检测到游戏状态切换并开始完美响应。
当然,GameController也可以使用状态切换。例如,一些倒计时计算,如检查点,需要在GameController中编写。当倒计时为0时,游戏结束,这时GameController需要调用切换函数。同样,在GameController中玩家角色的HP检测并不是不可避免的,但这显然不符合OOP的设计原则,所以明显增加了耦合,软件工程教师会很生气。但我只是想惹他生气(笑)。
补充说明:
对于游戏对象的分析和设计,我认为有必要综合OOP的思想和设计原则。虽然大多数主流游戏类型都有原型,比如非常人性化的UE4,但是提供了各种类型的游戏原型,UML和其他工具也非常好用。当然,我们不能忘记UI的设计。UI适用于游戏程序。有效利用游戏地产是一个很好的切入点。下一篇文章我将讨论UI设计。
交易额: 233.74万元
无 |江苏省 |南京市 |建邺区
交易额: 184.39万元
无 |河南省 |洛阳市 |洛龙区
交易额: 151.77万元
工作室 |浙江省 |台州市 |玉环县
交易额: 128.29万元
公司 |广东省 |深圳市 |南山区
成为一品威客服务商,百万订单等您来有奖注册中
价格是多少?怎样找到合适的人才?
¥50000 已有0人投标
¥100 已有12人投标
¥3000 已有7人投标
¥10000 已有7人投标
¥10000 已有6人投标
¥200 已有97人投标
¥50000 已有1人投标
¥100 已有0人投标