改进Hit_Disk游戏

1.内容与要求

  1. 按照adapter模式设计图修改飞碟游戏
  2. 使它同时支持物理学运动与运动学(变换)运动

2. 变换运动的实现

在之前的项目中已经实现了disk的变换运动,也就是一个disk会随着时间不断地改变其在空间中的位置,本次需要让disk实现物理运动的功能,也就是要给给一个重力让其实现初速度不为0的自由落体运动。通过实现adapter模式使得物理学运动与变换运动可以一起工作。同时不能放弃之前已经实现的模式:工厂对象、动作管理等

Adapter模式:将一个类的接口转换为客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

3.实现adapter模式:

3.1 通过接口IActionManager接口来管理两种运动,接口中为两种运动具有的相同的动作。
public interface IActionManager
{void Pause();void Run();void StartThrow(GameObject disk);
}
3.2 定义实现disk的物理运动physicActionManger管理,通过回调实现。
public class PhysicActionManager : MonoBehaviour, IActionManager, ISSActionCallback
{public FirstController sceneController;//场记public int DiskNumber = 0;//统计disk数量private Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>();        //保存所以已经注册的动作private List<SSAction> waitingAdd = new List<SSAction>();                           //动作的等待队列private List<int> waitingDelete = new List<int>();                                  //动作的删除队列private bool run;//是否开始运动public void Start(){sceneController = (FirstController)SSDirector.GetInstance().CurrentScenceController;sceneController.actionManager = this;run = true;}//实现fixedUpdatepublic void FixedUpdate(){if (run){foreach (SSAction action in waitingAdd){actions[action.GetInstanceID()] = action;}waitingAdd.Clear();//等待清除foreach (KeyValuePair<int, SSAction> kv in actions){SSAction action = kv.Value;if (action.destroy){waitingDelete.Add(action.GetInstanceID());}else if (action.enable){action.FixedUpdate();}}//把删除队列里所有的动作删除foreach (int key in waitingDelete){SSAction action = actions[key];actions.Remove(key);DestroyObject(action);}waitingDelete.Clear();}  }//初始化一个动作并添加到等待队列中public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager){action.gameobject = gameobject;action.transform = gameobject.transform;action.callback = manager;waitingAdd.Add(action);action.Start();}public void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted, int intParam = 0, string strParam = null, Object objectParam = null){if (source is UFOFlyAction){DiskNumber--;source.gameobject.SetActive(false);}}public void StartThrow(GameObject disk){FlyActionFactory factory = Singleton<FlyActionFactory>.Instance;RunAction(disk, factory.GetSSAction(), (ISSActionCallback)this);}//暂停public void Pause(){run = false;}//运行public void Run(){run = true;}
}
3.3 实现FlyActionManager类来管理Disks,主要实现action中的Update方法。
public class FlyActionManager : MonoBehaviour, ISSActionCallback, IActionManager
{public int DiskNumber = 0;//disk numberpublic FirstController sceneController;//场记private Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>();        //保存所以已经注册的动作private List<SSAction> waitingAdd = new List<SSAction>();                           //动作的等待队列,在这个对象保存的动作会稍后注册到动作管理器里private List<int> waitingDelete = new List<int>();private bool run;protected void Start(){sceneController = (FirstController)SSDirector.GetInstance().CurrentScenceController;sceneController.actionManager = this;run = true;//inital}protected void Update(){if (run){   //动作在等待队列中foreach (SSAction ac in waitingAdd){actions[ac.GetInstanceID()] = ac;}waitingAdd.Clear();//将action于value进行一对一映射,方便管理foreach (KeyValuePair<int, SSAction> kv in actions){SSAction action = kv.Value;if (action.destroy){waitingDelete.Add(action.GetInstanceID());}else if (action.enable){action.Update();}}//删除队列中的某个actionforeach (int key in waitingDelete){SSAction action = actions[key];actions.Remove(key);DestroyObject(action);}waitingDelete.Clear();}    }public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager){action.gameobject = gameobject;action.transform = gameobject.transform;action.callback = manager;waitingAdd.Add(action);action.Start();}public void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted, int intParam = 0, string strParam = null, Object objectParam = null){if (source is UFOFlyAction){DiskNumber--;source.gameobject.SetActive(false);}}//飞碟开始按照action动作列表规定的动作序列运动public void StartThrow(GameObject disk){FlyActionFactory cf = Singleton<FlyActionFactory>.Instance;RunAction(disk, cf.GetSSAction(), (ISSActionCallback)this);}public void Pause(){run = false;}public void Run(){run = true;}
}
3.5 通过实现FlyActionFactory类来实现动作序列额工厂模式,与Diskfactory类似,不必每次都实现新的动作,只需要调用保存在回收队列的action。
public class FlyActionFactory : MonoBehaviour
{private Dictionary<int, SSAction> used = new Dictionary<int, SSAction>();private List<SSAction> free = new List<SSAction>();private List<int> wait = new List<int>();public UFOFlyAction Fly;void Start(){Fly = UFOFlyAction.GetCCFlyAction();}//对判定为destroy的动作进行释放private void Update(){foreach (var action in used.Values){if (action.destroy){wait.Add(action.GetInstanceID());}}foreach (int ID in wait){FreeSSAction(used[ID]);}wait.Clear();}//获得一个新的动作,先从free队列中找,没有就生成一个并加入到运行队列public SSAction GetSSAction(){SSAction action = null;if (free.Count > 0){action = free[0];free.Remove(free[0]);}else{action = ScriptableObject.Instantiate<UFOFlyAction>(Fly);}used.Add(action.GetInstanceID(), action);return action;}//释放某个动作,加入到free队列public void FreeSSAction(SSAction action){SSAction tmp = null;int key = action.GetInstanceID();//检查是否含有某动作if (used.ContainsKey(key)){tmp = used[key];}//有则释放if (tmp != null){tmp.Reset();free.Add(tmp);used.Remove(key);}}//清除所有在使用的动作public void clear(){foreach (var action in used.Values){action.enable = false;action.destroy = true;}}
}
3.6 在Singleton.cs与SSaction.cs文件中做相应的修改即可完成。

4. 效果展示:

5 不足与改进:

  1. 物理运动的动作实现太单一,只有自由落体运动。
  2. 部分disk的点击难度较大。

改进Hit_Disk游戏相关推荐

  1. Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣

    Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣 今天这套主题,仅仅是通过改进让游戏更加有趣,游戏中的细节永远是耐人寻味,有的游戏团队为此付诸努力甚至成为整个项目的成功关键 ...

  2. 多智能体强化学习_基于多智能体强化学习主宰星际争霸游戏

    大家好,今天我们来介绍基于多智能体强化学习主宰星际争霸游戏这篇论文 Grandmaster level in StarCraft II using multi-agent reinforcement ...

  3. Concepts in Games Development(游戏开发概述) 公开课笔记

    Concepts in Games Development是Open2Study平台上的课程,Dr. Clinton Woodward老师任教于Swinburne University of Tech ...

  4. Silverlight C# 游戏开发:项目开发实例和小技巧索引

    Silverlight C# 游戏开发:项目开发实例和小技巧索引 相比于技术文章而言,本索引中包含的都是独立的项目,争取按照每个独立的项目开发来编写系列,全部为原创,开发过程可能语无伦次,可能相当幼稚 ...

  5. 开发手机游戏的步骤是怎样的?

    开发过程始于对 TA 的研究和分析.谁会玩你的游戏?他们究竟喜欢这款游戏的哪些方面?他们希望看到哪些功能?当您对玩游戏的人有清晰的认识时,开发过程会变得更容易. 此外,我们进行竞争性研究,以获得对当前 ...

  6. 2014网易游戏实习生面试体验

    如果你大学里有想过从事游戏开发的话,你对网易游戏肯定不会陌生,网易开发出过梦幻西游,倩女幽魂这种端游大作,可惜在页游和手游方面现在依旧毫无建树,网易游戏的特点有以下几个: 工作环境非常好,或者极端点说 ...

  7. 浅谈人工智能与游戏思维

          如何找到一种可产生意向性的形式化手段是通往人机有效融合的关键,目前的数学.物理手段还不具备完全承担这个重任的能力,因为这仅是智能--这个复杂性系统问题的两个方面而已.       下文首先 ...

  8. 游戏设计艺术(第3版) The Art of Game Design 看评论

    作者:[美] Jesse,Schell(杰西・谢尔) 著,刘嘉俊 等 译 出版社: 电子工业出版社 品牌:博文视点 出版时间:2021-05-01 游戏设计艺术(第3版) 不需要是技术专家,只要阅读& ...

  9. 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第3部分

    这篇文章还可以在这里找到 英语 Create a Sprite-Cutting Game with Cocos2D! 本篇教程是由iOS教程组的成员Allen Tan发布的,Allen是一位iOS开发 ...

最新文章

  1. 打开计算机后 无法最小化,最小化窗口后无法在任务栏中显示的三种解决方法...
  2. 给字符串对象定义一个repeat功能。当传入一个整数n时,它会返回重复n次字符串的结果。
  3. as5300g2 nas软件功能_铁威马F2-221上手:家用NAS入门首选,还支持两年换新
  4. ML.NET Cookbook:(20)我如何定义自己的数据转换?
  5. 微信小程序的scroll-view组件
  6. ubuntu rpm安装_为什么说Ubuntu是一个值得尊敬的Linux发行版
  7. linux socket编程:简易客户端与服务端
  8. Gym - 102163M
  9. Mybaits整个Spring项目,简单示例,10分钟快速上手
  10. CAD 开发 图案填充
  11. moviepy图片和文字合成视频
  12. 今晚8:00 | 杜克大学计算进化智能中心(CEI Lab)—— 高效鲁棒深度学习专题!...
  13. 马科维茨投资组合理论总结
  14. lagrange量中的u和v的来历
  15. WIN7去掉快捷方式小箭头
  16. SHA-512 逻辑
  17. html qq消息弹窗提醒,能不能让QQ消息不再讨厌 QQ HD mini消息弹窗提醒的优化方案...
  18. warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness
  19. php artisan migrate,关于laravel 5.1下php artisan migrate的使用
  20. Win7系统应用技巧集锦

热门文章

  1. 图片跟随鼠标移动效果的抖动问题
  2. 一篇文章全面了解Shopify开店
  3. 小米 信号测试软件,小米MIX 3信号实测:完胜iPhone XS Max
  4. OSCAR开源先锋日|成立三大开源组织,2022 OSCAR开源先锋日成功举办!
  5. 深度分析互联网转型:建新零售平台快速赚钱拼多多市值超网易京东
  6. php模拟流量器,插入式电磁流量计 智能流量计
  7. 【数据库学习】——【汇总】MySQL数据库下载与安装(Msi文件安装和免安装版本)、Navicat下载与安装
  8. 操作系统——Python:生产者——消费者
  9. 语音会议服务器设置,VCX语音会议服务器系统提示音录音方法
  10. 锤子手机2014发布会视频