毕业设计MVC框架设计

该文章展示了一个基于Unity的MVC框架设计,包括ViewBase抽象类定义视图,处理事件;ModelBase抽象类表示模型,存储数据如PlayerModel;AttackController控制器响应攻击事件,影响模型数据;MVC类作为框架接口,管理视图、模型和控制器的注册及事件分发。MainPanelView视图类监听并响应界面事件,如显示经验值变化。
摘要由CSDN通过智能技术生成

1、解析MVC框架

//视图类
//1、每个从ViewBase继承的类都必须提供一个名字
//2、每个从ViewBase继承的类都必须注册自己关心的事件
//3、每个从ViewBase继承的类都需要处理自己关心的事件
public abstract class ViewBase : MonoBehaviour//视图类才会继承MonoBehavior
{
    public IList<string> interestedEvents;//事件列表
    public abstract string Name { get; }//名字

    public abstract IList<string> GetInterestedEvents();//用字符串代替事件

    public abstract void HandleEvents(string eventName, object eventParam);//处理程序
 
}
public class PlayerModel : ModelBase

{
    public override string Name
    {
        get { return "PlayerModel"; }
         
    }
    public int Exp { get; set; }

    internal void AddExp(int delta)
    {
        Exp += delta;

        MVC.instance.SendEvent("ExpChanged",Exp);
    }
}
public class GameManager : MonoBehaviour
{

    void Start()
    {
        MVC.instance.RegisterView(GameObject.Find("MainPanel").GetComponent<MainPanelView>());//注册视图层
        MVC.instance.RegisterController("AttackEvent", typeof(AttackController));//注册控制层
        MVC.instance.RegisterModel(new PlayerModel());//注册模型层
    }


}

public class MainPanelView : ViewBase
{
    public Text EXPText;
    public Button AttackButton;

    public void OnAttackButtonClicked()
    {
        //通过界面上玩家点击的目标获取目标角色的id
        //获取界面上用户点击哪个攻击按钮,进而获取按钮对应的攻击技能id
        int targetId = 12345;
        int skilled = 6789;

        MVC.instance.SendEvent("AttackEvent",new object[] {targetId,skilled });
    }

    void Start()
    {
        AttackButton.onClick.AddListener(OnAttackButtonClicked);//AddListener增加监听器=使用OnAttackButtonClicked来执行这个Button
    }



    public override string Name
    {
        get { return "MainPanelView"; }
    }

    public override IList<string> GetInterestedEvents()
    {
        return new string[] {
       "ExpChanged"
       };
    }

    public override void HandleEvents(string eventName, object eventParam)
    {
        switch (eventName)
        {
            case "ExpChanged":
                {
                    EXPText.text = eventParam.ToString();
                }
                break;
        }
    }
}

public class AttackController : ControllerBase
{
    public override void Execute(object param)
    {
       ModelBase mb= MVC.instance.models["PlayerModel"];
        PlayerModel pm = mb as PlayerModel;

        //TODO:取得敌人的模型,计算玩家对敌人造成的伤害作为增加经验值的系数
        pm.AddExp(50);
    }
}

/// <summary>
/// 此类作为MVC框架对外的接口,此类作为一个单例类,主要负责:注册和存储MVC实例、获取MVC实例、发送事件
/// </summary>
public class MVC //外部类
{
    public static MVC instance = new MVC();
    private MVC() { }

    //用字典存储MVC
  public  Dictionary<string, ViewBase> views = new Dictionary<string, ViewBase>();
   public Dictionary<string, ModelBase> models = new Dictionary<string, ModelBase>();
   public Dictionary<string, Type> ctrls = new Dictionary<string, Type>();//命令没有实体
  
  /// <summary>
  /// 注册模型
  /// bm=new BagModel();
  /// MVC.instance.RegisterModel(bm);
  /// </summary>
  /// <param name="model"></param>

    public void RegisterModel(ModelBase model)
    {
        if (models.ContainsKey(model.Name) == true)//ContainsKey-判断在字典中某一个键是否已经存在了
        {
            return;
        }
        models[model.Name] = model;
    }
    /// <summary>
    /// 注册控制器
    /// MVC.instance.RegisterController(typeof(AttackController))
    /// ctrl=Activator.Create(typeof(AttackController))
    /// ctrl.Execute(...);
    /// </summary>
    /// <param name="ctrlType"></param>

    public void RegisterController(string name, Type ctrlType)
    {
        if (ctrls.ContainsKey(name) == true)
        {
            return;
        }
        ctrls[name] = ctrlType;
    }
    //注册视图

    public void RegisterView(ViewBase view)
    {
        if (views.ContainsKey(view.Name) == true)
        {
            return;
        }
        views[view.Name] = view;
        //view.interestedEvents = new List<string>(view.GetInterestedEvents());
        view.interestedEvents = view.GetInterestedEvents();//IList
    }


    //发送事件(控制器先响应,视图再响应)
    //事件对应的处理者有两种:控制器(View=>controller);View(Model=>View)
    public void SendEvent(string eventName, object eventParam)
    {
        if (ctrls.ContainsKey(eventName))
        {
            Type ctrlType = ctrls[eventName];
            var cb = Activator.CreateInstance(ctrlType) as ControllerBase;
            cb.Execute(eventName);
            return;
        }
        foreach (var view in views)
        {
            if (view.Value.interestedEvents.Contains(eventName))
            {
                view.Value.HandleEvents(eventName, eventParam);
               
            }
        }
    }


   
}

/// <summary>
/// 执行命令(一段功能代码)
/// </summary>
public abstract class ControllerBase 
{
    public abstract void Execute(object param);//Execute-执行
}


/// <summary>
/// 数据模型,每个模型都必须有一个名称
/// </summary>
public abstract class ModelBase 
{
    public abstract string Name { get; }
}

毕设思路
1、游戏按照MVC模式分成三个部分
Model——存储数据
View——控制视图
Controller——控制整个游戏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值