GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

159 信息 725 成员
游戏开发工具 GameMaker Studio 2 的讨论小组
GameMaker Studio 2小组导航 :介绍、愿景、内容
Linpean 2017-10-27

我最近半年开始学习GameMaker Studio 2(以下简称GMS2),向往着变成一名独立开发者,同时也在了解GMS2的引擎操作,阅读F1帮助文档,趴教程。可以说 GMS2 的中文用户很少,百度贴吧关注人数也未破万,资料很不成体系,很多前人的资料和文章都未被人整理,压在不知名的角落,我希望能够帮助其他的中文用户了解GMS2,所以建立一个快速导航,帮助大家快速开始GameMaker Studio 2的学习。

愿景和管理工作

希望大家不要在公开的帖子中留下联系方法或询问他人的联系方式,而是将有关一个话题的讨论都公开在帖子中,如果真的是要私下联系,可以使用私信的功能。我不希望看到的是一个人提出一个问题后通过私下的沟通解决了问题,而关于解决问题的过程并没有留在帖子中,无法给搜索到这个帖子的人提供帮助。

  • 希望大家不要重复发帖,将与同一话题的讨论集中到一个帖子中
  • 希望大家在发表帖子和回复之前先考虑一下措辞,事后发现错误也及时订正
  • 希望大家不要发表无价值的回复,当你只是觉得某一个帖子好的时候,请使用「点赞」功能

管理员的工作主要是维护秩序,维护的主要目标是方便他人检索和阅读信息,希望大家不要感到不满。

  • 修改帖子标题以符合帖子内容,通常会修改几乎所有帖子标题
  • 修改正文和回复中明显的错别字、将代码编辑代码块
  • 将重复的帖子导向讨论更多的帖子,并移除新的重复的帖子
  • 删除重复或无意义的回复,删除不当内容

导航模块

  • 快速索引社区:国内比较大的GameMaker中文社区和推荐的QQ群
  • 求助:提出你在使用过程中遇到的问题,寻找需要的功能和插件,管理员会不定期整理QA内容,防止日经QA
  • 开发:讨论与游戏开发有关的话题,或发布你自己开发的游戏
  • 分享:原创文章、资料汇总、翻译自官网的文章和文档

快速索引社区

  1. Yoyogames官网
  2. GMS2官方文档
  3. GMS2文档红色激情汉化版
  4. GameMaker开发者之家(维护中)
  5. GameMaker百度贴吧
  6. GameMakerStudio2 Wiki(正在创建中)
  7. GameMaker开发者之家QQ群:235271204
  8. GameMaker:Studio2 菜鸟群:102797189
  9. GameMaker:Studio2入门小站

求助整合

  1. 官网如何购买,如何注册?
  2. 国内更新太慢,怎么办?


开发

    待续

[ 分享:入门 ] Make an RPG:开始我们的RPG之旅
Linpean 2017-10-23

文档说明

本系列是油管上的HeartBeast[Beginner] Make an RPG课程的中文笔记,主要形式是截图的方式进行步骤上的说明。

由于原教程是基于GMS1版本的,我这里是用GMS2版本进行制作的,界面和部分函数都有变化,有错漏的地方,请参考原视频和官方帮助文档。接触GameMaker时,苦于国内没有完整的一个RPG教程,诺娃上的青铜的幻想GameMaker: Studio 中文教程可惜因为作者的工作,没有持续更新下去。而红激的教程也是以FC上的小游戏为切入点,只好上油管,HeartBeast的教程很丰富,有平台跳跃、射击、也有角色扮演。

面向对象:GameMaker新手,以学习一门脚本编程语言,制作一个RPG游戏为目标的爱好者。

主要包括以下内容(蓝色标识已完成,目前进度 :18/30):

相关参考资料:

  1. GMS官方说明文档
  2. [Beginner] Make an RPG--HeartBeast
  3. GameMaker: Studio 中文教程--青铜的幻想
  4. GMS2官方中文教程系列--顺子
求GMS2本地化教程
q531620267 2019-12-11

找了一晚上本地化的教程,无奈看到油管有,但是是几年前的GM8的,而且也看不懂,哪位大佬可以出一个GMS2的教程,或者说下流程和实现思路。万分感谢!!!!

【兼职招聘-长期】要求有丰富的GMS web game开发经验
zhjtmp 2019-12-10

We are developing online lessons which requires H5 based games as lesson exercises.
We are looking for programmers with rich GMS development experience, especially on H5 module.

Best to have commercial GMS web games development experience and be able to showcase the games online.

Please get in touch if you are interested.

qq: 2718839677

Thanks

星的灯光系统上线了~ 我的游戏《星空外传:无尽的永恒》
EggCooked 2019-10-06

Image title

第一次在这边发消息哈哈哈~,好冷清的小组啊



GMS2 图像模糊
notlsd 2019-09-15

无论怎么调整,sprite 的图像都很模糊。

尝试过使用不同分辨率的原图;也尝试过 Option 里的各种设置;Windows 和 Mac 也都试过。

有人遇到类似的问题么?



Debuger bugs on Mac
notlsd 2019-08-30

GMS2 for Mac 的 Debuger 无法正常工作 

提个关于GMS2里的depth的问题
elfsimon 2019-08-19

我是超级新人。我看GMS2的教程和油管上的教学,解决的都是object的遮挡关系,但类似室内的墙壁这种,我希望用tile层来画,层的遮挡怎么处理呢?也能用depth来解决吗?



寻合作,提供音乐音效,超超超低价,先到先得!先到先得!!
cristine 2019-08-12

专业音乐制作人,可做音乐音效,声音设计,重度游戏患者,寻有趣项目,希望一起参与!价格不是问题,考虑到工作量有限,先到先得!

加wechat:18513348758

独立游戏工作室招人
秦谦nbnb 2019-08-08

工作室简介:惊堂木工作室现已有六名成员

阵容为一个策划一个程序两个美术以及两个音乐音效。

目前在做的游戏:一个赛博朋克背景下的横版推理类游戏,游戏画面为像素风。

招募队友:美术(动作,cg,地图)具体画风最好可以按目前已经做出来的画,当然其他画风假如很赞的话,也可以改变画风

程序:这个游戏程序难度不大,其次详细的美术和策划资源还不完善,暂时不着急,可以稍等一段时间的程序老哥也可以联系我。

策划:剧情向游戏,所以策划需求不大,主要招募剧情编剧,有编故事能力的编剧像策划可以来试试。

注:线上合作,用❤️发电嗷

联系方式:324/109/5166

sprite_duplicate() 无法正常工作
notlsd 2019-05-22

有人遇到相同的问题么?

【译】浮岛物语(FORAGER): 在 GameMaker 中做优化
顺子 2019-05-20

原文地址:Forager: Optimization In GameMaker | Blog | YoYo Games
关于作者: 一年多以前,Gabe “lazyeye” Weiner 发现了开发游戏的乐趣,这种乐趣迅速转化成激情并促使他从大学辍学开始全职进行游戏开发。之前他发布了一系列游戏工具和一些 Game Jam 作品, Forager(浮岛物语) 是他第一个商业作品。你可以关注他的 Twitter来跟进他的日常工作情况,也可以在 Steam 上直接购买 Forager(浮岛物语) 。


Forager 是如何管理成千上百个实例的

有些时候,你很幸运有机会在项目启动时就参与其中,这样可以对你的代码库有更全面的了解和掌控。但另一种情况是,你需要接手一个比较复杂的,将近 50000 行代码的项目然后被告知“搞定这个问题”。嗨,我是 lazyeye ,Forager的程序负责人。

在我成为这个游戏的程序负责人之前,我就定下了一项任务:优化。Forager 是一个规模庞大的游戏,玩家可以在巨大的地图上收集资源并制作各种装置,这意味着游戏中很容易就会出现 5000 个实例同时运作的状况,甚至更多。这种特殊的游戏类型会遇到一个常见的优化难题——玩家具备创建几乎无限实例的能力,而我们还要保证游戏可以在所有的平台上顺畅运行。

实例数量过多是 GameMaker 制作的游戏中常见的一个问题;几乎在所有我参与过的项目中,过多的实例数量都是给性能拖后腿的一环。通常人们会陷入使用对象而不是去学习更有效率的工具的陷阱,比如:粒子系统(particle systems),数据结构(data structures),素材图层(asset layers)等等。了解如何使用这些方法应对不同场合其实非常重要,因为这样可以提升性能并让一些复杂的工作变得更加简单。比如某些物体不会移动,也不需要根据深度进行排序,也没有任何碰撞事件,那就不该用对象来实现它。

但是,Forager 很不一样,它与我见过的大多数项目不同,游戏中几乎每一个物体都应当以实例来实现,并且尝试不用实例来完成类似的效果简直是一场噩梦。这让人非常沮丧,这让我意识到我必须卷起袖子然后跳出这个框架重新思考一下。

Image title

我说的大量实例……是真的超级多!

绘制优化

因此,我们坚持使用了实例。但是仍然有许多方法可以改进每一帧运行的代码性能。性能下降通常源于对绘制方法的工作原理不够了解。不幸的是,这个问题对我而言非常超纲(我并不是专家),但一些基本的理解还是有助于避免一些常见的问题。

你之前可能听说过“指令集中断(batch breaks)”,一个指令集(batch)指 GameMaker 发送给 GPU 的一组用于绘制画面的指令。GPU 在绘制成组内容时非常高效,但当发送到 GPU 的指令集过多时,在指令集直接切换的时间就越多,从而影响了性能。每当更新 GameMaker 的绘制配置时都有可能发生指令集中断,比如在修改颜色/Alpha,字体,混合模式等时,以下是一些常见的“指令集断路器

  • Primitives (draw_rectangle, draw_circle, draw_primitive_begin, etc.)
  • Surfaces (surface_set_target, surface_reset_target)
  • Shaders (shader_set_target, shader_reset_target)
  • Draw settings (draw_set_font, draw_set_colour, etc.)
  • GPU settings (gpu_set_blendmode, gpu_set_alphaenable, etc.)

这种指令集中断是难免会遇到的,不同平台的处理方式也有差异。而关键是要仔细构建代码尽量减少这些中断的发生。通常情况下,我们可以通过将类似的指令集组合到一起来进行优化。比如,与其让大量实例各自采用以下绘制事件(Draw Event):

// Outline
shader_set(shd_outline);
draw_self();
shader_reset();

你可以尝试在一个控制器对象中统一完成此类操作

// Instance outlines
shader_set(shd_outline);
with (par_outlined) {
  draw_self();
}
shader_reset_target();

深度顺序的差异时常会影响这个操作,有时候会使得画面看起来异常。你可以使用图层脚本来进行辅助,更精确地控制图层绘制的先后顺序从而进行优化。

步(Step)事件优化

优化步事件需要不断扪心自问:“这个操作需要每一帧都执行吗?”通常情况下,我会反复思考这个问题几次,刚开始答案总会是“没错,这个操作必须每帧都执行”,但可能到了第八次时就会变成“哦,那个法子可能行得通。”

实例需要每一帧都从全局的数据结构里获取信息吗?也许你在创建(Create)事件里执行一次就够了。你会在步事件里不断刷新玩家的背包吗?也许只需要当发生添加或删除操作时更新一下就行了。没有以上状况需要处理?也许根本没人在意这些代码是不是隔几帧执行一次。

还有一个小技巧是利用 GML 的短路(short-circuiting )特性。这是 GML 里当获得一个 FALSE 后决定是否停止继续执行后续代码的机制。 比如以下这个例子。

if (1 + 1 == 3) && (instance_place(x, y, obj_enemy)) {
  // stuff
}

由于 1+1 不可能等于 3,因此 GameMaker 根本不会去判断 instance_place的调用。因为判断条件里使用了&&因此两个条件必须都为 TRUE ,因此当第一个条件为 FALSE 时则整个条件不可能返回 TRUE。因此你可以在制定判断条件时控制好顺序,如果你确定某个条件比其它的都重要,那务必把它放在最前面!另外要注意哪些条件最容易返回 FALSE ——当你前五个条件几乎总是 TRUE ,后面跟一个经常出现 FALSE 的条件时,那前面那些判断就都是在浪费时间。

更进一步:动态加载实例

这些优化机制都很棒,但是对于浮岛物语而言,我们真正需要的是一个“宏观”解决方案。作为一个优化者,你的工作是骗过玩家,让他们以为某件事情正在发生即可,而实际上可以把很多东西藏到幕后去处理。这种技巧是优化的基础:再聪明的玩家也想象不到游戏里的处理机制,而只能基于自己看见的内容进行理解。

虽然我们已经确保了所有的实例都是必须的,但这不意味着每一个实例都是那么关键。以“objTree”为例,当玩家和它们发生交互时,树木需要处理深度排序,具备碰撞效果,还有各种视觉效果。但是,如果玩家必须靠近树木才能进行交互,那我们在 95%的状况下可能都不用去实例化这棵树。如果一棵树在森林里消失了,但玩家并没有站在边上看到这一切,他们会在意这些吗?

这需要让我们的动态加载系统来进行处理了。如果玩家看不见某个实例,我们就可以将其停用。如果玩家移动到可以看到该实例的位置,我们可以在它出现在视野里之前就迅速激活它。下面这个 GIF 图再现了这个过程——白色矩形表示了我们的视野区域,在该范围以外的实例会被临时禁用进行动态加载处理。

Image title

注意边界位置

一些实际代码

下面这个CullObject的脚本代码,就是用来在步事件中检测活动的实例是否需要被暂时禁用

Image title

所有的截图代码的高亮风格都基于TonyStr的 Dracula 主题

我们把需要动态加载的对象作为参数传入,来检测该实例的图像是否在视野之外。如果在视野外,我们创建一个数组来保存这个实例的 ID 和边界框(Boundary box ),然后把这个数组塞进记录停用实例的列表里。要注意这里的边界框是基于精灵图像缩放绘制的尺寸,而不是基于实例的碰撞盒。我们添加了少许的缩放,因为浮岛物语中偶尔会基于某些变量绘制稍小尺寸的图像。

下一个脚本——ProcessCulls用于把停用的实例“恢复

Image title

注意:浮岛物语中实际使用的这些脚本中会有更多内容,但是为了方便演示,我把这些脚本都脱水只保留了核心代码

这个脚本里我们只是处理停用实例列表,检测相机视野是否移动到了能展示出某个实例的位置,如果是就立刻激活该实例并将相关数据从列表中删除即可。

等一下,我搞砸了

当我把以上修改代码推送到代码库后不久,我想到“嗯,我需要知道游戏里有没有用到instance_existsinstance_number和其它实例函数,这些代码可能会因为实例被停用而出纰漏”

我立刻搜索了instance_findinstance_exists和 instance_number这些关键词,然后看到了 500 多行结果。

糟糕…

这个状况非常棘手——这些函数将无法返回正确的结果,因为这些函数只能作用于激活状态的实例。如果游戏中一直在使用这些实例函数处理相关逻辑……那在动态加载中被禁用的实例就会出大问题。

但我没有放弃,我决定在动态加载系统中再增加一层判断。我需要一个方法来检测实例是否存在,无论这个实例是否处于激活状态。我还需要获得所有这些实例的准确数量并能快速检索它们。处理instance_exists函数将是一个挑战,这个函数我们可以传入三种类型的参数—— ID,对象名称或者父对象名称

真·实例 函数

第一步是在创建一个可以动态加载的实例时把它添加到一个全局的数据结构里:

Image title

我们把这个实例的 ID 添加到我们的实例缓存列表中。接下来,我们遍历所有可能的父对象 ID 数组,检查该实例是否是某个父对象的子对象。如果是,我们把它的 ID 也添加到这个父对象的实例列表中。这是因为 GameMaker 中,当我们把一个父对象属性的实例作为参数传入某个实例函数时,这会影响到这个父对象所有的子对象,因此我们的脚本中同样需要实现这一点。

接下来,我们需要在销毁实例时从缓存中释放掉相关资源,因此在清理事件(Clean Up)中需要以下内容:

Image title

这跟之前的过程刚好相反

现在我们的实例已经创建好了,我们需要准备好我们用来替换的函数。

Image title

你可能已经注意到了,在所有这些函数中,同时兼容了不属于我们用自定义的“真·实例”系统所处理的实例函数。请记住,在程序中有 500 多处相关代码,因此我试图尽可能节省时间。可以快速进行查找和替换这一点至关重要。

Image title

现在我们可以看到这个激活变量的用途——这样一来我们就可以在结果返回之前就确认这个实例是否处于激活状态,如果不是,那就可以将其激活并在临时激活列表中加以记录。但是我们并不会将其真正激活,这样我们就可以很好的区分出真正被激活的实例和那些临时激活的实例。

在返回结果之前临时激活实例是很有必要的,因为这样就可以在实例被恢复之前就通过代码来修改其中的一些值。在 GameMaker 中被停用的实例只能从中读取值而不能直接写入修改。而在一个理想的系统之中,这种激活状态应该是可选的,但因为我需要保持参数格式不变以兼容系统原有的实例函数,因此我把激活状态设为必要的前置条件了。

终于,我们在TrueInstanceExists可以通过检测传入参数是否大于 100000 来确定这是不是一个实例或对象 ID ,而TrueInstanceFind可以用来确保在返回某个实例之前先将它激活。

Image title


最后,我们必须停用掉我们临时激活的实例,这里会有一个小问题—— GameMaker 在每一个步事件(step)和绘制事件(draw)之间会重建事件队列。这意味着我们必须确保我们的控制器对象在每个事件里都运行以下脚本,否则我们可能会遇到某个实例在不恰当的时机试图触发它的某个事件。

Image title


再快一点

回想一下我最开始说的,我们必须反复质疑我们步事件中的代码是否需要每一帧都运行?这同样适用于此——宏(macro)。SYSTEM_CHECK_INTERVAL,它控制着我们的系统级脚本(比如动态加载机制)的运行频率。其中的脚本会根据特定系数来进行调控,比如,在控制植物生长的系统脚本中,增长值将根据我们的间隔系数进行增长。如果系统每 20 帧刷新一次,则增长值将以 20 为单位进行增长 。我们把需要控制的脚本放进一个 switch 循环,这可以把这些操作平均分配到 20 帧里去。

Image title


结语

Image title

游戏优化是个极其庞大的话题,我们在这里只是讨论了其中的一部分内容。实例数量是影响大部分项目的一个方面,在 GameMaker 引擎里,正确理解纹理渲染的机制和其它一些游戏开发过程中的问题,对于优化游戏至关重要。

但是,类似“不要太早优化你的游戏”这种建议仍然非常有道理。在你明确自己的游戏有性能上的问题之前,没必要过分担心性能问题,并因此妨碍了开发进度。事实上,GameMaker 对于用它制作的那些游戏而已非常合用——大部分开发人员永远都不需要担心这些问题。

也就是说,如果你最后做了一个体量巨大的游戏而面临重大的性能问题,我支持你充分调动智慧和好奇心,进行各种试验和研究。

或者,你懂的,来找我吧 ;)

(转发自:原日志地址
北京独立游戏团队诚寻美术同伴!有追求的小伙伴请随时勾兑~
ethliu 2019-03-13

坐标北京,团队配备有资深策划一名、美术策划剧情全能的程序一名、发行商务一名、兼职美术好友若干

目前寻求可全职一起讨论和工作的美术伙伴一名,有偿~

我们做游戏的目的是追求优质的游戏体验,欢迎有同样追求自我追求的美术小伙伴前来勾兑勾兑!!

随时联系我都可以~ QQ: 139103270

译:[GMS2] SEALS OF THE BYGONE中随机生成平台游戏关卡的方法
highway★ 2019-02-23

作者:Logan Foster
译:highway★

Image title

游戏体验的多样性是Roguelite游戏的支柱之一。算法生成的关卡,从平台游戏的角度来说,存在很多挑战,对于刚入手GMS的新手来说也比较复杂。比较折中的方式是将预制的关卡区块链接组合在一起,下面是我在Seals of the Bygone中制作随机关卡的方法,用到了GMS2的图层系统。


摘要

从本质上说,我们要为关卡创建一些不同的区块(section)。每个区块包含子区块(subsections),其中包含我们的资产(asset)。通过使用代码来动态切换子区块的开关(on/off),我们就可以随机关卡了。(译注:当然这不如dead cells那种算法加预制的随机方法效果好,不过对于刚入坑这里的朋友来说应该也是种不错的选择,而且在区块中来控制关卡设计,也相对纯算法容易一些,比如做risk of rain类型的游戏,应该是很够用了)

Image title

我们没有在代码或外部资源中存储关卡区块信息,而是在Room Editor中创建它们,并存储在图层中,就跟做其他关卡一样。这也是我创建这个系统的主要原因,我想保留现有的设计流程,该流程基于Room Editor。


配置

第1步:创建父区块

首先,我们要为每个主要结构创建空白资产层。区块的数量并没有限制,在下面的示例关卡里,我们创建了3个区块,名为"Section1","Section2","Section3"。这些资产层基本上就相当于结构文件夹,也可以在代码中引用。

Image title

第2步:创建子区块

现在,创建子区块的其他空白资产层。这些图层将保存我们构成关卡的tile和object。这里我们将其命名为"Sub1_1","Sub1_2"等。


第3步:子区块的图层

最后,我们将构成关卡的tile、asset和object层也加入到这些子区块中。上图中,子区块"Sub2_1"是打开的,并存在"Collision2_1"和"Tiles2_1"这类图层。这些就是我们构建关卡要用到的层。

Image title

现在我们完成了所有设置,你可以切换父组的可见性,以便查看子区块的不同组合。我建议你在完成设计子区块后使用锁定功能,以确保不会意外的编辑它。


代码

我们已经搞定了关卡区块,并存储在不同的层中,现在可以来试试在关卡开始的时候随机选择哪些层了。在Room Start事件中敲下面的代码。

Image title

首先,我们定义要用于区块和子区块的前缀。我们将使用它们的名字来找到我们要用的层,请确保这些命名与你在Room Editor中的层相同。然后我们循环查看有多少不同的区块。

Image title

现在我们知道有多少区块了,遍历每个区块并查看有多少个子区块。然后选择一个随机的子区块来使用。

Image title

在决定使用哪个子区块之后,我们循环并销毁其他所有子区块(在该区块内)。最后我们通过设置层的可见性进行清理,以确保一切正确。如图,这里的图层名称是"硬编码"的,所以你需要将它们更改为你的区块包含的内容。我们可以动态的执行此操作,但这里没什么必要。

结论

完事儿了,很简单的解决方案,可以为你的关卡增添一些随机性。如果你想做一些更强大的东西,可以试试用layer_xlayer_y移动一些东西来扩展这个系统。

如果你有什么问题,可以随时联系我@rologfos
谢谢阅读!




2/23/2019
H

(转发自:原日志地址
求助帖,200毫秒内双击两次方向键进入奔跑状态
陈康 2019-01-21

部分步事件代码
/// @description 人物状态更新
#region 按键输入
CtrlArr[PRO_CTRL.Null] = keyboard_check(vk_nokey);
CtrlArr[PRO_CTRL.Left] = keyboard_check(vk_left);
CtrlArr[PRO_CTRL.Right] = keyboard_check(vk_right);
CtrlArr[PRO_CTRL.Up] = keyboard_check(vk_up);
CtrlArr[PRO_CTRL.Down] = keyboard_check(vk_down);
CtrlArr[PRO_CTRL.Fight] = keyboard_check(ord("X"));
CtrlArr[PRO_CTRL.DeputyFight] = keyboard_check_pressed(ord("Z"));
CtrlArr[PRO_CTRL.Elude] = keyboard_check_pressed(vk_space);
CtrlArr[PRO_CTRL.DeputyAction] = keyboard_check_pressed(ord("V"));
CtrlArr[PRO_CTRL.Jump] = keyboard_check_pressed(ord("C"));
CtrlArr[PRO_CTRL.Rest] = keyboard_check_pressed(ord("E"));

#endregion


JumpTrigger = CtrlArr[PRO_CTRL.Jump];//跳跃触发
IsTop = place_meeting(x,y-1,obj_land);//头顶
IsGround = place_meeting(x,y+1,obj_land);//地面
#region 垂直状态判定
switch (InitializeYState)
{
case PRO_YACTION.Stop :
if (!IsTop && JumpTrigger && (JumpMin < JumpMax))//跳跃按键和跳跃次数
{
InitializeYState = PRO_YACTION.Skip;
}else if (!IsGround)
{
InitializeYState = PRO_YACTION.Fall;
}
break;
case PRO_YACTION.Skip :
{
InitializeYState = PRO_YACTION.Rise;//上升状态
}
break;
case PRO_YACTION.Rise :
{
if (IsTop)
{
InitializeYState = PRO_YACTION.Stop;
}else if (!IsTop && JumpTrigger && (JumpMin < JumpMax))//按下跳跃且跳跃次数大于可跳跃次数
{
InitializeYState = PRO_YACTION.Skip;
}else if (Vsp >= 0)
{
InitializeYState = PRO_YACTION.Fall;//Y向上大于0,大于零在空中
}
}
break;
case PRO_YACTION.Fall :
{
if (JumpTrigger && (JumpMin < JumpMax))//按下跳跃且跳跃次数大于可跳跃次数
{
InitializeYState = PRO_YACTION.Skip;
}else if (IsGround)
{
InitializeYState = PRO_YACTION.Stop;
}
}
break;

}
#endregion


LeftHold = CtrlArr[PRO_CTRL.Left];
RightHold = CtrlArr[PRO_CTRL.Right];

SquatHold = CtrlArr[PRO_CTRL.Down];

LeftMeet = place_meeting(x-1,y,obj_land);
RightMeet = place_meeting(x+1,y,obj_land);

#region 水平状态判定
switch (InitializeXState)
{
case PRO_XACTION.Stand :
{
if (!LeftMeet && LeftHold && !RightHold && IsGround )//左边没碰到仅左键按下
{
InitializeXState = PRO_XACTION.LeftRush;
......
夜太深,脑子转不过来.如果有志同道合的人士,请赐教

下蹲移动和跳跃算是共存了

左右移动,C跳跃,下蹲,X攻击.问双击方向键的想法分享.

菜鸟学到的吐血教训:别写类似ds_list[| 0] = [ds_map1,"aaa",0]这样的代码……
Rusty 2018-12-02

因为在做一个带有卡牌要素的游戏,用ds_map和ds_list管理卡牌信息、牌序等等十分方便,于是当时就随手写出了类似ds_list[| 0] = [ds_map1,"aaa",0]这样的代码。现在想写存档系统了,结果一看教程,懵逼了。如果需要通过json_encode这种函数将ds数据转化为json,同时又是ds_map中含有ds_list或者ds_list中含有ds_map这种情况时,需要先使用ds_list_mark_as_map、ds_map_add_list等函数让ds_map和ds_list可以被正确写入和读取。而如果是前面这种ds_list含数组,数组里又含ds_map的形式,ds_list_mark_as_map、ds_map_add_list等函数貌似就不适用了,转成json来存档读档就会出错。于是乎不得不把ds连同相关的自定义function也改一遍……不幸中的万幸就是这部分代码本来就是刚学GMS的时候写的,也该优化了……

总之给同为新手的朋友一句话:如果想用json的格式来保存存档信息,就千万别因为一时方便就写成类似ds_list[| 0] = [ds_map1,"aaa",0]这样的代码,可以写成ds_list[| 0]=ds_map1; ds_map1[? "string"]="aaa"; ds_map[? "number"]=0;这样,把"aaa"、0这类写在ds_map里,才能正常用json函数创建/读取存档文件……

不过也可能有把ds_list[| 0] = [ds_map1,"aaa",0]这种函数正常转写成json的方法,只不过我太菜没注意到……

总之,供各位朋友参考了……含泪发布。

(转发自:原日志地址
【求助】steam版本的GMS2,代码中的中文显示不正常
慢好多拍 2018-11-20

Image titleImage title

如图中显示,steam版本的GMS2,中文在代码中显示为“?”,字体设置里面的中文也被显示为“?”,排除是输入法的问题。之后我即便整个汉化之后,问题还是存在,不知道有什么解决办法吗?非常感谢!


加入 indienova

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