空间与运动——简单太阳系+牧师与魔鬼

一、简答并用程序验证

1、游戏对象运动的本质是什么?

游戏对象的运动是物体随着游戏进行的每一帧进行空间的变化。其本质是通过矩阵变换,比如平移、旋转、缩放等改变游戏对象的空间属性。游戏中每个对象Transform面板中的Position、Rotation以及Scale就是直接控制对象空间属性的参数。运动的本质就是这些参数的变换。

2、请用三种方法以上方法,实现物体的抛物线运动

  • 修改 transform 属性
    在这里插入图片描述

  • transform 的方法 Translate
    在这里插入图片描述

  • 向量 Vector3 的方法 MoveTowards
    在这里插入图片描述

3、简单太阳系

二、编程实践

  • 阅读以下游戏脚本

    Priests and Devils


    Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the river. They all want to get to the other side of this river, but there is only one boat and this boat can only carry two persons each time. And there must be one person steering the boat from one side to the other side. In the flash game, you can click on them to move them and click the go button to move the boat to the other direction. If the priests are out numbered by the devils on either side of the river, they get killed and the game is over. You can try it in many >
    ways. Keep all priests alive! Good luck!

  • 程序需要满足的要求

    • play the game
    • 列出游戏中提及的事物(Objects)
    • 用表格列出玩家动作表(规则表),注意,动作越少越好
    • 请将游戏中对象做成预制
    • 在 GenGameObjects 中创建 长方形、正方形、球 及其色彩代表游戏中的对象。
    • 使用 C# 集合类型 有效组织对象
    • 整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成!!!整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的 通讯耦合 语句。
    • 请使用课件架构图编程,不接受非 MVC 结构程序
    • 注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!
  • 在游戏中提及的事物
    在这里插入图片描述
    3个牧师、3个魔鬼、一条小船、河、河两岸

  • 玩家动作表

玩家动作执行条件执行结果
点击牧师牧师与船在相同河岸、船处于静止状态、乘客少于两名牧师移动到船上
点击魔鬼魔鬼与船在相同河岸、船处于静止状态、乘客少于两名魔鬼移动到船上
点击船船上有至少一位乘客船向对岸移动
点击船停留在河岸上的牧师数量小于魔鬼数量牧师死亡、游戏结束
点击船上的乘客船处于静止状态转移到船所在的河岸

1、脚本设计

  • 使用MVC架构

    • 游戏中的中的所有 GameObject 都需要被设计为 Model;Model 受到场记 Controller 的控制;用户通过View模块来与游戏进行交互。
    • 按照游戏说明,Model中应该存在人物(相似的魔鬼与牧师可以合并在一个类中)模型,船模型,河流模型以及河岸模型。模型中存在基本的处理函数,但是模型之间无法互联这个工作需要由场记 Controller 指导完成。
    • 由于此处只有一个较为简单的场景,所以除了指挥全场的导演外,我们只需要一个场记来完成所有事件的处理,包括指导船向河岸移动,人物从船上到河岸或从河岸下船,游戏的结束与重启等。
    • View 模块被设计用来展示以及与用户交互,在这里我们可以简单的设计一个游戏胜利与失败的界面显示和重启按钮。

  • Controller 的设计
    在这里插入图片描述Controller 在这里被命名为 ISceneController,掌控游戏中事件的发生,因此需要在参数中保存游戏中的对象模型。另外的参数 winGame 与 loseGame 用来记录游戏是否结束。

  • Start
    在这里插入图片描述
    在开始时需要初始化导演以及加载游戏中使用到的资源。

  • 加载资源
    在这里插入图片描述
    在函数中创建游戏模型。因为游戏初始时人物都处于右边河岸,所以通过 getVacantIndex 每次得到右边河岸的下一个空位置的编号返回给对象,就像我们日常买票看电影一样,只要知道了在“几排几座”,人物模型 character 可以自己找到需要到达的位置。

  • 船的航行控制
    在这里插入图片描述
    moveBoat控制船的移动,在每次玩家点击船时触发。当船此时的状态为“没有乘客”或“正在航行”时,船不会执行进一步的动作。当船处于可以出发的状态时,Controller 检查此时的游戏状态后控制船向对岸进发。

  • 人物触发事件
    在这里插入图片描述
    点击人物时首先 Controller 需要检查人物与船此时的状态。如果船在航行,那么此时没有事件可以触发,函数返回;如果船在港口并且人此时在船上,那么此时需要触发的事件为下船,因此将人物状态改为在此岸,并通过河岸空闲编号的获取得到为其分配的位置。需要注意的是,这里还需要“通知”船船上的人已经下船,这样才好为之后的人腾位置。这一点也是十分符合我们日常规律的~当人此时在岸上,那么此时应该触发的是上船事件。因为我们的小船只能够容纳两个人,所以需要判断此时船的容量,并且不要忘记判断船与此人是否在同一个河岸以及通知河岸他已经离开。

  • 检查游戏状态
    在这里插入图片描述
    由于保存了游戏模型,所以只需要通过循环检查每个河岸所有的牧师与魔鬼的数量。某岸上魔鬼人数多于牧师(牧师数量同样不为0),则游戏失败;左岸上魔鬼与牧师的人数等于总人数,游戏胜利。对于游戏状态的检查可以简单的放在船开始移动,以及某次到达河岸后乘客全部下船后。

  • 游戏的停止与重启
    在这里插入图片描述
    当游戏结束时需要使玩家不能够再操作游戏中的对象,这一点可以通过删除其控制点击和移动事件的脚本来完成。需要注意的是,为了取消脚本的功能,这里我曾使用script.enabled = false 】的方法,希望在不删除脚本的前提下停止与玩家交互。这时候就出现了问题,某些模型的脚本已经被停止了,不再被点击触发,但某些仍然可以使用。经过上网查阅后才发现,设置脚本的enabled为false时只是暂停了此脚本的Update和FixedUpdate等函数,而脚本中开启的协程(StartCoroutine)和用Invoke唤起的函数依然在执行不受影响。这里是一个需要注意的地方。

  • Model 与 View 的设计比较琐碎/简单,可以直接到 github 上查看 传送门

2、效果图

运行视频链接在这里!
在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值