Dream Mod 3.0Dream Mod 3.0
首页
快速开始
资源库
首页
快速开始
资源库
  • 进度

    • 更新日志
  • 指南

    • 快速上手
    • App.lua
    • Server.lua
    • 地图
    • 角色
    • 道具
    • 技能
    • 状态
    • 窗口
    • 成长
    • DmTcpClient
    • WebSocketClient
    • SqliteDB
    • 皮肤
    • 自定义组件
  • Api

    • 引擎
    • 地图
    • 角色
    • 道具
    • 技能
    • 状态
    • 窗口
    • 自定义组件
    • 音乐
    • 缓动
    • 全局
  • 控件

    • 标签
    • 按钮
    • 图片框
    • 动画框
    • 文本框
    • 进度条
    • 技能格子
    • 快捷格子
    • 包裹格子
    • 道具格子
    • 角色框
    • 选择框
    • 选择夹
    • 容器
    • 地图框
    • 滑块条
    • 滚动条
    • 组合框
    • 输入框
    • 列表框
  • 组件

    • 文本
    • 艺术字
    • 精灵
    • 矩形
    • 圆形
    • 动画
  • 其他

    • 丰富文本
    • 模板变量
    • 游戏盒子

App.lua

介绍

App.lua是每个项目的入口文件,游戏的启动配置项在这里填写。

配置项

名称类型必填说明
游戏标题 文本falsewindows窗口标题
屏幕宽度 整数false屏幕宽度
屏幕高度 整数false屏幕高度
背景颜色 RGBAfalse默认:0, 屏幕适配模式[3]时作为透明关键色
屏幕适配 整数false
重复按键 逻辑false当键盘按键被按住时,是否允许连续收到按下事件。默认:false
资源表 tablefalse{ {标识="",文件=""}, {标识="",文件=""}, }
默认字体 tabletrue
信息框 tablefalse
技能气泡 tablefalse
道具气泡 tablefalse
状态气泡 tablefalse
掉落物 tablefalse
状态图标 tablefalse
控件皮肤 tablefalse
扩展属性 tablefalse
扩展组件 table {}false
扩展脚本 table {}false
装备套装 table {}false
菜单 table {}false
系统事件 tablefalse

屏幕适配

  • 0:无适配
  • 1:窗口可以拉伸 画面缩放
  • 2:窗口可以拉伸 画面同步屏幕宽高
  • 3:无边框透明窗口 通过背景颜色设置透明关键色 例如:背景颜色 = RGBA(0,32,0,255)

基础属性

  • 引擎内置了9个基础属性:hp mp maxhp maxmp 命中 躲避 暴击 移动速度 攻击速度
  • 命中:命中几率 = 攻击者命中 / (攻击者命中 + 被攻击者躲避) * 100
  • 暴击:暴击判定 = 取随机数(1,100) <= 攻击者暴击 触发暴击后产生 1.5倍伤害。
  • 移动速度:百分比属性 正值表示加速,负值表示减速。设置-10 即表示攻击速度-10%
  • 攻击速度:百分比属性 正值表示加速,负值表示减速。设置50 即表示移动速度+50%

扩展属性

  • 除基础属性之外你可以自己扩展需要的属性,扩展属性只能为数值型。
扩展属性 = {攻击=0,防御=0}, -- 游戏中有了 攻击,防御

提示

扩展属性会自动应用于整个游戏系统,道具,角色,技能 等等各种组件中都自动扩展拥有了这些属性。

扩展组件

  • DM3是一个组件化的引擎,通过即插即用的各种组件积木式产生游戏。
  • 目前的组件种类有 角色 地图 道具 技能 状态 窗口 ...
  • 组件是一个个配置项文件,后缀名为.lua,需要保存到工程目录下,然后加入到扩展组件。
扩展组件 = {
    "UI/底部UI.lua",
    "UI/角色窗口.lua",
    "DB/Npc/主角.lua",
    "DB/Npc/稻草人.lua",
    "DB/Map/泡点图.lua",
    "DB/Item/八荒刀.lua",
    ...
    ...
},

提示

阅读文档,编写各种类型的组件。

状态图标

名称类型说明
x整数状态图标在屏幕上的起始坐标x
y整数状态图标在屏幕上的起始坐标y
宽度整数状态图标的显示宽度
高度整数状态图标的显示高度
列数整数一行显示多少个图标,超过后换行显示
间距整数状态图标之间的间距
行距整数状态图标每行之间的行距
左对齐逻辑从左到右还是从右到左顺序显示
字体逻辑状态图标标题字体
置顶逻辑状态图标显示是否在屏幕最顶层

装备套装

  • 一个套装配置数组,部件中道具对象可以在属性中可以取出[套装]属性。
名称类型说明
名称文本套装的唯一名称
部件table {}道具名称数组
效果table {}数组索引对应激活几个部件的效果
装备套装 = {
  {
    名称 = "全村的希望",
    部件 = {"黄金手镯","黄金戒指","黄金项链"},
    效果 = {
      {},	-- 1件
      {{"maxhp",20},{"maxmp",20}},	-- 2件
      {{"移动速度",20},{"攻击速度",20}}	-- 3件
    }
  },
  {
    名称 = "圣战套",
    ...
    ..
  }
},

菜单

  • 配合引擎中的弹出菜单方法,引擎中的菜单属性使用。
  • 菜单点击事件会触发到系统事件🔹菜单中。
  • 菜单永远在屏幕最顶层显示。
名称类型说明
名称文本菜单项的唯一名称
-: 画一条分割线
标题文本屏幕显示的内容
可视逻辑
选中逻辑
禁用逻辑
子菜单table允许嵌套
菜单 = {
  物件菜单 = {
    {名称="复制",标题="复制",可视=true,选中=false,禁用=false},
    {名称="网格对齐",标题="网格对齐",可视=true,选中=false,禁用=false},
    {名称="保存配置",标题="保存配置",可视=true,选中=false,禁用=false},
    {名称="测试子菜单",标题="测试子菜单",可视=true,选中=false,禁用=false,
      子菜单 = {
        {名称="子菜单1",标题="子菜单1",可视=true,选中=false,禁用=false},
        {名称="子菜单2",标题="子菜单2",可视=true,选中=false,禁用=false},
        {名称="子菜单3",标题="子菜单3",可视=true,选中=false,禁用=false,
          子菜单 = {
            {名称="平铺地面",标题="平铺地面",可视=true,选中=false,禁用=false},
          }
        },
        {名称="子菜单4",标题="子菜单4",可视=true,选中=false,禁用=false},
        {名称="子菜单5",标题="子菜单5",可视=true,选中=false,禁用=false},
      }
    }, 
    {名称="删除",标题="删除",可视=true,选中=false,禁用=false},
  },
  地表菜单 = {
    {名称="平铺地面",标题="平铺地面",可视=true,选中=false,禁用=false},
  },

},

扩展脚本

  • 自定义的Lua脚本,没有格式要求。DM3使用Lua5.4,没有特殊限制,你可以用来封装自己的系统或者常用的公共函数。
  • 扩展脚本会在游戏组件初始化之前载入执行。依次执行完成后触发 系统事件 🔹 启动
扩展脚本 = {
    "DB/系统.lua",
    ...
    ...
},

系统事件

🔹 启动

  • 游戏启动后,系统载入所有扩展脚本后最先触发的回调。 通常用于游戏开始前的各种准备
  • 通过 -g -c 启动游戏可以传递命令行参数,参数间按空格分隔。
  • 返回 false 可以立即结束程序。

示例

系统事件 = {
  启动 = function(arg)	
    Log(arg)
  end,
}

🔹 游戏开始

游戏组件载入完成后激活此事件。

🔹 游戏关闭

点击游戏屏幕关闭按钮时,触发此事件。返回 false 可以拦截

示例

系统事件 = {
  游戏关闭 = function()	
    local 结果 = 引擎.信息框("#z(240,0,1)\n#md你确定要退出吗?",1)
    return 结果
  end,
}

🔹 焦点变化

游戏窗口焦点变化时触发

回调参数类型说明描述
屏幕焦点 逻辑 获得焦点:true 丢失焦点:false

示例

系统事件 = {
  焦点变化 = function (屏幕焦点)
    调试输出(屏幕焦点)
  end,
}

🔹 状态变化

游戏窗口状态变化时触发

回调参数类型说明描述
状态 整数1 最小化2 最大化3 还原4 老板键隐藏

示例

系统事件 = {
  状态变化 = function (状态)
    调试输出(状态)
  end,
}

🔹 宽高变化

屏幕适配 = 2时,游戏窗口宽高改变时触发

回调参数类型说明描述
宽度 整数
高度 整数

示例

系统事件 = {
		宽高变化 = function (宽度,高度)
			local 底部UI = 引擎.窗口.底部UI
			底部UI.x = (宽度 - 底部UI.宽度) * 0.5 // 1
			底部UI.y = 高度 - 底部UI.高度
		end,
}

🔹 键盘按下

按键按下触发

回调参数类型说明描述
按键信息 table
成员类型说明
code 整数键值
alt 逻辑alt键状态
shift 逻辑shift键状态
control 逻辑ctrl键状态

示例

系统事件 = {
    键盘按下 = function (按键信息)
        调试输出(按键信息)
    end,
}

🔹 键盘弹起

按键弹起时触发

回调参数类型说明描述
按键信息 table
成员类型说明
code 整数键值
alt 逻辑alt键状态
shift 逻辑shift键状态
control 逻辑ctrl键状态

示例

系统事件 = {
    键盘弹起 = function (按键信息)
        调试输出(按键信息)
    end,
}

🔹 菜单

菜单关闭和点击事件会触发到此处。

回调参数类型说明描述
菜单名称 文本菜单名称
项目 table/nil 子菜单对象 nil:菜单关闭
附加 通用弹出菜单中传递的附加信息

示例

系统事件 = {
	菜单 = function(菜单名称,项目,附加) 
		调试输出(菜单名称,项目)
		if (项目 == nil) then
			调试输出("菜单关闭")
			return 
		end
		if (菜单名称 == "物件菜单") then
			if (项目.名称 == "网格对齐") then
				项目.选中 = not 项目.选中
			end
		end
	end,
}

🔹 超链接

丰富文本的超链接事件会统一回调到此处。

回调参数类型说明描述
事件 文本 热点 点击
链接 文本 / table {} #@中的 触发标识
x 数值 链接屏幕坐标x
y 数值 链接屏幕坐标y
文本框对象 文本框 这个事件从哪里来

示例

系统事件 = {
    超链接 = function (事件,链接,x,y,文本框)	
        if (事件 == "点击") then
            调试输出(链接)
        end
    end,
}

🔹 道具气泡提示

道具气泡弹出时触发,通常用户动态修改气泡内容

回调参数类型说明描述
道具对象 道具对象
格子对象 格子对象 道具所在的格子组件
装备对比 逻辑 是否有装备对比行为

示例

系统事件 = {
  道具气泡提示 = function (道具对象,格子对象,装备对比)
		local 主角对象 = 引擎.地图.主角

		local 需要等级 = 道具对象.等级
		local 等级颜色 = "#W"
		if (需要等级 > 主角对象.等级 ) then
			等级颜色 = "#R"
		end
		
		local 富文本 = "#z(140,0,1)\n#z(2,-12)#f(宋体14粗)#c(".. 道具对象.颜色 ..")".. 道具对象.显示名
		if (装备对比) then
			-- 显示一个已装备图标
			富文本 = 富文本 .. "\n#p(已装备图标,98,-16)\n#z(0,-8)"
		else 
			富文本 = 富文本 .. "#z(0,10,1)\n"
		end

		富文本 = 富文本 .. "#p(默认皮肤|格子底图)#p(".. 道具对象.图标 ..",-44,0,42,42)#f(宋体12)#W#z(4,-42)\n"
		富文本 = 富文本 .. "类型:" .. 道具对象.子类 .. "\n" .. 等级颜色 .. "等级:" .. 需要等级 .. "\n#W限制:无\n#z(0,0)"

		if (道具对象.分类 == "装备") then
				

			local 附加属性 = 道具对象.附加

			if(道具对象.攻击 > 0 ) then
				富文本 = 富文本 .. "\n".. (附加属性.攻击 > 0 and "#c(0x66CC00FF)" or "#W") .. "攻击 " .. 道具对象.攻击 
			end

			if(道具对象.防御 > 0) then
				富文本 = 富文本 .. "\n".. (附加属性.防御 > 0 and "#c(0x66CC00FF)" or "#W") .. "防御 " .. 道具对象.防御
			end

			if(道具对象.maxhp > 0) then
				富文本 = 富文本 .. "\n".. (附加属性.maxhp > 0 and "#c(0x66CC00FF)" or "#W") .. "生命 " .. 道具对象.maxhp 
			end

			if(道具对象.maxmp > 0) then
				富文本 = 富文本 .. "\n".. (附加属性.maxmp > 0 and "#c(0x66CC00FF)" or "#W") .. "法力 " .. 道具对象.maxmp 
			end

			if(道具对象.攻击_百分比 > 0 ) then
				富文本 = 富文本 .. "\n".. (附加属性.攻击_百分比 > 0 and "#G" or "#W") .. "攻击 +" .. 道具对象.攻击_百分比   .. "%"
			end

			if(道具对象.防御_百分比 > 0 ) then
				富文本 = 富文本 .. "\n".. (附加属性.防御_百分比 > 0 and "#G" or "#W") .. "防御 +" .. 道具对象.防御_百分比  .. "%"
			end

			if(道具对象.maxhp_百分比 > 0) then
				富文本 = 富文本 .. "\n".. (附加属性.maxhp_百分比 > 0 and "#G" or "#W") .. "生命 +" .. 道具对象.maxhp_百分比  .. "%"
			end

			if(道具对象.maxmp_百分比 > 0) then
				富文本 = 富文本 .. "\n".. (附加属性.maxmp_百分比 > 0 and "#G" or "#W") .. "法力 +" .. 道具对象.maxmp_百分比  .. "%"
			end


			-- 有套装属性
			if(道具对象.套装) then

				local 套装名称 = 道具对象.套装.名称
				local 套装部件 = 道具对象.套装.部件
				local 套装效果 = 道具对象.套装.效果
				local 激活数量 = 道具对象.套装.激活数量
				local 部件数量 = #套装部件
				富文本 = 富文本 .. "\n\n#Y" .. 套装名称  .. " (" .. 激活数量 .. "/" .. 部件数量 .. ")"

				for n=1,#套装部件 do
					富文本 = 富文本 .. "\n".. (套装部件[n].数量 > 0 and "#c(255,200,0,255)" or "#H") .. 套装部件[n].名称
				end

				for n=1,#套装效果 do
					
					if(#套装效果[n] > 0) then

						富文本 = 富文本 .. "\n\n#z(0,0)" .. (激活数量 >= n and "#c(255,200,0,255)" or "#H")  .. "[" .. n .. "]:#z(4,-14)"

						for i=1,#套装效果[n] do
							local 属性名称 = 套装效果[n][i][1]
							local 属性值 = 套装效果[n][i][2]
							if (属性名称 == "maxhp") then
								属性名称 = "生命"
							elseif (属性名称 == "maxmp") then
								属性名称 = "法力"
							end
							富文本 = 富文本 .. "\n".. 属性名称 .. " +".. 属性值
						end
						
					end
				end

			end

		elseif (道具对象.分类 == "道具") then

			if (道具对象.子类 == "消耗") then
				if(道具对象.hp > 0 ) then
					富文本 = 富文本 .. "\n".. "#GHP + " .. 道具对象.hp 
				end
				if(道具对象.mp > 0 ) then
					富文本 = 富文本 .. "\n".. "#GMP + " .. 道具对象.mp 
				end
			end

		end

		富文本 = 富文本 .. "\n\n#z(0,0)#br(140)#H普普通通的".. 道具对象.显示名 .. "#z(0,2,1)"

		道具对象.气泡提示 = 富文本
  end,
}

🔹 技能气泡提示

技能气泡弹出时触发,通常用户动态修改气泡内容

回调参数类型说明描述
技能对象 技能对象
格子对象 格子对象 技能格子或是快捷格子

示例

系统事件 = {
  技能气泡提示 = function (技能对象,格子对象)

    if (格子对象.绑定角色 == -1) then
      if (格子对象.名称 == "雷电术技能") then
        技能对象.气泡提示 = "这是一个雷电术技能,你要掌握吗?"
      else 
        技能对象.气泡提示 = "你还不能使用这个技能"
      end
      return 
    end

    -- 只有已经添加的技能才有进度这个属性 通过判断进度可以区分是否是已经学习的技能
    if (技能对象.进度 == nil) then
      技能对象.气泡提示 = "#H#f(宋体14粗)".. 技能对象.显示名 .."\n#f(宋体12)\n未掌握"
      return
    end

    local 富文本 = "#G#f(宋体14粗)" .. 技能对象.显示名 .. "\n#W#f(宋体12)\nMP:" .. 技能对象.mp .. "\nCD:" .. math.round(技能对象.间隔 / 1000,1) .. "秒\n\n#W等级:" .. 技能对象.等级
    技能对象.气泡提示 = 富文本

  end,
}

🔹 系统提示

用于拦截捕获系统默认提示

回调参数类型说明描述
编号 整数1:使用技能时,技能冷却中
2:使用物品时,道具冷却中!
3:使用物品时,等级不足!
4:拾取物品时,包裹已满!
提示内容 文本默认内容

示例

系统事件 = {
  系统提示 = function (编号,提示内容)
    调试输出(编号,提示内容)
    return true -- 拦截
  end
}

🔹 自定义事件

是指通过Api 加入事件 创建的事件。

回调参数类型说明描述
事件附加 table 是指通过Api [加入事件]中传递进来的 附加信息
dt 数值 事件执行的实际间隔时间
time 数值 事件执行的总时间

示例

系统事件 = {

  游戏开始 = function()
    引擎.加入事件("系统时钟",{},1000,false)
  end,

  系统时钟 = function (tbl,dt,time)
    调试输出(dt,time)
  end,

}
Prev
快速上手
Next
Server.lua