GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

189 信息 1069 成员
游戏开发工具 GameMaker Studio 2 的讨论小组
GameMaker Studio2 文档翻译征集校对人员
deciia 2018-10-20

通过之前的文章《...文档翻译 需求调查》,目前已经征集到了包括我在内的5名翻译人员,目前进展良好。

为了保证质量和速度,并让项目最终完成,我决定采用小批量的工作方式,即翻译一章(包括很多节)马上校验一章,以确定翻译的质量,并且避免多次返工。

然而文本量巨大,翻译人员仍然显少,质量和速度并不能兼顾,因此需要再召集3-5名校对人员,要求如下:

  • 经常使用GMS2,或正在使用,并比较完整的翻阅过gms/gms2的文档。
  • 有一定英文阅读能力,不要求翻译。
  • 需要根据英文文档和翻译好的中文文档,指出并记录翻译的问题。

参与校对流程

通过邮箱(deciia@qq.com)或者QQ(317937401)联系我申请。

以下是作为参考的中英文档:
英文文档 中文文档
一般来说每完成一个章节都会发布到网站上,每个月会进行一次完整的对外发布。

你可以尝试选择左测目录中已经翻译的一章,如“附加信息”,阅读一遍中文,感受一下是否阅读流畅,是否有难以理解的地方,然后对照一下英文,查看是否有翻译错误。

将你的感受和建议直接在原文下方回复。

正式参与后,加入翻译组,之后的过程中记录你完成的工作,项目最终完成时,和其它组员一起添加到贡献列表。

校对流程如下:

  1. 下载看板管理软件Trello(应用市场可以下载,网页版),并提供你的常用邮箱,通过邮件邀请的方式,我会将你添加到翻译项目中。
  2. 翻译项目的“待校验”列表是初步完成翻译的章节,选择一个标记为自己,具体操作群里会说明。
  3. 每周用一段时间,或平常在使用gms2文档的时候,校对在Trello翻译项目对应的章节的评论中记录你感觉不流畅、难以理解、翻译错误的情况。
  4. 完成校对后,将相关的章节移动到“在修改”中。
  5. 重复2-4步,直到全部完成。
可以开两个浏览器窗口对照。

如果你觉得这样不够爽,也可以使用翻译的流程,在omegaT中,每句都有中英文对照。详细可以查看翻译注意事项

翻译流程需要下载omegaT,注册github帐号,通过测试项目测试与github的同步,正式开始之前的过程稍微有点麻烦,但之后只要核对记录就可以了。为避免误操作,不推荐新手使用这种方式。

接下来是画饼时间了

目前除了人员的参与之外,并没有什么开销,翻译API目前是免费的。但是想做得更好的时候还是会考虑一下成本,比如某仙女用了几个小时去寻找并试用免费的资源做runtime的rss。有很多构想都是基于两点,一是有人来做,然后是人支持。人的想象是无限的,能做到的事情是有限的。更大的饼在这里说了也是空话。

如果觉得对你有帮助,可以献出一份支持,这些并不足以支付时间上的付出,但足够画一张大饼。之后,请捐赠者在留言中说出你的想法,为什么会捐赠,遇到了哪些问题,还有什么需要帮你做的,务必…务必留下邮箱或其它的联系方式,以便我们可以对你的体验进行回访。不方便表明身份的话,可以直接联系我,最好注明一下自己是捐赠者。

捐赠时请备注:gms2文档翻译

GMS用SteamSDK No.4 找到创意工坊下载文件

当玩家在创意工坊里面下载了东西 不管是皮肤 还是地图等 都是在一个个文件夹里面而已

找到对应的位置 然后自己内容 验证就行了 过程我懒得管 我就教 如何找到位置而已

然后在意的就是 我写代码的时候 会忽略steamAPI 启动验证等玩意 


首先 给你们看一下分析结果的内容

一个list 两个 Map

1.用户订阅内容的ID列表

2.订阅内容下载状况

3.订阅内容的信息

Image title



估计直接一个创建能够写完吧


讲一下目的性 我要做的内容是 筛选 能够使用的 创意工坊物品文件架 载入这个list 里面

FileList = ds_list_create();

首先我们要获 用户订阅内容的ID列表

IDList = ds_list_create();
steam_ugc_get_subscribed_items( IDList );

把信息塞入 map里面面 筛选 然后 加入文件列表里面

for (var i = 0; i < ds_list_size(IDList); ++i) {
//创建和载入
     var  Update = ds_map_create()
  steam_ugc_get_item_update_info(IDList[|i],Update);

 var  Install = ds_map_create();
  steam_ugc_get_item_install_info(IDList[|i],Install);


//这里 执行筛选 
    if Update[?"is_installed"] //验证是否安装
    if !Instanll[?"Legacy_item"] //google那边翻译是遗留文件
    {
        ds_list_add(FileList,Install[?"folder"]);//文件夹的位置就在这里了
}



//清理残渣是个好习惯
ds_map_destroy(Install);
ds_map_destroy(Update);


 }
(转发自:原日志地址
GMS用SteamSDK No.5 做一个创意工坊的页面

这一篇内容搁着留个坑


想用的话直接用这个

steam_activate_overlay_browser("你家创意工坊网页")

直接跳出来就是了

(转发自:原日志地址
GameMaker Studio2文档翻译需求调查
deciia 2018-10-06

^_^喵

GMS2界面翻译

在和yoyo官方确认之后,得知官方并不反对民间进行学习目的的本地化工作,最初的版本是由我、小太和LiarOnce共同完成的,接收到群里有人在求最新的界面汉化的反馈,我用了大约两周的时间,完成了后续的翻译并进行了多次校验。我不确定的是,这样的工作能帮助到多少人,仅仅有一人反馈就动用这么大的时间量来做这件事,还是有欠思考。
不过已经完成了,这个项目就不多说了。
这是项目地址,请阅读Readme并往指定地址下载相应的版本。
项目地址 发布页面 最新版本2.2.0.341

GMS1&2文档翻译

从1代开始我就在做这件事,也尝试召集了汉化组,但都没有最终完成。一个给大家使用,而不是仅仅是个人参考的文档,对于gms2的学习和推广是有必要的。我没有继续翻译的原因主要原因:

  • 我不确定多少人对这个有需求,我个人阅读英文文档没有太大压力。没有接收到持续的反馈让我能够了解到是哪些人真正在使用这个引擎。
  • 汉化组的人都很忙,而且并不都是一直在使用GMS,或者说对GMS的汉化的需求也不大,仅仅靠催促来推动工作量。

我现在已经做好了准备,微软翻译API已经申请到了(使用全币种信用卡申请的,测试了几个,只有微软的能用),可以尝试继续这件事。

准备中的新版本 项目地址 红激的版本 顺子的版本

在开始之前,有一些前提需要确认。

  • 文档翻译这件事值得做吗,有多少人需要这个东西?
  • 我们需要用多大的成本来做这件事,多长时间,需不需要使用商业工具和人员的辅助,有没有外援?
  • 汉化组的质量是否可以得到认可,需要花多大的精力或额外的成本来提高自己?

对于每一个使用引擎开发游戏的人来说,英文阅读能力是非常重要的,很多技术方案的解决方案和教程来自英文环境,真正想用好GMS的人对汉化版本的需求有多大?即使不考虑这个,具体有多少会使用gms2开发,汉化好了又能让多少人开始使用gms2,这些都是不确定的数字。

来自红激的数据,他接触到的长期使用gms2的大约100位左右。

如果你确实需要一份高质量的人工翻译的文档以及其它更多的基础教程

请在原文中留言,也欢迎给我发邮件(deciia@qq.com),或者在网站上联系

你可以说明:

  • 说明自己需要汉化版的原因
  • 对要翻译的内容进行一个简单排序,即你想优先了解哪些文档中的内容。
  • 是否方便后续的回访,以及其它的需求,你要分享给我的内容。

如果知道朋友有汉化文档的需求,如果你或者他曾经尝试过翻译gms2文档,向他说明:

http://valcell.com/blog:68,这篇文章在征集GameMaker Studio2 文档翻译需求的反馈,你不是想要汉化的文档吗/你不是也在翻译吗?

或者简单的通过下面的分享工具将本文的地址分享给他/她。

我们的目标是:找到需要翻译文档的人,正在使用GMS2构建项目并遇到问题的人,以及愿意提供助力,让这件事有较大可能性完成。

目前已经联系上了顺子,如果大家还知道哪些正在孤立的做这些工作,肯请将相关的页面或联系方式在评论中回复或给我发邮件。

上面我说到了成本,并不是说将来需要大家为此支付什么,而是希望大家认识到,要想获取更有价值的东西,需要支付时间,支付信任,一份简单的邮件或反馈,一个可以帮助产品持续改进的过程,一句简单的感谢,以及偶尔也可以为别人做点什么。

目前的翻译流程

目前是使用omegaT软件辅助翻译,它有以下优点:

  • 它会将文档分割成许多片段,提供方便的界面和快捷键,加快翻译的效率,官方文档更新后,也能自动检测未翻译的片段,并用记忆库已经完成的片段进行匹配,匹配成功的直接替换,不成功的也会给出模糊匹配的建议。
  • 翻译之后生成的记忆库可以转移到其它的gm/gms/gms2的文档项目,比如我将gms的记忆库转移到gms2项目中,很多已经翻译的都不需要再翻译了。
  • 词典,术语词汇表,机器翻译,模糊匹配,注解,笔记,多选译文,支持许多人性化的工具,以提供翻译的参考。

一个公用的记忆库,对于所有的gms相关的翻译项目来说,都是一笔财富。

详细可以参考:翻译注意事项

我可以期待

最后,要说明的是,这是一个期望完成一个高质量gms2文档翻译的实验。需要确认大家对这件事有多重视,以免我们不会多做无用之功。

GMS用SteamSDK No.4 找到创意工坊下载文件

当玩家在创意工坊里面下载了东西 不管是皮肤 还是地图等 都是在一个个文件夹里面而已

找到对应的位置 然后自己内容 验证就行了 过程我懒得管 我就教 如何找到位置而已

然后在意的就是 我写代码的时候 会忽略steamAPI 启动验证等玩意 


首先 给你们看一下分析结果的内容

一个list 两个 Map

1.用户订阅内容的ID列表

2.订阅内容下载状况

3.订阅内容的信息

Image title



估计直接一个创建能够写完吧


讲一下目的性 我要做的内容是 筛选 能够使用的 创意工坊物品文件架 载入这个list 里面

FileList = ds_list_create();

首先我们要获 用户订阅内容的ID列表

IDList = ds_list_create();
steam_ugc_get_subscribed_items( IDList );

把信息塞入 map里面面 筛选 然后 加入文件列表里面

for (var i = 0; i < ds_list_size(IDList); ++i) {
//创建和载入
     var  Update = ds_map_create()
  steam_ugc_get_item_update_info(IDList[|i],Update);

 var  Install = ds_map_create();
  steam_ugc_get_item_install_info(IDList[|i],Install);


//这里 执行筛选 
    if Update[?"is_installed"] //验证是否安装
    if !Instanll[?"Legacy_item"] //google那边翻译是遗留文件
    {
        ds_list_add(FileList,Install[?"folder"]);//文件夹的位置就在这里了
}



//清理残渣是个好习惯
ds_map_destroy(Install);
ds_map_destroy(Update);


 }
(转发自:原日志地址
GMS2:draw_text_ext小坑一枚
顺子 2018-09-04

大多数情况下,我们做游戏总要用到文字,而大量的文字显示就需要考虑排版。

文字最基本的排版手段就是换行,那么我们该怎么在游戏中让文字自动换行呢?

如果看过一些教程的朋友应该都知道再 GMS2 里普通的文字绘制函数是:

draw_text(x,y,string)

而另外还有一个略微高阶一点的函数是:

draw_text_ext(x, y, string, sep, w);

理论上,这个带 ext 后缀的函数就是自带的具备自动换行功能的函数了,其中“sep”即行间距,而“w”正是设定的单行文字像素宽度,理论上当文字长度超过这个宽度时就会自动换行,许多关于对话框实现、文字显示的教程里也都会使用这个函数,但是当你自己去尝试使用这个函数时却往往会发现,自动换行并没有起效……

记得最早在 indienova 上有人介绍 FriendlyCosmonaut 的对话框教程时下面就展开过讨论,后台也有朋友提过这个问题,不过当时一直没明白原因,因为测试的时候发现有的时候可以,有的时候又不行,非常不稳定。直到有一天 QQ 群里的朋友一语道破:

因为根据拉丁语系都是以单词为单位组成句子的,而单词跟单词之间必有空格,为了保证单词完整可读,所以 draw_text_ext 这个函数是在当单行文字宽度超过了你设置的限制并且有空格时才进行换行

而我们中文的字与字之间不需要空格,于是就出现了这种很神奇的无法自动换行的“BUG”解决的方法其实也简单,第一种最简单的就是你在本该换行的地方敲上一个空格,让这个函数发现此处有空格该换行了。但这种做法只适合做测试或者一两处文字随手改一下的情况,如果文字量大,而且时不时需要重新调整排版,那工作量就非常感人了。

所以,我们还有一个办法,自己写一个脚本来给中文自动换行即可,此处 QQ 群里的“口十”同学贡献了自用的一个脚本可供诸位参考,其中还针对行末是标点符号的情况做了特殊处理,确保把标点符号留在行尾(不过符号不够完整,各位可根据自己的使用需求进行修改调整)。

/// @func draw_chinese_text_ext(x, y, str, sep, w, less_or_more);
/// @param x_ordinate        x 坐标
/// @param y_ordinate        y 坐标
/// @param string                绘制的字符串内容
/// @param sepration          行间距
/// @param width                 单行最大像素宽度
/// @param l_or_m              单行取大于或小于上述宽度

var xx = argument[0];
var yy = argument[1];
var str = argument[2];
var sep = argument[3];
var w = argument[4];
var l = noone;
if (argument_count > 5) l = argument[5] else l = true;

var x0 = xx;
var y0 = yy;

while!(str == ""){
    var s = "";
    var i = 0;
    var ww = 0;
    var con = "";
    do{
        i++;
        s = string_copy(str, 1, i);
        ww = string_width(s)
        con = string_copy(s, i, 1);
    }until(ww >= w) or (i >= string_length(str)) or (con == "#");
    if (con!="#"){
        if (l) and (ww > w){
            var char = string_char_at(s, string_length(s));
            var t = char == ")" or char == "," or char == "。" or char == "!" or char == "?";
            if !(t){
                i--;
                s = string_copy(str, 1, i);
            }
        }
        draw_text(x0, y0, s);
        y0 += sep;
        str = string_delete(str, 1, i);
    } else {
        s = string_copy(str, 1, i-1);
        draw_text(x0, y0, s);
        y0+=sep;
        str = string_delete(str, 1, i);
    }
}
return noone;


(转发自:原日志地址
[ 分享 ]一起做牧场物语---001移动&碰撞 [GMS2中文教程]
aventzero 2018-08-08

B站地址(诺娃只能播放流程画质,调整画质请前往B站)

英文教程地址:Movement and Collisions | Farming RPG Tutorial: GMS2 [1]


大家好!我又出现了!!

本期视频,从一个初学者的角度,介绍了有关移动/碰撞的制作方法

参照牧场物语制作了简单的移动(伪4方+按键跑步+传送带),还有就是普通的方块碰撞实现(Step事件内)

希望大家喜欢!

下一期会带来素材的整理及素材的使用~~欢迎继续大家继续关注并提出宝贵的意见和建议.

(转发自:原日志地址
[ 分享 ]一起做牧场物语---000基本介绍 [GMS2中文教程]
aventzero 2018-08-07


B站地址(诺娃只能播放流程画质,调整画质请前往B站)

英文教程地址:Farming RPG Tutorial: GMS2 [Intro for Beginners]

大家好!这里是一只二爷,作为一名GMS2的初学者,在油管看了很多的教程视频,为了更多的人能接触这个好软件!决定争取抽空把好的视频自己理解后中文化,可能有很多不尽人意的地方,请大佬们多多指教!

这次的视频主要内容是制作一个牧场物语范本系列视频,原创意来源于Youtube的FriendlyCosmonaut.预计会有20个左右的中文视频及主要的gml代码全注释共享,希望大家喜欢支持!

(转发自:原日志地址
陈康 2018-07-12

软件操作001

设置的奥妙

Image title




请教一下关于游戏暂停的问题
JackRecson 2018-06-30

我刚接触GMS2不久,正在B站学习大佬的《横板射击游戏教程》,学到游戏暂停的时候遇到了一个问题,

因为视频原作者用的试用版GMS2,无法调用surface函数,所以,在说到使用application_surface获得截图后就没有深入了。。

之前视频教程里有通过设置摄像机,将640*360的游戏,放大成窗口1280*720的游戏,

但是问题来了。。

因为视频用黑屏来作为暂停不是很喜欢,于是自己还是用的application_surface获取截图来作为暂停画面,

代码如下:

if !pause_{
    pause_ = true;
    instance_deactivate_all(true);
    if instance_exists(pause_sprite) sprite_delete(pause_sprite);
    pause_sprite = sprite_create_from_surface(application_surface, 0, 0, room_width, room_height, false, false, 0, 0);
}else{
    pause_ = false;
    instance_activate_all();
}
之后能实现暂停功能,但是暂停画面只会用原客户端画面的左上角四分之一来覆盖

这是游戏画面

这是暂停画面

不知道该怎样去解决,希望能得到大佬们的耐心解答!十分感谢!!

只能使用 gml 编程吗?
tltstudio 2018-06-18

如题,问下大家,有没有使用过别的语言在 gms 上编程,比如 lua、c#、js、python 之类的?


关于 lua 我有看到一个运行时编译到 gml 的库:https://marketplace.yoyogames.com/assets/5192/apollo-execute-lua-code

不过挺贵的大概 100 块。


--- 槽点 ---


gml 蛮好的,但是写着写着强迫症发作了。

不能在 object 的 event script 里面定义 function,而必须在 scripts 下 create 一个 script 再来调用,对我这种喜欢小函数的人来说简直灾难... 一个难管理,另一个不知道会不会影响启动性能。而且调用的时候都是全局的,不能通过 namespace 来隔离。

PS:

虽然官方的 roadmap 有提到 inline function,解决了可以在 event script 里面写 function 的问题:

  • GML: Inline functions - allow var a = function( a, b ) { ….. }

但是目前还不能用...


顺便再问问,大家是怎么组织代码的,总感觉 gml 的代码组织方式很容易写乱,求老司机分享。谢谢~

陈康 2018-06-15

20180615

  1. https://share.weiyun.com/5IcZYo1 汉化文件chinese2018年4月10日
  2. https://share.weiyun.com/57unGHD  runtime-2.1.4.218
  3. https://share.weiyun.com/5BnkxAz  GameMakerStudio-Installer-2.1.4.295


无法登录 gms2...
tltstudio 2018-06-14

能在网页上登录,但是通过淘宝代购(以礼物形式发送到 steam 的),没法登录。


错误提示:



但是之前我是能登录的,还做了两个示例游戏

【GameMaker: Studio】instance_place和instance_position和一个小坑
Rusty 2018-06-14

instance_place和instance_position,无论名字还是功能,都是非常接近的两个函数,其作用都是检测给定的坐标值上是否有指定的对象存在,如果有,就返回该对象的唯一ID。一眼看上去,差别相当细微。

不过,坑往往就在非常细微的差别之中。

昨天,我就踩进这个坑里去了。

事情是这样的,昨天晚上弄demo时,我惊讶地发现明明在房间a可以正常触发的事件,在房间b就怎么都触发不了了。

触发事件的代码思路很简单,检测鼠标是否在事件触发对象的碰撞遮罩(collision mask)上,如果是,用变量x记录该对象的唯一ID,变量x默认为noone,所以当x != noone时,按下鼠标左键,就能触发事件,会弹出一段文字。

为了查错,我把变量x的值画出来一看,结果发现在房间b中无论我如何把鼠标对准目标对象,得到的都是-4(即noone的值),而在房间a中就能十分顺利地获取ID。正因为在房间a事件是可以正常触发的,我没有第一时间怀疑问题出在触发事件的代码本身上,而是怀疑是否自己漏掉了什么条件,或者哪里的代码干扰了事件的正常触发。

然后就开始各种查错……

最后发现,原来之所以触发不了这个事件,是因为需要房间至少有两个该事件在,才能正确触发,而房间b里只有一个该事件存在,因此无法触发,添加一个之后也能正常工作了……

想了想,我是通过在该对象的step里,用instance_place(mouse_x,mouse_y,该对象ID)来检测的,然后悲剧就发生了……

为了查明原因,我仔细看了一遍instance_place的官方描述:

With this function you can check a position for a collision with another instance or all instances of an object using the collision mask of the instance that runs the code for the check. When you use this you are effectively asking GameMaker Studio 2 to move the instance to the new position, check for a collision, move back and tell you if a collision was found or not. This will work for precise collisions, but only if both the instance and the object being checked for have precise collision masks selected otherwise only bounding box collisions are applied...

也就是说,instance_place这个函数的工作原理,和碰瓷差不多,是把一个实例移到指定的坐标点,去碰另一个实例,如果碰到了,就返回被碰瓷实例的唯一ID。所以我在房间b的做法,无异于让触发事件的对象自己去碰自己,自然碰不到了。

然而,因为instance_place函数本身并不需要你填入用哪个实例来碰瓷,所以我一开始就没注意到这个工作原理。实现此类事件的正确做法,是用instance_position,这个函数就不是基于用实例碰瓷来判断的了(当然也享受不了实例的碰撞体积了),事件立刻可以正常触发了。

instance_place,我记住你了,以后走夜路给我小心点……

(转发自:原日志地址
Roguelike+换装?国产独立像素游戏《MetalMind》
Lee 2018-05-28


Image title

《MeatlMind》是一款我们正在研发的,像素风格,融合了传统Roguelike与换装的独立游戏。游戏采用Unity3D进行开发,预计在九月至十月推出游戏的试玩版本。目前游戏部分详细内容一登录摩点网创意版:https://zhongchou.modian.com/item/13876.html?_mdsf=home_czpro_web&_mpos=h_czpro_web#comment

在《MetalMind》中,四大装备模块与独特的换装系统,将会创造出无限的配装可能。每个人都可以去打造属于自己的战斗风格。不过丰富的装备,不代表可以无限制的去叠加。想要变得更强,就要懂得取舍。如果你对这个游戏感兴趣的话,欢迎大家随时给我们提意见。有兴趣的可以点上面的链接去摩点网创意版看看我们游戏的详细内容。喜欢的话,别忘了给我们点个赞,点一下看好创意~谢谢大家

(转发自:原日志地址
GMS2官方文档的翻译
ikonon 2018-05-24

由于我英语不太好,翻译的过程也是学习的过程,我会在翻译过程中插入一些自己的见解,难免有些错漏,所以欢迎大家在评论区留言,共同探讨。

以下是链接,我把翻译的文章存到了那里,密码是:123456

http://www.showdoc.cc/web/#/75108021544342?page_id=426676082922485

(转发自:原日志地址
IANXMATE 2018-04-16

大佬们,我第一次用这个软件做游戏,但出现了以下情况,请赐教!











[求教]请问基于回合制的buff和debuff的实现,是否有比较便捷的方式?
Rusty 2018-04-16

如题,个人在尝试做一款基于回合制的游戏,因为会涉及到大量的buff和debuff,按照我目前粗略的想法,是在player和enemy的parent的create event中创建个名为buff的ds_map,并在step event中检测ds_map是否包含某项buff,如atk_up,def_up等,当然某些角色特有的buff会放在具体的obj的step里,然后具体呈现在角色上的特效,就在draw事件里判断并绘制了。虽然也能够实现,但感觉这个想法的开发效率和维护效率不太高……

不知道哪位大佬有比较高效或者便于维护的实现方式?感谢指教0.0

自用Gamemaker小脚本:关键词超链接
枕头 2018-03-27

最近开始继续写一些诺娃模拟的东西,其中包括一个终端聊天系统,然后遭遇一个需求:关键词超链接。效果是在一段文本中,给一些特殊设定的关键词加个超链接或者悬停效果。这个东西在网页里头很常见,在很多悬疑推理类AVG(提取文本资料中的线索)里也有应用。

在gamemaker里肯定没这个原生功能。很简单地搜索了一下也没指望能找到现有的解决方案,毕竟这个功能很小,所以就自己写一个简单的,也许以后准备做avg还能用上(并不。

大概实现思路是,在文本中插入“$”类似的占位符,在设置关键词的时候用来定位,实际打印的时候就无视。定位了关键词的首尾位置之后就可以得到实际绘制以后这个关键词所在的相对位置[1]。之后就可以根据此来设置一个感应按钮。这个感应按钮直接在step里判断鼠标碰撞,里面的内容包括相对位置和关键词的所有信息。我这里用了一个map结构来做词典,拿到关键词以后就能得到关键词的所有信息。我简单的实现了鼠标悬停出注释,实际上还可以有更多用法。

[1]:具体方法见代码(不一定好读懂。因为使用draw_text_ext的时候,gm会自动强制换行,所以先用末尾定位行数,然后往前找到换行处,得到所在行的位置

最后是一个简单的实现效果(对话系统是自用的一个简单事件跳转系统,avg里估计用不上,主要是用来发系统通知用的)。:Image title


下面是参考代码

///@function string_set_hyperlink

var lx = argument0;
var ly = argument1;
var str = argument2;
var sep = argument3;
var w = argument4;

while (string_pos("$",str)!=0){
    //偏差值,根据实际字体酌情修改
    var offset_x = 6;
    var offset_y = 10;
    //定位关键词首尾的占位符位置
    var p1 = string_pos("$",str);
    str = string_replace(str,"$","");
    var p2 = string_pos("$",str)-1;
    str = string_replace(str,"$","");

    //利用关键词首尾在文本中位置,计算其绘制的相对位置
    var x1 = 0;
    var y1 = string_height_ext(string_copy(str,1,p2),sep,w);
    var tempp = p2;
    while (tempp>0 && string_height_ext(string_copy(str,1,--tempp),sep,w)==y1){};
    if (string_height_ext(string_copy(str,1,p1),sep,w)==y1){
        x1 = string_width_ext(string_copy(str,tempp+1,p1-tempp),sep,w)-string_width_ext(string_copy(str,p1,1),sep,w);
    }
    y1 -= offset_y;
    var keyword = string_copy(str,p1,p2-p1+1);

    var x2 = x1 + string_width_ext(keyword,sep,w);
    var y2 = string_height_ext(string_copy(str,1,p2),sep,w);

    //debug的时候可以画一个识别框,用来根据字体进行微调
    //draw_rectangle_color(lx+x1,ly+y1,lx+x2,ly+y2,c_dkgray,c_dkgray,c_dkgray,c_dkgray,true);

    var link_inst = instance_create_layer(0,0,"Hyperlink",obj_message_hyperlink);
    with (link_inst){
        self.x1 = lx+x1;
        self.y1 = ly+y1;
        self.x2 = lx+x2;
        self.y2 = ly+y2;
        self.keyword = keyword;
        self.twin = noone;
        self.desc = global.kwdic[? string_lower(keyword)]
    }
}

然后是文本数据和相应字典的格式参考

"Hello, $captain$. How can I help you today?"
"$Nova 9000$."
"$IDNV Spirit Director X-927$. $Sol System$."
"Indienova is based in China and trying to help $indiegame$ developers from all over the world to publish their games to Chinese market."

dic[? "captain"] = "oh captain, my captain"
dic[? "nova 9000"] = "special assistant of this spaceship"
dic[? "idnv spirit director x-927"] = "spaceship for making indiegames, owned by indienova"
dic[? "indiegame"] = "indiegame is indiegame"
dic[? "sol system"] = "The Solar System is the gravitationally bound system comprising the Sun and the objects that orbit it, either directly or indirectly Of those objects that orbit the Sun directly"

总结一下,gms的gui实现是个大坑,自己做的时候还是应该结合项目量力而为。主要很多很小很特殊的功能,可能用别的引擎的时候没什么难度,进到gms可能就会很麻烦。像这个关键词超链应该大部分人想想就能写出来不同的实现,但是实际上就比较浪费时间,我也是之前踩了一个draw_text_ext的坑之后才改对的。所幸gms的体量很小,所以多么鬼畜的实现途径基本都是可以容忍的。

虽然gms坑那么多,但是有什么办法,它就是屌啊(滑稽

Image title


(转发自:原日志地址
请教点GUI方面的问题,关于DRAW GUI耗费的性能是否比直接做成背景贴图要大很多?
Rusty 2018-03-23

如题,在设计GUI时因个人喜好原因,给画面上下加了很大的边框,于是问题来了:

1.直接将一个宽度为360,高度为100左右的图片素材作为GUI素材绘制(色彩比较少所以实际并不算大),是否比直接通过内置的绘图程序绘制大面积的色块区域,然后再导入边角装饰的线条之类,耗费的性能大得多?如果有差但差别不大的话我就打算直接用简单粗暴的方法搞算了……

2.如果直接将这部分直接贴到背景图层上,耗费的资源是否要比通过DRAW GUI绘制要小得多?(啊嘞?背景图层能不能放到实例图层上面来着?忘记了……)

以上,望知道的大佬解惑,手动比心

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册