如何在益智类游戏中实现命令模式?

问题描述 投票:1回答:1

设置。我正在做一个经典的自上而下的、以瓷砖为基础的、关于推积木的解谜游戏,我正在尝试实现命令模式的UndoRedo功能。在我的设计中,每当玩家移动一块瓷砖时,就会触发一个 "回合",并且世界必须以某种方式更新(激光可以被阻挡,如果在水面上,砖块会被摧毁,大地板按钮被按下,等等)。

我把玩家的移动抽象成了一个具体的命令。MoveCommand 通过简单地根据执行时的方向改变其位置。然后,这个MoveCommand被实例化在一个叫做 Move() 方法。块也正好有一个 Move() 方法,只要玩家 "推 "他们(即走进他们,后面有一个空位)就必须调用。

问题1. 块的移动应该是自己的命令,还是应该以某种方式附加到玩家的命令中并由玩家的 MoveCommand? 现在我想我会让每一个都成为自己独立的东西,然后每当玩家按下Undo按钮,让Undo方法执行几次,直到该回合必须发生的所有事情都解决。但是,我不确定你是否应该这样实现这个模式。

问题2 如上所述,积木碰水后必须销毁。如果这种破坏是自己的 WalkIntoDeadlyTile 命令,还是应该把它附加到块的 MoveCommand? 这两个问题让我意识到自己可能没有理解这个模式的使用方法,但我不知道该怎么查,也不知道该怎么回答这些具体问题。

c# unity3d design-patterns command-pattern
1个回答
0
投票

这是一个罕见的情况,其中 IC指令接口 不会完全错位。你不能老是做民调 CanExecute 在大多数环境中,你需要一个强制重新评估条件的方法。你需要一种方法来强制对条件进行重新评估。或者干脆使用一些带有绑定的东西。

但无论如何,游戏是我所说的 "臭名昭著的重绘者"。他们可以轮询 CanExecute 每次画图时一次,输入处理时一次,不会有太大问题。检查也会比较简单(isPlayerTurn). 唯一可能的问题是把游戏状态放到命令实现中。

问题2 如上所述,当方块接触到水时必须被破坏。这种破坏应该是它自己的WalkIntoDeadlyTile命令,还是应该附加到Block的MoveCommand中?

它应该发生在colission检查中。一个基本的方块就可以了,如果块盒与水盒碰撞,就在块上调用毁灭。这样也可以防止你忘记给以后的块添加特殊运动,或者如果块的 莫名其妙 传送到水底。

© www.soinside.com 2019 - 2024. All rights reserved.