欢迎使用我的最新项目SandCat的第一次更新。 我尚未对该项目进行真正的介绍,因此您现在只需要忍受我。 但是-这是项目的重点。 SandCat是第一种游戏规则集原型语言。 该语言旨在通过允许设计人员完全专注于核心机制和规则,而忽略软件要求,从而加快游戏设计过程。 如果您想进一步了解我的意思,请阅读我以前的文章“改善游戏设计过程”。
这是第一个更新-显然意味着这是许多更新中的第一个。 这些更新是我计划讨论语言设计决策,计划的功能,总体进度以及适用于该项目的其他所有内容的地方。 更新将是快速的,非正式的和未打磨的。 我之所以写这些文件,有两个原因:1.对于读者来说-推销该项目,说出话来,并希望能得到反馈。 2.对于我自己-记录进度并整理我的想法。
- “ Era uma vez…” um jogo de tabuleiro
- GameDev Protips:如何卖出更多独立游戏副本
- 波斯王子:逃生-为什么关卡计数是秘密
- 老板在暗影格斗3
- 测试人员会发现哪些错误?
考虑到这些都是快速的非正式更新,所有内容均为初稿,很可能会更改。 因此:我强烈建议读者忽略分钟的细节,而将注意力放在长期目标上。 例如,不要在意语法。 我还不担心语法。 我知道这是非常粗糙的,次优的,而且非常不一致。 我的目的是在完善细节之前证明核心思想。
基础工作
对于此第一次更新,我将简单介绍项目的开始。
首先,所有游戏都需要某种状态。 您可以像这样指定状态,
鸡。
播放时,您会得到。

这只是一个事实陈述。 没有更多上下文,很难概念化。 我们可以通过提供更好的名称来添加一些上下文。
鸡肉健康。

但是鸡的健康意味着数值。 我们也可以指定。
ChickenHealth(10)。

大。 我们有一些非常基本的初始状态。 现在我们如何改变这种状态? 目前,这是通过事件完成的。 他们遵循的模式
//事件(EVENT_NAME)-STATE_CHANGING:CONDITIONS
事件(HurtChicken)-ChickenHealth(ChickenHealth-1):有条件(ChickenHealth> 0)。

用英语来说,此内容表示为—此事件称为HurtChicken,它将ChickenHealth设置为减去当前ChickenHealth的值,并且仅在ChickenHealth大于0时才有可能。
我认为这是一个不错的开始。 它非常初级,但是已经可以表达简单的游戏了。
盾牌推
仅使用这两个功能,我就可以编写一个名为Shield Push的小型游戏。
该游戏具有规则的图形表示。 不用担心 给设计师提供视觉上组织游戏的工具非常重要,但是我还没有解决这个挑战。
回到游戏。 在此游戏中,玩家可以移动红色方块,但不能移出网格边界,也不能移入黑色方块。 蓝色矩形是一个盾牌,一旦被拾起,玩家就只能向上或向下推动黑色方块。 以下是游戏的规则定义,后跟正在玩的游戏的gif。
//初始状态
GridMaxX(10)。
GridMinX(0)。
GridMaxY(10)。
GridMinY(0)。
PlayerX(2)。
PlayerY(3)。
BlockX(3)。
BlockY(3)。
ShieldPosX(5)。
ShieldPosY(7)。
//移动的玩家。 无法进入街区。
event(MoveUp)-PlayerY(PlayerY-1):
有条件的(PlayerY> GridMinY)&! [conditional(PlayerY-1 = BlockY)&conditional(PlayerX = BlockX)]。
event(MoveDown)-PlayerY(PlayerY + 1):
有条件的(PlayerY <GridMaxY)&! [条件(PlayerY +1 = BlockY)和条件(PlayerX = BlockX)]。
event(MoveLeft)-PlayerX(PlayerX-1):
有条件的(PlayerX> GridMinX)&! [conditional(PlayerX-1 = BlockX)&conditional(PlayerY = BlockY)]。
event(MoveRight)-PlayerX(PlayerX + 1):
有条件的(PlayerX <GridMaxX)&! [conditional(PlayerX +1 = BlockX)&conditional(PlayerY = BlockY)]。
//推块。
event(PushBlockUp)-PlayerY(PlayerY-1),BlockY(BlockY-1):
有条件的(PlayerY> GridMinY)和[有条件的(PlayerY-1 = BlockY)和有条件的(PlayerX = BlockX)]和有条件的(BlockY> GridMinY)和有条件的(PlayerHoldingShield = 0)。
event(PushBlockDown)-PlayerY(PlayerY + 1),BlockY(BlockY +1):
条件(PlayerY <GridMaxY)和[条件(PlayerY + 1 = BlockY)和条件(PlayerX = BlockX)]和条件(BlockY <GridMaxY)和条件(PlayerHoldingShield = 0)。
//拾起盾牌
event(PickupShield)-PlayerHoldingShield(0):
有条件的(PlayerX = ShieldPosX)和有条件的(PlayerY = ShieldPosY)。

问题与解决方案
这显然可以改善。 我看到有两个大问题。
- 规则定义中有很多重复。 上下移动播放器是一个非常相似的概念,因此应压缩相似之处并将其放入自己的可重用单元中。 可以说是相同的。 确保播放器与块的位置不同,只需要写入一次,但是当前它已分布在多个事件中。
- 您不能捆绑数据。 例如,添加第二个块是一项艰巨而单调的任务。 这部分是由于第一个问题,而且还因为该块的数据和规则未捆绑在一起。
这是我接下来的两项主要任务:减少相似规则的重复,并简化数据的捆绑和复制。 我认为这是一个良好的开端,但仍有很多工作要做。