当前位置: 首页 > news >正文

【Godot4.4】浅尝Godot中的MVC

概述

基于一个Unity的视频。学习了一下基本的MVC概念,并尝试在Godot中实现了一下。

原始的MVC:

原始的MVC
Godot中的MVC:
Godot中的MVC,特点是独特的信号系统和节点系统​​​​​​

Model、View和Controller各自应该实现的功能如下:

Model:

  • 属性(数据字段)
  • 数据存取方法
  • 数据更新信号

View:

  • 控件节点引用
  • UI更新方法ui_update()

Controller:

  • 界面元素信号处理,比如按钮点击等
  • 调用View的界面更新方法

在Godot中实现:

Controller  //UI界面根节点,空的Control节点
    Model   //空的Control节点
    View    //容器或Control节点
        其他界面元素

MainView中:

  • 进行元素的引用
  • 编写ui_update()方法,参数dataMainModel类型

MainController中:

  • 进行元素的引用
  • 放置所有元素的信号处理函数
  • 放置MainModel的数据更新信号处理函数data_updated()

MainModel中:

  • 定义所需保存的数据字段
  • 定义数据的加载、更新以及保存方法
  • 定义data_updated()信号

实际测试

MVC测试场景

通常是一个界面分别对应一个Model、View和Controller。

为了方便管理,建立名为Model、View和Controller的文件夹。

文件构成

MainView

View只负责节点引用和实现一个界面更新方法:

# MainView
extends Control

# UI节点引用
@onready var text_edit: TextEdit = %TextEdit

# 界面更新方法
func ui_update(text:String):
	text_edit.text = text

MainModel

Model

  • 设计需要存储的数据字段
  • 数据存取方法
  • 定义数据更新信号
# MainModel
extends Control

signal data_updated(text:String) # 数据更新信号

# 保存路径
var path:String = ""

# 数据字段
var text:String = ""


# 保存数据
func save_data():
	var file = FileAccess.open(path,FileAccess.WRITE)
	file.store_string(text)
	file.close()

# 加载数据
func load_data():
	if FileAccess.file_exists(path):
		text = FileAccess.get_file_as_string(path)
	emit_signal("data_updated",text)  # 触发数据更新信号

MainController

Controller

  • 将View的所有界面元素信号处理链接到Controller
  • 将Model的数据更新信号处理链接到Controller
  • 其他处理逻辑
# MainController
extends Control

@onready var main_view: Control = %MainView
@onready var main_model: Control = %MainModel
@onready var text_edit: TextEdit = %TextEdit


func _ready() -> void:
	main_model.path = "data/mian.txt"
	main_model.load_data()

# =============== 所有界面元素的信号处理  ===============
func _on_button_pressed() -> void:
	main_model.text = text_edit.text
	main_model.save_data()

# MainModel的数据更新信号
func _on_main_model_data_updated(text: String) -> void:
	main_view.ui_update(text)

总结

这只是一种粗略的实现和实践。将界面和处理逻辑分开是我之前在实践的事情,可以很好的减少UI场景中的代码。并且让逻辑可以以类的形式存在和复用。

MVC是一种更高层次的设计,将处理逻辑分为逻辑和数据两部分,并巧妙的通过信号和方法调用,完成了“UI交互-逻辑处理-数据存储”和“反向更新UI”的功能。

对MVC的认识和实践有自己的业余性,期望大佬指正错误。

相关文章:

  • 蓝桥杯—走迷宫(BFS算法)
  • QT | 信号与槽(超详解)
  • 控制系统分类
  • AI赋能Python零代码编程知识技能体系构架
  • 【从零开始学习计算机科学】计算机组成原理(八)输入输出设备 与 输入输出系统
  • 初学者快速入门Python爬虫 (无废话版)
  • springboot的实体类字段校验的分组校验
  • 知识图谱相关的FOAF是个啥?
  • ②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网
  • BLUEM2引擎源码2025最新版
  • 14款粗糙边缘颗粒喷墨线条素材绘画效果Affinity笔刷画笔 Rough Raw Affinity Brushes
  • Linux搜索---locate
  • DeepSeek市场份额攀至9.6%,探索生成式AI的行业变革之路
  • 基于OpenCV的车牌识别系统(源码+论文+部署教程)
  • python fire 库与 sys.argv 处理命令行参数
  • 【前缀和与差分 C/C++】洛谷 P8218 求区间和
  • MR 3. 多组学与孟德尔随机化分析揭示动脉粥样硬化性心血管疾病的潜在治疗靶点...
  • 相机几何:从三维世界到二维图像的映射
  • AVL树
  • 【C++】6.1.1 局部对象
  • 建筑材料网站建设/菏泽资深seo报价