物理系统与碰撞

改进飞碟(Hit UFO)游戏:

游戏内容要求:

1.按 adapter模式 设计图修改飞碟游戏

适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

2.使它同时支持物理运动与运动学(变换)运动

实现Rigidbody的碰撞功能,采用adapter模式来增加新的(物理)动作管理者

代码实现

除了Action相关类之外的类变化不大,需要实现基类(接口)baseActionManager 和两个动作管理类 SSActionManager / PhysicActionManager

baseActionManager

public interface baseActionManager
    {
    	//设置回调
        void setCallback(ISSActionCallback _callback);
    	//停止所有动作,对应 nextRound / nextTrial / restart
        void stop();
    	//发送UFO,两个Action Manager具有不同的实现,Adapter模式的体现
        void FlyUFO(List<GameObject> waitToFly,Ruler ruler,int round);
    }

SSActionManager
正常的发送UFO,按顺序发送,等到上一个发送完毕后再发送下一个,不产生碰撞

public void setCallback(ISSActionCallback _callback)
{
    callback = _callback;
}
public void stop()
{
    if(runSequence.Count <= 0) return;
    //因为放入sequenceAction中执行,所以runSequence只有一个/零个action
    runSequence[0].stop();
}

public void FlyUFO(List<GameObject> waitToFly,Ruler ruler,int round){
	List<SSAction> toMove = new List<SSAction>();
    for(int i = 0;i < waitToFly.Count; i++)
    {
    toMove.Add(CCMoveToAction.GetSSAction(waitToFly[i],ruler.getDes(waitToFly[i].transform.position),ruler.getSpeed(round)*AnimateSpeed,null));
    }
	sequenceAction action = sequenceAction.GetSSAction(1,0,toMove,this);
	addAction(action);
}

回调函数
回调函数在管理器中十分重要,因为它涉及到UFO回收以及对于分数的处理,这里由于调用顺序为
SSActionManager -> sequenceAction -> CCMoveToAction
所以在前两个类中都需要实现回调
SSActionManager

public void SSActionEvent(SSAction source,
        SSActionEventType events = SSActionEventType.Competeted,
        int intParam = 0,
        string strParam = null){
    runSequence.Remove(source);
    if(this.callback!=null)
        this.callback.SSActionEvent(source);
    //回调告诉游戏场景控制器可以进入下一轮
}

sequenceAction

public void SSActionEvent(SSAction source,SSActionEventType events = SSActionEventType.Competeted,int intParam = 0,string strParam = null)
{
    Debug.Log("callback 0");
    source.destroy = false;
    this.start++;
    //处理是否点击和分数
    UFO ufo = source.gameobject.GetComponent<UFO>();
    if(!ufo.isClicked){
        Judge.getInstance().subScore(ufo.score);
    }
    //回收UFO
    UFOFactory.getInstance().free(source.gameobject);
    if(this.start>=sequence.Count){
        this.start = 0;
        if(repeat>0)repeat--;
        if(repeat==0){
            destroy = true;
            Debug.Log("callback 1");
            this.callback.SSActionEvent(this);
        }
    }
    //告诉动作管理器当前Trial的UFO均已完成动作
}

PhysicActionManager
在实现同时发送多个UFO(中间间隔事件由Ruler设置)的过程中,我们通过协程来实现该功能

IEnumerator setNextFly(float time,SSAction action)
{
    yield return new WaitForSeconds(time);
    addAction(action);
    waitSequence.Remove(action);
}

在该动作控制器中,还需要额外添加一个waitSequence队列来放置等待发送的UFO

public void setCallback(ISSActionCallback _callback)
{
    callback = _callback;
}

public void stop()
{
    //关闭协程
    StopAllCoroutines();
    //对于每一个已经执行的动作,手动终止
    while(runSequence.Count>0)
    {
        runSequence[0].stop();
    }
    //对于为执行的动作,直接回收对象并清空该队列
    for(int i = 0;i<waitSequence.Count;i++)
    {
        UFOFactory.getInstance().free(waitSequence[i].gameobject);
    }
    waitSequence.Clear();
}

public void FlyUFO(List<GameObject> waitToFly,Ruler ruler,int round){

    SSAction action;
    float waitTime = 0;
    for(int i = 0;i < waitToFly.Count;i++){
        Debug.Log("Flying");
        action = CCMoveToAction.GetSSAction(waitToFly[i],ruler.getDes(waitToFly[i].transform.position),ruler.getSpeed(round)*AnimateSpeed,this);
        if( i == 0 ){
            addAction(action);         
        }else{
            //通过协程间隔时间发送多个UFO
            addWaitAction(action);
            StartCoroutine(setNextFly(waitTime,action));
        }
        waitTime += ruler.getIntervals(round);

    }
}

回调函数
相比于上一个动作控制器,这里少了一个sequenceAction作为过渡处理每一个单独action,所以只需要将sequenceAction的回调函数添加到这里即可

public void SSActionEvent(SSAction source,
        SSActionEventType events = SSActionEventType.Competeted,
        int intParam = 0,
        string strParam = null){
    //处理是否点击和分数
    UFO ufo = source.gameobject.GetComponent<UFO>();
    if(!ufo.isClicked){
        Judge.getInstance().subScore(ufo.score);
    }
    //回收UFO
    UFOFactory.getInstance().free(source.gameobject);
    runSequence.Remove(source);
    //告诉游戏场景控制器需要进入下一Trial
    if(runSequence.Count<=0)
    {
        if(this.callback!=null)
            this.callback.SSActionEvent(source);
    }
}

实际操作

hit-UFO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值