首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >帮助解耦游戏设计

帮助解耦游戏设计
EN

Stack Overflow用户
提问于 2011-02-03 22:52:22
回答 2查看 194关注 0票数 0

这是当前的依赖关系图(TheTXI的手绘圆圈)

一个游戏有玩家和他们之间共享的一个棋盘。玩家还可以访问棋盘,以便能够在棋盘中添加/移动/移除单位。玩家可以访问它拥有的单位,无论是在棋盘上还是在棋盘外(一个单位也知道它的所有者,但这可能是可以删除的,只需进行查找)。棋盘上有单位,并且知道单位的位置。单位有能力(玩家可能也可以)

我弄不清楚的一个大问题是单位的能力。他们应该能够影响游戏中的任何东西,治疗/伤害玩家/单位,重新定位棋盘上的东西,甚至可能是游戏本身(到目前为止还没有必要,但它可能会出现)。

我怎样才能拥有能够影响任何事情的能力,而不是引用所有的东西?我意识到每个技能可以也应该只引用它需要的东西,但是一个单位职业有内置的能力,所以如果一个单位的能力影响了板,它将需要以某种方式从单位获得对板的引用?

我正在努力保持设计的灵活性,因为规则还没有确定下来(我们正在创建一个游戏,而且还处于早期阶段,所以它是尝试一些东西,看看它的感觉如何,改变规则直到游戏感觉正确)

即使是否有一个棋盘/地图仍然是悬而未决的,所以单位应该与之解耦,目前是这样的。没有全局状态或任何“上帝对象”(目前还没有),我希望保持这种状态。

具体来说,它是在Python和webapp中实现的,因此,尽管问题本身与语言无关,但任何基于具有一流函数的动态语言的细节都是受欢迎的。

EN

回答 2

Stack Overflow用户

发布于 2011-02-04 10:07:13

首先,让我带您去看一下非常棒的gamedev StackExchange。你可能会更幸运地在那里发布这个问题。

就你的问题本身而言,我认为一种解决方案是将触发能力的对象的通知传递给游戏对象,然后游戏对象会解析这些通知,并将它们分发给特定的玩家或棋盘,然后从那里分发到特定的单位。

这很难解释,所以让我试着用psuedocode写出来…

代码语言:javascript
运行
复制
Game {
 getMe(); //Returns reference to singleton class. 
 list of players
 list of boards
}

Board { 
 list of units 
}

Unit {
 int health
}

function Unit.notifyAbility(source, targeting-condition, ability-code) {
  Game::getMe()->sendNotification(source, targeting-condition, ability-code);
}

function Game.sendNotification(source, targeting-condition, ability-code) {
 for each unit in list of units {
   if(unit matches targeting condition) {
     apply ability-code
   }
 }
}

目标条件和能力代码本身可以是传递相关信息的数据结构。更好的是,让它们成为虚拟类,并使用某种形式的多态性来处理独特的情况。

示例:

代码语言:javascript
运行
复制
AbilityCode {
 virtual function applyToUnit(target Unit)
 virtual function applyToPlayer(target Unit)
}

AbilityGainHP: child of AbilityCode {
 function applyToUnit(target Unit) { target.hp+= gainAmt; }
 int gainAmt;
}

希望这是有意义的。

票数 1
EN

Stack Overflow用户

发布于 2020-06-17 16:40:46

你可能对此想得有点过了。

请记住,您希望能够使用您的代码库,因此能够轻松地理解您的代码是很重要的,即使您还没有处理过这一特定部分。

如果你用文字来描述你的游戏,你很可能会这样使用:这是一个X玩家的游戏,在(specfics)的棋盘上玩。每个玩家控制Y单位。

所以,像这样开始你的设计。游戏(要么是你的完整代码,要么只是你程序的运行状态)需要有对棋盘和玩家的引用。

现在,董事会会处理你的大部分问题。如果玩家与游戏交互,他很可能会在棋盘上做一些事情。

从一个简单的系统开始,它允许你移动东西,你应该能够移动,而不能移动你不应该移动的东西。

这些异能很可能是包含整个列表中当前可用选项的列表。这些将取决于单元,也可能取决于电路板的其他元素。

根据游戏类型的不同,您可以使用事件通知单位某些内容发生了变化,也可以在需要时简单地获取信息。

不要添加超过实际需要的抽象层。从你的描述来看,这些能力似乎是你想花最多时间的部分,以确保你可以轻松地对其进行更改和添加。

从其他部分的简单设计开始,如果您发现在某些点上需要额外的层,则进行重构。这将避免分析瘫痪。Esp。当你想做一个“整洁的设计”时,很容易把事情搞得过于复杂。

你想让游戏运行起来。您希望能够轻松地阅读(和理解)您的代码。即使在项目中工作,你的编码风格和知识也会发生变化,在编码的同时你也会得到新的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4887660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档