前言

在看本教程之前,笔者默认你已经熟读并学会了创建扩展,你应该学会如何使用 GML 编写扩展——这是一切的前提,请使用 GML 编写你的第一个扩展而不是 DLL。

在本教程中,笔者将教会你使用我们的制作工具——Visual Studio 2017 来编译一个基本的 DLL,我们的目标是制作一种能够检测两个实例之间的碰撞的插件。

此页面底部有一个可供下载的DEMO,但我们强烈建议您按照本教程进行操作。

重要提示 I:本教程假定您对 C/C++ 编程有一点了解并基本熟悉 Visual Studio 2017。我们不教你 C/C++ 也不会教会你 IDE 的使用,请自行查阅教程。

重要提示 II:为什么我们一定要使用 Visual Studio 2017 而不是 Visual Studio 2022 之类的版本呢?这是因为 2017 目前 GMS2 中支持最广泛的 VS 版本。尽管其他版本用的可能更舒服,但请相信,兼容性最好的仍然是 2017,希望您已经安装的也是如此。

我们为什么要创建 DLL 扩展

在制作 Windows 游戏时,你有时会遇到 GML 无法解决的棘手问题,这些问题我们必须先骂一下 yoyogames,然后再来考虑我们应该怎么办——很明显,DLL 扩展是最好的出路之一。

(虽然 GMS2 已经提供了很好的碰撞方法,但请让我们假设:假如 GML 中不存在碰撞相关的函数,我们应该怎么办。)

创建您的 Visual Studio 项目

PS:我用的英文版VS,所以部分涉及到文件操作的地方就不翻译了,因为不同版本的汉化肯定存在差异。

首先,从 Visual Studio 中的 File > New 对话框创建一个空的 C++ 项目。

确保为项目选择合适的名称和保存位置,然后继续保存项目。注意:本教程中的项目名和插件名均为“ DLLExtension ”,如果你在后续代码中看到了此字样请不要惊慌,酌情改为自己的项目名和插件名。

创建项目后,需要更改设置以便让我们编译时生成一个 DLL 文件。这是在项目的属性中完成的,可以在解决方案资源管理器中项目的右键菜单中找到。

然后,您将看到应用程序设置窗口。要更改为 DLL 输出,请选择“配置类型”下拉菜单并选择动态链接库 (.dll)。

Apply/OK 后,我们要生成一个包含我们代码的源文件。

您可以从解决方案资源管理器中执行此操作,方法是右键单击 Source Files 文件夹并选择 Add > New Item。从此对话框中,您可以选择“c++ 文件 (.cpp)”然后进行重命名。在本教程中为“Collisions.cpp”。

现在,我们要开始写代码了。

编写你的 DLL

你是不是以为我们马上要开始实现功能了?NO NO NO。为了方便,我们要添加一行代码:

#define func extern "C" __declspec(dllexport)

这行代码看起来很复杂,但我们可以一个词一个词的帮你解析一下:

"#define func" 可以理解为“替换”,该关键词的意思是将代码中的所有 “func” 字样替换成 “extern "C" __declspec(dllexport)” 后编译。

“extern "C" 是一个编译器标志,这相当于告诉编译器:”我想要编译成C语言DLL的风格!“。这样做是因为 C++ 可能会在函数声明中添加我们不想要的额外信息。

"__declspec(dllexport)" 的意思是标志着这个函数是公开的,可以让GMS2调用。

添加完这一行后,当我们想要声明一个新函数时,我们只需要使用关键字“func”,而不是上面那一大堆。比如下面这样(这只是比如啊啊,千万不要写到你代码里,写了也没用)

func double TestFunction() {return 1;
}

现在,我们可以开始实现功能了。

我们的目标是实现检测碰撞的功能,所以我们可以先制作一个最简单的检测碰撞示例——”点是否在圆内(IsPointInCircle)“。

func double IsPointInCircle(double xx, double yy, double cx, double cy, double cr){// (xx,yy)是点的坐标,(cx,cy) 是圆心的坐标,cr 是圆的半径。// 因为勾股定理,我们可以得出如果点在圆心内, 则x^2 + y^2 < r^2。// 因此,我们便得到了以下这行代码。return ((xx - cx)*(xx - cx) + ((yy - cy) * (yy - cy)) < cr*cr);
}

没看懂?可以参考这张图。

PS:我拿Win11带的画图折磨了半天才画出来

从这张图中我们可以知道,|xx-cx| = x,|cy - yy| = y,为什么要用绝对值呢,懒得说了,自己品吧。

因为勾股定理, aa = x^2+y^2。我们很明了的能看出,当这个点在圆内时,a < r,当这个点在圆边上时,a = r,当这个点在圆外面时,a > r。

因此便可推理一下得到以下结果:

因此便得到了上面那行代码。

话说回来,为什么我们的数据类型使用的都是 double 呢?这是因为 GMS2 的 DLL 扩展只支持 double 和 string 这两种类型。

接下来,你只需要编译 DLL 文件,然后按照创建扩展走就行了。

后记

请记住,DLL 只能用于 Windows 平台。

GMS2 2.3.1 及更高版本可以支持64位 DLL,而旧版本仅支持 32 位 DLL。但是,我们鼓励您尽可能多地支持 64 位扩展,尤其是在制作 Marketplace 的内容时,因为 32 位支持最终将被淘汰。

以上信息保持不变,除了您需要在 Visual Studio 中选择 64 位输出(“x64”)类型。

Gamemaker小课堂#0 如何为 Windows 游戏编写 DLL 扩展相关推荐

  1. windows下编写dll

    dll的优点 简单的说,dll有以下几个优点: 1) 节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中.如果 ...

  2. Gamemaker小课堂#1 Gamemaker已经安装

    问题描述 你是否想过不使用uninstall.exe的方式卸载Gamemaker?你可能会直接将文件夹删除,如果你是个专业人士,你可能会使用geek这样的专业工具,然而,这样真的好吗? 当你打算重新安 ...

  3. Windows下编写php扩展(二)将linux下的php-cpp项目移植到windows

    引言 linux下的php-cpp项目,这个项目生成动态链接库,使用这个动态链接库,可以快速地用C++开发php扩展.相比较php官方提供的,用c语言开发php扩展方案.php-cpp使得开发php扩 ...

  4. 态路小课堂丨100G解决方案 - 4×25G NRZ光模块

    100G光模块是100G数据中心中重要组成部分,100G光模块标准主要由IEEE和MSA两个组织定义,针对不同距离的100G互联场景制定了多个标准.根据不同分类标准,100G光模块可分为以下类型: 如 ...

  5. VB 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'--继续加载工程吗?

    引用:http://blog.sina.com.cn/s/blog_5542b9c90100xsm8.html 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'-- ...

  6. NEXT社区小课堂 | 第四课:dBFT 2.0详解 | 委托拜占庭容错:技术细节、挑战和前景...

    NEXT社区 | 小课堂 由于近期NEXT社区加入很多新的小伙伴,有在校大学生,有对区块链感兴趣的传统企业从业者.为了更方便.更系统的让NEXT社区的伙伴们了解NEO的技术知识,因此我们开设了小课堂, ...

  7. 2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用剩下的牌做游戏,小明设计了新的游戏规则: 1) A,2,3,4....10,J,Q,K分别对应1到13这些数字,大小王对应0; 2) 游

    2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用剩下的牌做游戏,小明设计了新的游戏规则: A,2,3,4-10,J,Q,K分别对应1到13这些数字,大小王对应0; 游戏人数为2人,轮流 ...

  8. 深度linux运行windows游戏,在deepin linux系统中手动安装windows游戏的小技巧

    本文介绍在deepin linux系统中手动安装windows游戏的小技巧.其实现在wine很好用了,基本dx9的游戏都能玩,但是有些RA2则效果一般,不是很好.关于deepin-wine的版本低有些 ...

  9. 小皮助手(电脑玩手机游戏) v1.0.0.1 官方版

    小皮助手(电脑玩手机游戏) v1.0.0.1 官方版 软件大小:19.5MB 软件语言:简体中文 软件类别:手机工具 软件授权:官方版 更新时间:2015-02-03 应用平台:/Win8/Win7/ ...

最新文章

  1. 基于变分自动编码器(Variational Autoencoders)疾病预测系统实战:(Keras实现并可视化训练和验证误差、最后给出topK准确率和召回率)
  2. python实现顺序查找和哈希查找
  3. haproxy负载均衡_使用haproxy搭建web集群
  4. 计算机视觉和图形学中的摄像机内参数矩阵详解
  5. 转:聊聊开发中幂等性问题(*)
  6. Rancher创始人谈Docker,创新愈发困难,未来将何去何从?
  7. 第四天:制作网页的基本操作
  8. 证明LDU分解的唯一性
  9. python str 索引_一步一步学Python3(小学生也适用) 第九篇: 字符串(str)类型(中)...
  10. html是手机吗,MHTML是什么
  11. 他用代码卖手机,卖出年流水上亿
  12. LaTeX通用简洁模板
  13. win10查看服务器共享文件夹,Win10怎么样查看共享文件夹
  14. VOC2007 2012数据集有多少张图片
  15. CSPS2019Day2T1(Emiya家今天的饭)题解
  16. 天猫多个商品主图、属性图和细节图分类下载
  17. Origin2018怎么画出向上向下的柱状图
  18. 图扑入选 2021 中国企业抗洪捐赠 500 强榜单
  19. 黑莓9000和9900哪个好_黑莓9900和9930的区别大剖析【详细介绍】
  20. 【操作系统】虚拟页和物理页

热门文章

  1. DLink624+A拨号失败的问题
  2. Python函数式编程(fn)
  3. 【基于微信的物品回收小程序的设计与实现】
  4. canvas绘制太极图
  5. android 程序中设置默认输入法
  6. 为什么Kindle不支持epub?
  7. Arcgis中的坐标和投影
  8. 中级C++:二叉搜索树、key-Value模型
  9. 计算机行为治疗模式,抑郁症的计算机化认知行为治疗(27页)-原创力文档
  10. AB罗克韦尔plc指示灯详解