饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二):一键制作
饥荒Mod 开发(十四):制作屏幕弹窗

一键传送源码
饥荒的地图很大,跑地图太耗费时间和饥饿值,如果大部分时间都在跑图真的是很无聊,所以需要有一个能够传送的功能,不仅可以快速到达还能节省饥饿值。
饥荒二本之后可以制作出木牌,我们可以在地图各个位置创建木牌,右键点击木牌就可以传送到其他的木牌

1 功能演示

1.1 创建木牌

需要先升级到一本,制作一个科学机器,这样就可以制作木牌了。
在这里插入图片描述

1.2 右键传送

将鼠标放到木牌上, 会显示 “传送”, 右键单击会显示一个传送面板
在这里插入图片描述

1.3 传送面板

这个面板会列出所有的木牌,可以修改木牌的名字, 也可以直接点击 “传送” 就可以不消耗饥饿值 瞬间移动到了目的地
在这里插入图片描述
接下来介绍如何实现 传送功能

2 实现鼠标悬浮显示 “传送”

要和饥荒中的物品“交互”,可以自定义一个Action,这样鼠标右键悬浮的时候会显示一个自定义的“操作提示”,右键单击的时候可以执行指定的操作。那如何自定义一个action?

2.1 创建action

在Mod 根目录下创建一个 travel.lua文件,这个文件用来定义action在这里插入图片描述

-- 创建一个新的动作(Action),这个动作可以通过右键触发,优先级为10
local TRAVEL = GLOBAL.Action({}, 10, false, true)
TRAVEL.id = "TRAVEL"  -- 设置动作的ID为"TRAVEL"
TRAVEL.str = "传送"  -- 设置动作的字符串表示为"传送"
TRAVEL.fn = function(act)  -- 设置动作的函数,这个函数定义了动作的行为
    local tar = act.target  -- 目标实体
    local traveller = act.doer  -- 执行动作的实体
    --traveller说一句话
    traveller.components.talker:Say("传送中...")
 	return true  -- 先全部返回true看看效果 动作成功
end

-- 将新的动作添加到游戏中
AddAction(TRAVEL)
-- 为"wilson"状态图添加新的动作处理器,当执行"TRAVEL"动作时,使用"give"动画
AddStategraphActionHandler("wilson", GLOBAL.ActionHandler(TRAVEL, "give"))

创建完这个action之后,我们把鼠标移动到物品上时,却没有任何的变化,我们还需要让具体的物品支持这个动作。

2.2 仅让木牌显示“传送”,自定义 “Travelable”组件

传送功能只能发生在木牌上,所以我们需要给“木牌”增加一个组件,让鼠标悬浮在木牌上的时候显示一个自定义的提示“传送”。在 scripts/components 目录下新建 travelable.lua
在这里插入图片描述

-- 定义 Travelable 类
local Travelable = Class(function(self, inst)
    -- 初始化实例
    self.inst = inst
    -- 设置名称
    self.name = "木牌"
end)

-- 定义收集场景动作的方法
function Travelable:CollectSceneActions(doer, actions, right)
    -- 如果是右键操作,则添加 TRAVEL 动作
    if right then
        table.insert(actions, ACTIONS.TRAVEL)
    end
end

-- 定义保存状态的方法
function Travelable:OnSave()
    -- 创建一个表来存储数据
    local data = {}
    -- 保存名称
    data.name = self.name
    -- 返回保存的数据
    return data
end   

-- 定义加载状态的方法
function Travelable:OnLoad(data)
    -- 如果有数据,则加载名称
    if data then
        self.name = data.name
    end
end

-- 定义执行旅行的方法
function Travelable:DoTravel(traveller)
    -- 如果没有旅行者,则返回
    if not traveller then
        return
    end
    -- 如果旅行者已经死亡,则返回
    if traveller.components.health and traveller.components.health:IsDead() then
        return
    end
    -- 获取当前实例的世界位置
    local x, y, z = self.inst.Transform:GetWorldPosition()
    -- 设置旅行者的位置
    traveller.Transform:SetPosition(x-1, y, z)
end

-- 返回 Travelable 类
return Travelable

2.3 木牌添加 自定义组件 “Travelable”

在modmain.lua 文件中导入 travel.lua,然后拦截 木牌的 构造,添加自定义组件,这样将鼠标移动到木牌上就会显示传送按钮了。

modimport("travel.lua")

AddPrefabPostInit("homesign", function(inst)
    inst:AddComponent("travelable")
end)

2.4 进入游戏测试是否显示 “传送”

打开调试控制台, 输入c_spawn(“homesign”)可以创建一个木牌,将鼠标悬浮到木牌上将会出现 “传送” 提示
在这里插入图片描述
右键点击之后会显示“传送中”
在这里插入图片描述

3 制作传送面板

在scripts 目录下创建 widgets 目录,然后创建travelitem.lua,travelscreen.lua
在这里插入图片描述

3.1 travelitem 实现

每个 travelitem 都表示一个 传送点

--  travelitem.lua
local UIAnim = require "widgets/uianim"
local Widget = require "widgets/widget"
local Text = require "widgets/text"
local TextEdit = require "widgets/textedit"
local Image = require "widgets/image"
local ImageButton = require "widgets/imagebutton"

local TravelItem = Class(Widget, function(self, homesign, isCurrent, traveller, screen)
    Widget._ctor(self, "TravelItem") -- 构造函数,创建一个名为"TravelItem"的小部件
    self.homesign = homesign -- 将homesign赋值给self.homesign
    self.traveller = traveller -- 将traveller赋值给self.traveller
    self.screen = screen -- 将screen赋值给self.screen
    --添加一个背景
    self.bg = self:AddChild(UIAnim()) -- 在self上添加一个UIAnim
    self.bg:GetAnimState():SetBuild("savetile") -- 设置UIAnim的Build为"savetile"
    self.bg:GetAnimState():SetBank("savetile") -- 设置UIAnim的Bank为"savetile"
    self.bg:GetAnimState():PlayAnimation("anim") -- 播放UIAnim的"anim"动画
    self.bg:SetScale(1, 0.8, 1) -- 设置UIAnim的缩放比例

    self.name = self.bg:AddChild(TextEdit(BODYTEXTFONT, 35)) -- 在bg上添加一个TextEdit
    self.name:SetVAlign(ANCHOR_MIDDLE) -- 设置TextEdit的垂直对齐方式为中间
    self.name:SetHAlign(ANCHOR_LEFT) -- 设置TextEdit的水平对齐方式为左边
    self.name:SetPosition(0, 10, 0) -- 设置TextEdit的位置
    self.name:SetRegionSize(300, 40) -- 设置TextEdit的区域大小

    self.name:SetString(homesign.components.travelable.name) -- 设置TextEdit的内容为homesign.components.travelable.name
    if isCurrent then -- 如果是当前的
        self.name:SetColour(0, 1, 0, 0.4) -- 设置TextEdit的颜色
    else
         --添加一个传送按钮
        self.go = self.bg:AddChild(ImageButton("images/ui.xml", "button_small.tex", "button_small_over.tex", "button_small_disabled.tex")) -- 在bg上添加一个ImageButton
        self.go:SetPosition(220, 0) -- 设置ImageButton的位置
        self.go:SetText("传送") -- 设置ImageButton的文本为"传送"
        self.go:SetFont(BUTTONFONT) -- 设置ImageButton的字体
        self.go:SetOnClick(function() -- 设置ImageButton的点击事件
            self:Go()
        end)
    end

    --添加一个编辑按钮
    self.button = self.bg:AddChild(ImageButton("images/ui.xml", "button_small.tex", "button_small_over.tex", "button_small_disabled.tex")) -- 在bg上添加一个ImageButton
    self.button:SetPosition(-220, 0) -- 设置ImageButton的位置
    self.button:SetText("编辑") -- 设置ImageButton的文本为"编辑"
    self.button:SetFont(BUTTONFONT) -- 设置ImageButton的字体
    self.button:SetOnClick(function() -- 设置ImageButton的点击事件
        self:Edit()
    end)
end)

function TravelItem:Edit() 
    local text = self.name:GetLineEditString() -- 获取name的文本内容
    --如果文本和原来的不一样
    if text ~= self.homesign.components.travelable.name then -- 如果文本内容和self.homesign.components.travelable.name不一样
        self.homesign.components.travelable.name = text -- 将self.homesign.components.travelable.name设置为新的文本内容
    end
end

function TravelItem:Go()
    self.homesign.components.travelable:DoTravel(self.traveller) -- 调用self.homesign.components.travelable的DoTravel方法,参数为self.traveller
    self.screen:OnCancel() -- 调用self.screen的OnCancel方法
end

return TravelItem

在这里插入图片描述

--   travelscreen.lua

local Screen = require "widgets/screen"
local Widget = require "widgets/widget"
local Menu = require "widgets/menu"
local Text = require "widgets/text"
local Image = require "widgets/image"
local ImageButton = require "widgets/imagebutton"
local TravelItem = require "widgets/travelitem"

local TravelScreen = Class(Screen, function(self, homesign, traveller)
    Screen._ctor(self, "TravelScreen") -- 构造函数,创建一个名为"TravelScreen"的屏幕
    self.homesign = homesign -- 将homesign赋值给self.homesign
    self.traveller = traveller -- 将traveller赋值给self.traveller
    SetPause(true, "TravelScreen") -- 暂停游戏

    -- 创建一个背景
    self.root = self:AddChild(Widget("ROOT")) -- 添加一个名为"ROOT"的小部件
    self.root:SetVAnchor(ANCHOR_MIDDLE) -- 设置垂直锚点为中间
    self.root:SetHAnchor(ANCHOR_MIDDLE) -- 设置水平锚点为中间
    self.root:SetScaleMode(SCALEMODE_PROPORTIONAL) -- 设置缩放模式为等比例

    -- 添加一个背景
    self.bg = self.root:AddChild(Image("images/globalpanels.xml", "panel.tex")) -- 在root上添加一个图像
    self.bg:SetSize(500, 650) -- 设置图像的大小
    self.bg:SetPosition(0, 25) -- 设置图像的位置

    -- 添加一个当前标题
    self.current = self.root:AddChild(Text(BODYTEXTFONT, 35)) -- 在root上添加一个文本
    self.current:SetPosition(0, 225, 0) -- 设置文本的位置
    self.current:SetRegionSize(350, 50) -- 设置文本区域的大小
    self.current:SetHAlign(ANCHOR_MIDDLE) -- 设置文本的水平对齐方式为中间
    self.current:SetString(self.homesign.components.travelable.name) -- 设置文本的内容为self.homesign.components.travelable.name

    -- 添加一个菜单,用来显示修改和取消按钮
    self.menu = self.root:AddChild(Menu(nil, 200, true)) -- 在root上添加一个菜单
    self.menu:SetScale(0.6) -- 设置菜单的缩放比例
    self.menu:SetPosition(0, -225, 0) -- 设置菜单的位置
    self.cancelbutton = self.menu:AddItem("关闭", function() -- 在菜单上添加一个名为"关闭"的项,点击后执行self:OnCancel()函数
        self:OnCancel()
    end)


    -- 添加两个按钮,用于翻页
    self.upbutton = self.root:AddChild(ImageButton("images/ui.xml", "scroll_arrow.tex", "scroll_arrow_over.tex", "scroll_arrow_disabled.tex")) -- 在root上添加一个向上的按钮
    self.upbutton:SetPosition(180, 200, 0) -- 设置向上按钮的位置
    self.upbutton:SetRotation(-90) -- 设置向上按钮的旋转角度
    self.upbutton:SetScale(0.5) -- 设置向上按钮的缩放比例
    self.upbutton:SetOnClick(
        function()
            self:ScrollUp() -- 当点击向上按钮时,执行ScrollUp函数
        end
    )

    self.downbutton = self.root:AddChild(ImageButton("images/ui.xml", "scroll_arrow.tex", "scroll_arrow_over.tex", "scroll_arrow_disabled.tex")) -- 在root上添加一个向下的按钮
    self.downbutton:SetPosition(180, -200, 0) -- 设置向下按钮的位置
    self.downbutton:SetRotation(90) -- 设置向下按钮的旋转角度
    self.downbutton:SetScale(0.5) -- 设置向下按钮的缩放比例
    self.downbutton:SetOnClick(
        function()
            self:ScrollDown() -- 当点击向下按钮时,执行ScrollDown函数
        end
    )

    self.menu:SetHRegPoint(ANCHOR_MIDDLE) -- 设置菜单的水平注册点为中间
    self.travelitems = self.root:AddChild(Widget("ROOT")) -- 在root上添加一个名为"ROOT"的小部件,用于显示项目
    self.travelitems:SetPosition(-100, 0) -- 设置项目的位置
    self.travelitems:SetScale(0.8) -- 设置项目的缩放比例
    self.currentRow = 1 -- 设置当前行为1
    self:LoadTravelItems(self.currentRow) -- 加载第一行
end)


function TravelScreen:ScrollUp()
    if self.currentRow >= 5 then -- 如果当前行大于等于5
        self.currentRow = self.currentRow - 5 -- 当前行减5
        self:LoadTravelItems(self.currentRow) -- 加载新的当前行的项目
    end
end

function TravelScreen:ScrollDown()
    if self.currentRow <= #Pigpet.homesigns - 5 then -- 如果当前行小于等于Pigpet.homesigns的数量减5
        self.currentRow = self.currentRow + 5 -- 当前行加5
        self:LoadTravelItems(self.currentRow) -- 加载新的当前行的项目
    end
end


function TravelScreen:LoadTravelItems(index)
    self.travelitems:KillAllChildren() -- 删除travelitems的所有子项
    --从 index 开始遍历, 只显示5个
    local num_items = 0 -- 初始化项目数量为0
    for i = index, #Pigpet.homesigns do -- 从index开始遍历Pigpet.homesigns
        if num_items >= 5 then -- 如果项目数量大于等于5,就跳出循环
            break
        end
        local v = Pigpet.homesigns[i] -- 获取Pigpet.homesigns的第i个元素
        local isCurrent = v == self.homesign -- 判断v是否等于self.homesign
        local item = self.travelitems:AddChild(TravelItem(v, isCurrent, self.traveller, self)) -- 在travelitems上添加一个TravelItem
        item:SetPosition(120, 200 - num_items * 100, 0) -- 设置TravelItem的位置
        num_items = num_items + 1 -- 项目数量加1
    end
end

function TravelScreen:OnCancel()
    SetPause(false) -- 取消暂停
    TheFrontEnd:PopScreen(self) -- 弹出当前屏幕
end

return TravelScreen

在这里插入图片描述

4 添加传送功能

4.1 处理右键点击函数

当右键点击 木牌的时候,我们需要打开一个面板,显示所有可以传送的地方,并且每个传送点后面都会有一个“传送”按钮。我们将 travel.lua代码稍微改动下。当右键点击的时候,会调用 travelable 组件的OnSelect 函数

-- 创建一个新的动作(Action),这个动作可以通过右键触发,优先级为10
local TRAVEL = GLOBAL.Action({}, 10, false, true)
TRAVEL.id = "TRAVEL"  -- 设置动作的ID为"TRAVEL"
TRAVEL.str = "传送"  -- 设置动作的字符串表示为"传送"
TRAVEL.fn = function(act)  -- 设置动作的函数,这个函数定义了动作的行为
    local tar = act.target  -- 目标实体
    local traveller = act.doer  -- 执行动作的实体
    if tar and tar.components.travelable and traveller then  -- 如果目标实体存在,且具有travelable组件,且执行动作的实体存在
        tar:DoTaskInTime(
            .2,  -- 在0.2秒后
            function()
                tar.components.travelable:OnSelect(traveller)  -- 调用目标实体的travelable组件的OnSelect方法,传入执行动作的实体
            end
        )
        return true  -- 动作成功
    end
 	return true  -- 先全部返回true看看效果 动作成功
end

-- 将新的动作添加到游戏中
AddAction(TRAVEL)
-- 为"wilson"状态图添加新的动作处理器,当执行"TRAVEL"动作时,使用"give"动画
AddStategraphActionHandler("wilson", GLOBAL.ActionHandler(TRAVEL, "give"))

4.2 打开传送面板

实现 travelable 组件的OnSelect 函数,在这个函数中,我们会打开一个全屏的面板,展示所有的可传送点

local TravelScreen = require "widgets/travelscreen"
function Travelable:OnRemoveEntity()
    --从 homesigns 表中移除
    for k, v in pairs(Pigpet.homesigns) do
        if v == self.inst then
            table.remove(Pigpet.homesigns, k)
            break
        end
    end
end

function Travelable:OnSelect(traveller)
	if not traveller then
		return
	end
    if traveller.components.health and traveller.components.health:IsDead() then
        return
    end
    --打开选择地点页面
    TheFrontEnd:PushScreen(TravelScreen(self.inst, traveller))
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/253532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker文档转译1

写在最前面 本文主要是转译docker官方文档。主题是Docker overview&#xff0c;这里是链接 Docker概述 Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使你能够将应用程序与基础设施分离&#xff0c;从而可以快速交付软件。你可以使用相同的方法像管理应用程序…

HarmonyOS4.0从零开始的开发教程18HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十六&#xff09;HarmonyOS应用/元服务上架 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c…

急速上手搭建单节点 k8s集群实战

Minikube搭建 是一种轻量化的Kubernetes集群&#xff0c;是k8s社区为了帮助开发者和学习者能够更好学习和体验k8s功能而推出的&#xff0c;使用个人PC的虚拟化环境就快速构建启动单节点k8s机器准备&#xff1a;阿里云 CentOS 7.x &#xff0c;2核4g 安装 安装Docker # 1.先…

Eclipse 自动生成注解,如果是IDEA可以参考编译器自带模版进行修改

IDEA添加自动注解 左上角选择 File -> Settings -> Editor -> File and Code Templates&#xff1b; 1、添加class文件自动注解&#xff1a; ​/*** <b>Function: </b> todo* program: ${NAME}* Package: ${PACKAGE_NAME}* author: Jerry* date: ${YEA…

liunx之Samba服务器

环境&#xff1a;虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享&#xff08;匿名访问&#xff09; 1.在虚拟机CENTOS 7安装smb服务&#xff0c;并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件&#xff0c;实现光盘匿名共享 4. 启动smb服务 5.在…

电子电器架构( E/E) 演化 —— 大算力

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

计算机网络(1):开始

计算机网络&#xff08;1&#xff09;&#xff1a;开始 计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化、网络化和信息化&#xff0c;是一个以网络为核心的信息时代。要实现信息化就必须依靠完善的网络&#xff0c;因为网络可以非常迅速地传递信息。因此网络现…

【UML】第5篇 UML中的视图和图

目录 一、视图和图 二、图的种类 2.1 结构图 2.2 行为图 图是UML中最重要的概念了&#xff0c;起码我是这么认为。 上篇关于低代码的文章&#xff0c;我也说了&#xff0c;未来也许AI编码&#xff0c;我们更重要的工作&#xff0c;是能够为业务进行建模&#xff0c;拆解&a…

WPF Icon矢量库 MahApps.Metro.IconPacks

文章目录 前言MahApps.Metro.IconPacksIconPacks.Browser简单使用简单使用案例代码Icon版本个人推荐 Icon自定义版权问题 前言 为了更快的进行开发&#xff0c;我找到了一个WPF的矢量图库。这样我们就不用去网上找别人的矢量库了 MahApps.Metro.IconPacks MahApps.Metro.Icon…

Elasticsearch的使用总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 put/post请求&#xff1a;http://localhost:9200/索引库名称 {"settings":{"index":{"number_of_shards":1, # 分片数量…

数据仓库与数据挖掘小结

更加详细的只找得到pdf版本 填空10分 判断并改错10分 计算8分 综合20分 客观题 填空10分 判断并改错10分--错的要改 mooc中的--尤其考试题 名词解释12分 4个&#xff0c;每个3分 经常碰到的专业术语 简答题40分 5个&#xff0c;每道8分 综合 画roc曲线 …

neuq-acm预备队训练week 9 P3916 图的遍历

题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求 A(v) 表示从点 v 出发&#xff0c;能到达的编号最大的点。 题目限制 输入格式 第 1 行 2 个整数N,M&#xff0c;表示点数和边数。 接下来 M 行&#xff0c;每行 22 个整数 Ui​,Vi​…

[足式机器人]Part4 南科大高等机器人控制课 Ch08 Rigid Body Dynamics

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch08 Rigid Body Dynamics 1. Spatial Vecocity1.1 Spatial vs. Conventional Accel1.2 Plueker Coordinate System and…

STM32F103RCT6开发板M3单片机教程04--按键检测

原画图讲解 本教程使用是&#xff08;光明谷SUN_STM32mini开发板&#xff09; 首先了硬件连接原理&#xff0c;STM32F103RCT6开发板是mini最小系统板&#xff0c;板子在没并有按键。需要自行用面包板搭建。 硬件连接&#xff1a; PC10 -> KEY1 &#xff08;MCU内部上拉…

MATLAB图像处理技巧

MATLAB图片处理------动态绘图 1. 动态绘图2. XXXXX 1. 动态绘图 主要用到四个函数&#xff0c;分别为getframe、frame2im、rgb2ind以及imwrite&#xff1a; 1.getframe&#xff1a;获取当前绘图窗口的图片作为影片帧&#xff1b; 2.frame2im&#xff1a;从单个影片帧 F 返回索…

数据仓库与数据挖掘c5-c7基础知识

chapter5 分类 内容 分类的基本概念 分类 数据对象 元组(x,y) X 属性集合 Y 类标签 任务 基于有标签的数据&#xff0c;学习一个分类模型&#xff0c;通过这个分类模型&#xff0c;可以把一组属性x映射到一个特定的类别y上 类别y 提前设定好的--如&#xff1a;学生…

安全密码(字符串)

#include <stdio.h> #include <stdbool.h> #include <string.h> bool is_secure_password(const char* password); int main() {int M;char password[51];// 读取输入中的密码数量 Mscanf("%d", &M);// 处理每个密码for (int i 0; i < M; …

Linux+Docker+Gitee+Jenkins自动化部署.NET Core服务

目录 一、安装Jenkins 1、跟新yum包 2、查询镜像 3、拉取镜像 4、创建Jenkins工作目录&#xff0c;并将容器内目录挂载到此目录上 5、启动Jenkins容器 二、Jenkins配置 1、Jenkins安装gitee码云插件 2、创建私人令牌 3、Jenkins添加全局凭据 4、系统配置 三、构建任…

5.5 Linux Apache服务

1、概念介绍 a. Web 服务简介 WEB服务器也称为WWW(WORLD WIDE WEB&#xff0c;万维网)服务器&#xff0c;主要功能是提供网上信息浏览服务。 常用web服务器&#xff1a;httpd&#xff08;apache&#xff09;、nginx、tomcat、IIS 客户端&#xff1a;IE、firefox、chrome b…

第15章 《乐趣》Page355~375 代码简化版

运行效果&#xff1a;全屏了 简化之后的代码如下&#xff1a; //main.cpp #include <iostream> #include <SDL2/SDL.h> #include "sdl_initiator.hpp" #include "sdl_error.hpp" #include "sdl_window.hpp" #include "sdl_sur…