zoukankan      html  css  js  c++  java
  • 第46天MVC、委托和事件

    MVC思想

    应用于Web开发的一种设计思想,几种设计模式的组合使用

    Model:数据模型

    View:视图

    Controller:控制器

    View

    视图,UI或者场景中的表现给玩家的都是视图

    位于最顶层

    作用

    1、将数据模型Model中的数据以最直观的方式展现给玩家

    2、界面的效果等逻辑

    3、允许用户交互(操作),将用户的操作或交互以事件的方式发送给控制器

    权限

    对于数据模型Model只有访问的权限,没有修改的权限

    Controller

    控制器,核心的逻辑都在控制器上

    作用

    1、响应用户的操作,判断用户操作是否符合条件

    2、根据逻辑对Model中的数据进行修改

    3、回调View中的方法通知用户操作是否完成或失败

    权限

    对于Model有访问和修改的权限

    Model

    数据模型

    是数据中心,存储数据的地方,位于最低层

    作用

    1、存储相关的数据

    2、提供修改数据的方法

    3、当数据发生改变时,以事件的方式通知响应的视图更新界面

    优点

    1、结构更加清晰,有利于团队开发

    2、提高了代码的可读性和复用性

    委托与事件

    委托是什么?

    一种自定义的类型

    通过委托类型定义的变量可以存储于委托类型返回值相同,参数相同的一个或多个方法的引用

    使用委托的步骤

    1、定义委托类型

    2、通过委托类型定义委托变量

    3、将方法添加到委托变量中

    4、调用委托变量

    事件是什么?

    特殊的委托变量,使用event关键字修饰的委托变量就是事件

    事件与委托变量的区别

    委托变量在当前变量所在的类或其他类中都可以进行赋值和调用操作

    事件在当前所在的类中可以赋值和调用,但是在其他类中只能赋值不能调用

    事件的优点

    更加安全

    委托的两种使用方式

    1、通过委托类型定义的委托变量能存储一组与委托类型返回值与参数相同的方法,当调用委托变量时,会执行委托变量中存储的所有的方法

    2、当委托类型作为方法的形式参数时,可以将一个方法传递到另一个方法中去,传递进来的方法也叫回调函数

    事件步骤

    Model层

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerAssetModel : Single<PlayerAssetModel> {
    
        int gold;
        int diamond;
    
        //观察者模式第一步,定义委托类型
        public delegate void UpdateView(int gold, int diamond);
    
        //观察者模式第二步,定义事件  第三步添加事件 在GameView里
        public event UpdateView UpdateAsset;
    
        public PlayerAssetModel()
        {
            gold = 500;
            diamond = 999;
        }
        public int Gold
        {
            get
            {
                return gold;
            }
    
            set
            {
                value = Mathf.Clamp(value, 0, value);
                gold = value;
                //观察者模式第五步 值改变
                UpdateAsset(gold, diamond);
            }
        }
    
        public int Diamond
        {
            get
            {
                return diamond;
            }
    
            set
            {
                value = Mathf.Clamp(value, 0, value);
                diamond = value;
                //观察者模式第五步 值改变
                UpdateAsset(gold, diamond);
            }
        }
    }

    view层

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class GameView : MonoBehaviour {
        Text hpText;
        Text mpText;
        Text name;
        Image hpImg;
        Image mpImg;
    
        Text gold;
        Text diamond;
        Text tipText;
        float timer = 0;
    
        private void Awake()
        {
            hpText = transform.Find("PlayMeg/HP/NumberText").GetComponent<Text>();
            mpText = transform.Find("PlayMeg/MP/NumberText").GetComponent<Text>();
            name = transform.Find("PlayMeg/PlayerName").GetComponent<Text>();
            hpImg = transform.Find("PlayMeg/HP").GetComponent<Image>();
            mpImg = transform.Find("PlayMeg/MP").GetComponent<Image>();
            gold = transform.Find("Asset/Gold/NumText").GetComponent<Text>();
            diamond = transform.Find("Asset/Diamond/NumText").GetComponent<Text>();
            tipText = transform.Find("Tip").GetComponent<Text>();
            //观察者模式第四步 添加事件  第五步在PlayerAssetModel中gold和diamond值改变时发布
            PlayerAssetModel.Instance.UpdateAsset += UpdatePlayerData;
            PlayerInfoModel.Instance.UpdateInfo += UpdatePlayerInfo;
        }
    
        //观察者模式第三步, 方法
        void UpdatePlayerData(int goldNum,int diamodNum)
        {
            gold.text = goldNum.ToString();
            diamond.text = diamodNum.ToString();
        }
    
        void UpdatePlayerInfo(int hp,int mp)
        {
            hpText.text = hp + "/" + PlayerInfoModel.Instance.MaxHp;
            mpText.text = mp + "/" + PlayerInfoModel.Instance.MaxMp;
            hpImg.fillAmount = hp / (float)PlayerInfoModel.Instance.MaxHp;
            mpImg.fillAmount = mp / (float)PlayerInfoModel.Instance.MaxMp;
        }
    
    
        // Use this for initialization
        void Start () {
            ShowModel();
            tipText.text = "";
        }
        private void OnDestroy()
        {
            PlayerAssetModel.Instance.UpdateAsset -= UpdatePlayerData;
        }
    
        // Update is called once per frame
        void Update () {
            timer += Time.deltaTime;
            if(timer>=3)
            {
                tipText.text = "";
            }
        }
        void ShowModel()
        {
            name.text = PlayerInfoModel.Instance.name;
            hpText.text = PlayerInfoModel.Instance.Hp + "/" + PlayerInfoModel.Instance.MaxHp;
            mpText.text = PlayerInfoModel.Instance.Mp + "/" + PlayerInfoModel.Instance.MaxMp;
            hpImg.fillAmount = PlayerInfoModel.Instance.Hp / (float)PlayerInfoModel.Instance.MaxHp;
            mpImg.fillAmount = PlayerInfoModel.Instance.Mp / (float)PlayerInfoModel.Instance.MaxMp;
            gold.text = PlayerAssetModel.Instance.Gold.ToString();
            diamond.text = PlayerAssetModel.Instance.Diamond.ToString();
        }
        public void ShowTip(string tip)
        {
            tipText.text = tip;
    
            timer = 0;
        }
    }

    controller层

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class GameController : MonoBehaviour {
        GameView view;
        private void Awake()
        {
            view = GetComponent<GameView>();
            Button addGoldButton = transform.Find("Asset/Gold/AddNum").GetComponent<Button>();
            Button addDiamondButton = transform.Find("Asset/Diamond/AddNum").GetComponent<Button>();
            addGoldButton.onClick.AddListener(AddGold);
            addDiamondButton.onClick.AddListener(AddDiamond);
    
            Button skill1Button= transform.Find("Skills/Skill1").GetComponent<Button>();
            Button skill2Button= transform.Find("Skills/Skill2").GetComponent<Button>();
            Button skill3Button= transform.Find("Skills/Skill3").GetComponent<Button>();
            skill1Button.onClick.AddListener(() =>
            {
                Skill(1);
            });
            skill2Button.onClick.AddListener(() => {
                Skill(2);
            });
            skill3Button.onClick.AddListener(() => {
                Skill(3);
            });
    
        }
        // Use this for initialization
        void Start () {
            
        }
        
        // Update is called once per frame
        void Update () {
            
        }
        void Skill(int num)
        {
            switch (num)
            {
                case 1:
                    if(PlayerInfoModel.Instance.Mp>=100)
                    {
                        PlayerInfoModel.Instance.Mp -= 100;             //消耗蓝
                    }else
                    {
                        view.ShowTip("空蓝你放个鸟啊");
                    }
                    break;
                case 2:
                    PlayerInfoModel.Instance.Hp -= (int)(PlayerInfoModel.Instance.Hp * 0.1f);           //自残
                    break;
                case 3:
                    if(PlayerInfoModel.Instance.Mp>=200)
                    {
                        PlayerInfoModel.Instance.Mp -= 200;                 //消耗蓝
                        PlayerInfoModel.Instance.Hp += (int)(PlayerInfoModel.Instance.MaxHp*0.5f);
                    }
                    else
                    {
                        view.ShowTip("空蓝你放个鸟啊");
                    }
                    break;
            }
        }
    
        void AddGold()
        {
            if(PlayerAssetModel.Instance.Diamond<1000)
            {
                view.ShowTip("您的余额已不足,请尽快充值");
            }else
            {
                PlayerAssetModel.Instance.Diamond -= 1000;
                PlayerAssetModel.Instance.Gold += 100000;
            }
        }
        void AddDiamond()
        {
            PlayerAssetModel.Instance.Diamond += 100;
            Debug.Log(PlayerAssetModel.Instance.Diamond);
        }
    }
  • 相关阅读:
    May 24th 2017 Week 21th Wednesday
    May 23rd 2017 Week 21st Tuesday
    全球顶尖大学的UX课程资源,英文!
    如何设计出一款出色的结账表单
    快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力
    界面设计中如何增强CTA按钮召唤力?
    10个实用的UX设计作品推销小窍门
    UX术语详解:任务流,用户流,流程图以及其它全新术语
    让你不再恋家的9款小众时尚的酒店网站设计
    聊聊原型设计中的团队管理功能
  • 原文地址:https://www.cnblogs.com/yifengs/p/14294015.html
Copyright © 2011-2022 走看看