【学习笔记】MVC设计思想学习
本文最后更新于 997 天前,其中的信息可能已经有所发展或是发生改变。

缘由

这些天学习游戏制作,在知乎上看到了一篇关于游戏设计框架的回答,简述了游戏设计面向数据编程可以遵循的三个设计框架:MVC,MVP,MVVM。这篇文章就简单聊聊MVC设计思想的实现过程。

使用Unity开发游戏,有流行的框架嘛? – 放牛的星星的回答 – 知乎

https://www.zhihu.com/question/37475609/answer/1298931250

MVC模式简介

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) – 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) – 视图代表模型包含的数据的可视化。
  • Controller(控制器) – 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
MVC图解

图源和简介摘自菜鸟教程

MVC 模式 | 菜鸟教程 (runoob.com)

引申

之前学习JavaWeb项目了解到了SpringMVC框架的编程方式,所以MVC设计模式便更加清晰:

从视图发过来的请求会经控制器进行中转和逻辑处理,并更新模型层数据,将处理后的结果返回给视图。模型层还可以自行通知控制器更新视图层。

那么,游戏中的MVC模式应该是什么样的呢?

首先,我们将MVC三个部分具象化成易于理解的名词:

  • Model:游戏数据
  • View:游戏UI
  • Controller:游戏逻辑

由此我们可以看出,游戏必不可少的部分是M和C两个部分,在MVC设计模式下,View的实现可以被分离,这对于网络游戏的实现方式是十分有利的,因为在非帧同步游戏中,我们可以通过类似Web请求的方式与服务器进行通信,将客户端与服务端分离,将游戏展现与游戏逻辑解耦,这样就大大降低了开发难度和维护成本。下面我们就来讨论一下具体的实现过程。

MVC实现

我们编写的游戏基于Unity3D引擎,因此我们就以C#作为实现语言:

Model层

抽象层

namespace ConsoleApp1.MVC
{
    public interface IModel
    {
        
    }
}

实现层

using System.IO;
using ConsoleApp1.MVC;
namespace ConsoleApp1.Unit
{
    public class UnitModel : IController
    {
        internal string _name;
        internal int _hp;
        internal int _damage;
        public UnitModel(string name, int hp, int damage)
        {
            this._name = name;
            _hp = hp;
            _damage = damage;
        }
    }
}

View层

抽象层

namespace ConsoleApp1.MVC
{
    public interface IView
    {
        
    }
}

实现层

using System;
using ConsoleApp1.MVC;
namespace ConsoleApp1.Unit
{
    public class UnitView : IView
    {
        public void BroadCast_Attacked(string name, int hp)
        {
            Console.WriteLine("{0}被攻击了!受到{1}点伤害!", name, hp);
        }
        public void BroadCast_Attacking(string name)
        {
            Console.WriteLine("{0}发起了攻击。", name);
        }
        public void BroadCast_Born(string name)
        {
            Console.WriteLine("{0}出生了!", name);
        }
        public void BroadCast_Dead(string name)
        {
            Console.WriteLine("{0}死亡!", name);
        }
    }
}

Controller层

抽象层

namespace ConsoleApp1.MVC
{
    public interface IController
    {
        
    }
}

实现层

using System.Text.Json;
using ConsoleApp1.MVC;
namespace ConsoleApp1.Unit
{
    public class UnitController : IController
    {
        //Model层
        private UnitModel _model;
        //View层
        private UnitView _view;
        //成员初始化
        public UnitController(UnitModel model, UnitView view)
        {
            _model = model;
            _view = view;
            _view.BroadCast_Born(_model._name);
        }
        //攻击逻辑
        public void Attack(UnitController target)
        {
            _view.BroadCast_Attacking(_model._name);
            _view.BroadCast_Attacked(target._model._name, _model._damage);
            if (_model._damage >= target._model._hp)
            {
                target._view.BroadCast_Dead(target._model._name);
                return;
            }
            target.CostHP(_model._damage);
        }
        //扣血
        public void CostHP(int hp)
        {
            _model._hp -= hp;
        }
    }
}

游戏过程层

using System;
using ConsoleApp1.Unit;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //单位1初始化
            UnitView unitView1 = new UnitView();
            UnitModel unitModel1 = new UnitModel("骑士", 3, 2);
            UnitController unitController1 = new UnitController(unitModel1, unitView1);
            //单位2初始化
            UnitView unitView2 = new UnitView();
            UnitModel unitModel2 = new UnitModel("弓箭手", 3, 1);
            UnitController unitController2 = new UnitController(unitModel2, unitView2);
            //游戏过程
            unitController1.Attack(unitController2);
            unitController2.Attack(unitController1);
            unitController1.Attack(unitController2);
        }
    }
}

由此,我们就可以编写出一个视图与逻辑分离的小游戏啦~

以上是个人学习笔记,若有错误敬请留言指正~

转载请注明出处!本文链接: https://battlehawk233.cn/post/225.html



暂无评论

发送评论编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇