GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

172 信息 832 成员
游戏开发工具 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官方中文教程系列--顺子
模板卷轴游戏--樱桃2
cfan_yjr 2020-09-22

故事背景

Berry带着樱桃从洞穴出来,把樱桃分发给人们。他被人们当作英雄。可是,只有他自己知道,更大的危机就要来临。因为那些绿色球是外星人的幼体。它们已经被孵化出来了,马上要重回地面了。

只有一个人能利用樱桃的力量来打败外星人:Berry!


游戏玩法

目标是到达关底,不像第一部是收集齐樱桃。全新的敌人也会登场,会有不同的行为模式。

胜利条件

完成每一关的条件是到达关底,如果玩家受到攻击,就会丢一条命。并重启关卡。只有三条命。

游戏道具

樱桃收集后,可以提高玩家的力量,让玩家有一段无敌时间。新增金币道具,用于收集后,提高玩家的分数。

玩家的控制

键盘控制。方向键,用于左右行走,上下爬梯。空格键是跳跃,ESC打开菜单,回车键为确定。

全新的敌人

绿色八爪鱼,紫色八爪鱼。

Image title

Image title

对敌人的攻击方式

这次主角不像第一部,没有手段来攻击敌人。除了吃樱桃让自己无敌外,现在还可以踩死敌人。

其他杂项

会掉落的平台,当主角接触到它,就会往下掉。

Image title


移动的平台,会来回移动。主角可以用它去一些特殊的地方。

Image title


跳跃平台,当主角在上面跳跃时,会跳得更高,从而来到更高的地方。

Image title

这些是第二部游戏主要的素材了。

(转发自:原日志地址
学习制作游戏--单屏平台游戏--游戏文档制作 1
cfan_yjr 2020-08-30

    游戏名字叫《樱桃》,在迷宫里收集樱桃。

故事背景

因为外星人的占领,樱桃,成为了一个难以获得的食物。为了能够获得樱桃,人们愿意出大价钱来购买。你听说有一个洞穴里长着许多的樱桃,为了发财,你勇敢地出发了。冒险就此开始。

游戏目标

把每一关的樱桃全部收集完,并成功撤离。在这期间,因为敌人而存在一定的危险。玩家被敌人击中三次就会失败。每次击中,玩家都会回到这关的起点。

游戏控制

方向键左右移动,上下爬梯子。空格键跳跃。ESC键,菜单功能。

敌人

他们会按照设计好的路线行进,不会主动攻击玩家。有两类,紫色和绿色。

紫色是跳跃的行动模式,来阻挡玩家。绿色则是带有一定的智力,来阻挡玩家。


游戏素材

Image title


spr_player_idle

50*64

Image title

spr_player_walk

50*64

Image title

spr_player_climb

50*64

Image title

spr_block_red

64*64

Image title

spr_block_brown

64*64

Image title

spr_ladder

64*64


Image title

spr_ball_purple

64*64

Image title

spr_ball_green

64*64

Image title

spr_cherry

64*64

Image title

spr_goal

64*64

以上素材的原点都设置在正中心。

字体,根据自己的喜好,选择一个。名称为fnt_score.

音效有5种,分别是菜单音效,目标达成音效,收集樱桃的音效,玩家跳音效和受到敌人伤害时的音效。

(转发自:原日志地址
IDE更新的问题

更新了IDE后,旧试用版IDE创建的yyp文件打不开怎么办?

太空小蜜蜂01--素材的准备
cfan_yjr 2020-08-01

游戏的故事背景

你是一个太空战士,是人类最后的希望。你的任务是保卫太空站,摧毁外星人的战舰。

游戏玩法

玩家是边射击边躲避的操作。关卡难度,逐渐递增。

胜利条件

每一关,消灭所有的敌人。如果敌人到达太空站,则游戏失败。玩家没有生命,也是游戏失败。

控制方式

玩家用方向键,进行左右移动,按空格键,攻击。ESC键,弹出菜单。

菜单

在菜单里可以,关闭游戏,重开游戏,返回游戏。


敌人

只有一种类型的敌人。左右移动,随机射击。生命值为1,攻击值为1.


打开Gamemaker Studio,新建一个工程命为Space Gala,导入游戏素材。

spr_player


50*43的大小,参考点设置在中心。碰撞图形为默认的矩形。名称为spr_player

spr_bullet_player


16*16的大小,参考点在中心。碰撞图形为矩形。名称为spr_bullet_player

spr_life

16*16的大小,参考点在中心。名称为spr_life

spr_enemy_red


16*18的大小,参考点在中心。碰撞图形为矩形。名称为spr_enemy_red

spr_background

256*256的大小。这是游戏背景。名称为spr_background.

还要建立两种字体文件。fnt_score,大小为14,字体为Arial,fnt_message,大小为14,加粗。

把原来房间重命名为rm_level_1,把游戏背景添加上去。如下图所示

游戏背景添加

这样,太空小蜜蜂的游戏元素就差不多都准备好了。

(转发自:原日志地址
[GMS2分享与求助]place_meeting和physics_test_overlap的差异

由于正在制作一个需要调用物理引擎平台跳跃游戏,尝试把非物理引擎下的平台跳跃系统重写进物理引擎下

在写状态机的时候遇到了place_meeting和physics_test_overlap的差异引起的问题

帮助手册的“Collision Checking”页面里的“Physics Collisions”标签下写到“When using the build in physics, the above collision functions are not guaranteed to work for physics enabled instances. This is mainly due to the fact that these instances no longer use the majority of the regular built in variables (instead, physics enabled instances have their own set of variables) and neither do they use the collision mask or bounding box, as they use fixtures instead. ”,简单来说就是因为物理object会使用fixture而非collision masks或bounding box,因此place_meeting等常用的Collision Checking命令无法很好地运行,实际强行使用也确实会出现一些运行不正常的情况(没有保存不正常例子的gif)

因此在使用物理引擎的情况下要进行Collision Checking,手册中仅提到了使用physics_test_overlap

单独建了一个实验室工程来说明问题

*以下代码中的obj_StaticParent指的就是蓝色方块

Image title


如上图所示,当使用代码

if physics_test_overlap(phy_position_x,phy_position_y+1,0,obj_StaticParent)

phy_speed_y = 0;

来判断白色方块是否站在蓝色方块上方时,由于右边方块与右侧的蓝色方块发生接触,physics_test_overlap的返回值为true,因此触发了phy_speed_y = 0,而左边的白方块则正常落到蓝色方块上后才触发phy_speed_y = 0

Image title


如上图,而如果用

if place_meeting(x,y+1,obj_StaticParent)

yspeed = 0;

来写判断白色方块是否在蓝色方块的上方,则会不会因为白色方块右侧紧贴蓝色方块而触发yspeed = 0,仅在下方接触到蓝色方块后触发yspeed = 0

Image title


同理在水平方向上,如上图

当使用

if physics_test_overlap(phy_position_x+1,phy_position_y,0,obj_StaticParent)

phy_speed_x = 0;

来判断白色方块是否在右侧碰撞到蓝色方块时,下面的白色方块会因为接触到了在下方的蓝色方块而返回true,进而phy_speed_x被赋值为0

Image title


如上图,如使用

if place_meeting(x+1,y,obj_StaticParent)

xspeed = 0;

来判断白色方块是否在右侧碰撞到了蓝色方块时,不会因为下方接触到了蓝色方块而返回true,能够正常使用

由以上实验可以判断出,physics_test_overlap命令会判断两个实例的fixture是否会“接触”,即fixture和fixture紧贴着而没有任何像素发生重合也会判断为true,

而place_meeting则会判断两个实例的collision masks或bounding box是否会“重合”,即两个实例仅collision masks或bounding box发生了重合才会返回true,否则即使是两个实例相距0像素紧贴在一起,返回值也会是false

这就是我发现的两个命令的差异

以下就是我遇到的问题

我原本写状态机的时候使用

if place_meeting(x,y+1,obj_StaticParent)

MyState = myState = playerstate.onGround;

来实现当玩家控制的object站在地面上(即判断下方1像素的位置是obj_StaticParent)则让状态机进入onGround状态

我在物理系统中替换成

if physics_test_overlap(phy_position_x,phy_position_y+1,0,obj_StaticParent)

MyState = myState = playerstate.onGround;

Image title


这种左右侧紧贴着墙壁的状态也会被认为是onGround,即使下方根本没有接触到obj_StaticParent

同理判断左右是否贴墙的时候也会受到上下影响

由于我没有系统的学过编程,除了对代码不熟悉以外更重要的就是缺乏程序员思维,这让我在遇到这个问题以后是在想不出变通解决之道,希望大佬不吝赐教

[求助]GMS2的物理引擎是否是“连续”的?

题目表述的不是特别清楚,我用下面一张图来解释一下我的疑问

Image title


上图中room启动了物理引擎,白色和蓝色方块均为物理物体

白色方块最初的移动和跳跃分别通过调整phy_speed_x和phy_speed_y来实现

在跳跃起来后通过physics_pause_enable(true)命令来暂停物理引擎

之后通过调整白色方块的坐标来实现移动

再使用physics_pause_enable(false)来取消物理引擎的暂停效果后,可以看到白色方块会回到暂停的位置,保持暂停时的运动状态继续运动

如果尝试不修改整个room的物理状态,而是通过phy_active来关闭白色方块本身的物理状态,则如下图

Image title


白色方块在空中使用phy_active = false来离开物理计算

但这时修改白色方块的坐标(即修改x和y值)无法使白色方块移动

使用phy_active = true后白色方块保持之前的物理状态进行运动

由以上一个实验我产生了一个疑问,GMS2的物理引擎是否必须是“连续”的?

在阅读物理引擎的官方文档里,发现对物理的介绍提到过一句“Normally for a physics simulation to work, it must be continuous and cannot be stopped and started, or have instances suddenly moved from one place to another in the room.”

是否这就意味着我无法在游戏的部分过程中使用物理引擎来简化一些复杂运动的代码量(比如使用钩锁钩住移动的天花板,还可以调整钩锁长度的单摆运动),而部分简单运动则使用坐标相关代码?

我原本打算制作一个平台跳跃游戏,角色可以使用钩锁钩住墙壁或天花板来做单摆运动越过障碍,我也尝试过使用圆的方程来还原,勉强能够实现单摆运动,但如果钩住的天花板会移动,以及钩锁的长度可以在单摆运动中变化,按我现在的能力不用物理引擎还真写不出来,于是想到了在钩锁部分使用物理引擎来简化计算的方法,结果就像上图那样难以实现

我也尝试过纯粹使用物理引擎来写这个游戏,而且由于碰撞检测不再需要自己写代码,代码量减少了很多,然而……

Image title


Image title



由于使用了物理引擎后会计算object在碰撞后的角速度,或者站在悬崖边上时向下掉落的角速度(即使角度阻尼值写得很大也无法避免),如果加载画好的人物sprite就会变得很诡异

Image title


我也尝试过使用draw命令来避免人物sprite角度乱动的状态,但是由于物理引擎还是会计算站在悬崖边上时object向下落的情形,当站的过于靠边的情况下还是会出现运动轨迹诡异的情况

Image title


在尝试了很久也阅读了游戏的帮助文档以后确实找不到解决办法,因此想要请问各位大佬,GMS2里是否确实无法让物理引擎“不连续”?

初次打开GMS2进行登录时的网络错误求助

已经注册好了YOYO games的账号,但是到GM上发生了网络错误,怎么解决?

关于GMS2的Joint的若干问题求助

我在room中创建了一个控制object“obj_Control”,并建立了一个Create事件,代码如下


var instA = instance_create_layer(200, 150, "Instances", obj_Floor);

var instB = instance_create_layer(50, 200, "Instances", obj_Circle);

r = sqrt(power(instA.x-instB.x,2)+power(instA.y-instB.y,2));

var jointA = physics_joint_rope_create(instA, instB, instA.x, instA.y, instB.x, instB.y, r, true);


即在room中创建了实例A和实例B并通过Joint将两者连接在一起,这一步运作是正常的,运行后实例A和B被创建并被正确连接

之后我遇到两个问题

问题1:删除joint

如果我在Create时间结尾加入命令physics_joint_delete(joint)来删除Joint,即下方


var instA = instance_create_layer(200, 150, "Instances", obj_Floor);

var instB = instance_create_layer(50, 200, "Instances", obj_Circle);

r = sqrt(power(instA.x-instB.x,2)+power(instA.y-instB.y,2));

var jointA = physics_joint_rope_create(instA, instB, instA.x, instA.y, instB.x, instB.y, r, true);

physics_joint_delete(jointA);


房间在创建的同时joint会被删除,实例A、B不会相互连接

但如果我给obj_Control添加“按下P键事件”,并输入代码


physics_joint_delete(jointA);


在运行后会提示无法读取jointA的变量因此发生错误,我也无法实现“按下P后删除Joint”的目的


___________________________________________

############################################################################################

FATAL ERROR in

action number 1

of Key Press Event for P-key Key

for object obj_Control:

Variable obj_Control.jointA(100009, -2147483648) not set before reading it.

at gml_Object_obj_Control_KeyPress_80 (line 8) - physics_joint_delete(jointA);

############################################################################################

--------------------------------------------------------------------------------------------

stack frame is

gml_Object_obj_Control_KeyPress_80 (line 8)


想要知道出现这种问题的原因是什么,我想要实现“按下P后删除Joint”的目标应该怎么做?

问题2 修改joint参数

与问题1类似,我无法通过在按下按键P事件中添加代码来操纵joint,而如果我在obj_Control的Create代码末尾增使用physics_joint_set_value函数修改joint参数的代码,比如修改Rope joint的最长长度,代码如下:


var instA = instance_create_layer(200, 150, "Instances", obj_Floor);

var instB = instance_create_layer(50, 200, "Instances", obj_Circle);

r = sqrt(power(instA.x-instB.x,2)+power(instA.y-instB.y,2));

var jointA = physics_joint_rope_create(instA, instB, instA.x, instA.y, instB.x, instB.y, r, true);

physics_joint_set_value(jointA, phy_joint_max_length, r+10);


在运行后会发现实例A和实例B没有成功被连接,删除physics_joint_set_value函数后一切正常,想要知道这是什么原因?

学习制作游戏--Card Game
cfan_yjr 2020-03-28

这个游戏开发中,我们需要先做一个游戏开发文档,用来描述游戏规则,目标和原理,可能的话,也可以添加游戏背景,角色描述等内容。

规则

  • 游戏是有时间限制的,玩家需要在时间用完前完成目标。
  • 玩家一回合只能翻开两张。
  • 纸牌匹配的条件是前面的图形是一样的。
  • 如果玩家发现了所有的纸牌,游戏就结束。
  • 如果时间用完,游戏就结束。
  • 玩家可以在任何时候重置游戏,重新开始游戏。

记忆纸牌的逻辑流程

从上面的游戏规则上,我们需要实现下面的内容:

  • 纸牌:游戏的要素。可以翻,有两面和不同的类型。
  • 桌面:收集纸牌。
  • 时间:计算用时,可以重置。
  • 游戏控制者:一个对象,用于检查规则和胜利条件。

GameMaker:Studio 2上我们用鼠标点击进行翻转纸牌。当纸牌翻过来后,记录下图形用于和第二个纸牌比对。第一个纸牌将显示正面直到点第二个纸牌。翻译成GML的代码就是,我们需要一个obj_card 游戏对象设置两个事件。

  • Create:纸牌初始化参数信息
  • Left Pressed:写入翻转和选择的代码

首先,我们要有几个纸牌素材,8个纸牌的正面和1个背面。用变量0到7来代码它们。用数组来把变量记录下来。

一维数组

一维数组

二维数组

Image title

数组对于信息的整合,有很大的用处。比如,菜单,RPG状态,道具栏等。

在Create事件里添加下面的代码

1 // Initializing the main properties for a card object
2 index = noone; // the position of the card in the deck
3 type = 0; // associates the card with its sprite (0-7)
4 face = 1; // the face the card is showing (0 = back,1 = front)

这样我们就初始化了纸牌的参数。

(转发自:原日志地址
编译器
notlsd 2020-02-15

同样的代码 VM 连 Warning 都没有,YYC 编译直接崩溃,有人遇到相同的问题么?

[提问]有什么用GMS开发的比较著名名的游戏?

有哪些有名的动作游戏是用GMS开发的?我想作为参考来决定是否用使用GMS开发我想做的游戏

【小白提问】游戏中的大量文本一般都是如何导入GMS2中的?

如题……比如说存储在excel表格中吗?在哪里能够找到相关的教程呢

谢谢!

求GMS2本地化教程
月光 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 也都试过。

有人遇到类似的问题么?



加入 indienova

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