改进飞碟(Hit UFO)游戏

改进飞碟(Hit UFO)游戏:

游戏内容要求:

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

主要代码实现思路

1.这里用了两个工厂类来管理飞碟和控制飞碟运动的脚本的生成和回收,它们的实现的代码类似,以下是飞碟工厂的代码片段:

 private Dictionary<int, SSAction> used = new Dictionary<int, SSAction>();
 private List<SSAction> free = new List<SSAction>();
 private List<int> wait = new List<int>();

所有正在使用的飞碟都保存在used
未被激活的飞碟保存在free

wait是用来保存等待释放的飞碟

 private void Update()
    {
        foreach (var tmp in used.Values)
        {
 
            if (!tmp.gameObject.activeSelf)
            {
                wait.Add(tmp.GetInstanceID());
            }
        }
 
 
        foreach (int tmp in wait)
        {
            FreeDisk(used[tmp].gameObject); //释放一个飞碟
        }
        wait.Clear();
    }

以上代码用来实现飞碟的自动回收,通过飞碟是否活跃,来判断是否回收

2.这里还实现了两个管理动作的类,一个是管理运动学的动作CCActionManager,另外一个是动力学的动作PhysicActionManager,它们实现的代码也基本相似,下面是

CCActionManager的一些代码片段

 private Dictionary<int, SSAction> actions = new Dictionary<int, SSAction>();        //保存所以已经注册的动作
    private List<SSAction> waitingAdd = new List<SSAction>();                           //动作的等待队列,在这个对象保存的动作会稍后注册到动作管理器里
    private List<int> waitingDelete = new List<int>();                                  //动作的删除队列,在这个对象保存的动作会稍后删除

protected void Update()
    {
        foreach (SSAction ac in waitingAdd) actions[ac.GetInstanceID()] = ac;
        waitingAdd.Clear();
 
        //管理所有的动作,如果动作被标志为删除,则把它加入删除队列,被标志为激活,则调用其对应的Update函数
        foreach (KeyValuePair<int, SSAction> kv in actions)
        {
            SSAction ac = kv.Value;
            if (ac.destroy)
            {
                waitingDelete.Add(ac.GetInstanceID());
            }
            else if (ac.enable)
            {
                ac.Update();
            }
        }
 
        //把删除队列里所有的动作删除
        foreach (int key in waitingDelete)
        {
            SSAction ac = actions[key];
            actions.Remove(key);
            DestroyObject(ac);
        }
        waitingDelete.Clear();
    }

CCActionManager动作管理器通过以下代码把一个动作和一个对象给关联起来

  public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager)
    {
        action.gameobject = gameobject;
        action.transform = gameobject.transform;
        action.callback = manager;
        waitingAdd.Add(action);
        action.Start();
    }

实现结果图

在这里插入图片描述

总结

这次主要是用上次代码加以改进,加入物理引擎,总体代码量减少不少,但是学到的东西却是挺多的。

github代码

代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值