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);
        }
    }
  • 相关阅读:
    html和js的编码格式
    如何通过webStorm快速恢复误删除的工程
    模板使用的一个坑
    一个字符串处理的小算法题
    工信部,映射,映射端口,热备,磁盘,虚拟磁盘,冗余,磁盘阵列技术,廉价冗余磁盘阵列 ,RAID 0,RAID1 ,RAID 3,RAID 5,RAID 6 名词解释
    项目管理,REID,矩阵,终端,镜像,Voip,AVB,串口,串口服务器,数据库,数据仓库,码流,心跳包,名词解释
    TCP协议,UDP协议,Utp,双绞线,DHCP协议,子网掩码,LAN,VLAN,网口,服务器,UI设计,Linux系统,Unix系统,名词解释
    IOS,ISO,OSI,交换机,路由器,MAC地址,网卡,网关,DNS,DNS服务器,名词解释
    中控,I/O端口,继电器,红外接口,编码器,解码器,主机,名词解释
    产品需求的讨论收集,整理描述,反馈实现,实施与验收使用,步骤方法与心得
  • 原文地址:https://www.cnblogs.com/yifengs/p/14294015.html
Copyright © 2011-2022 走看看