GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

190 信息 1082 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

请问GML运行代码有顺序吗?

yishalee 2017-08-10



比如如下步事件代码来实现按住AD键则左右行走,不按则站立:正确的代码

而我认为上图红圈位置代码移动到代码页上部也是可以的。于是如下:错误的代码

然而运行起来发现第二张图代码有问题:按住A或D行走时,人物sprite不停地在两个sprite之间切换。于是人物闪啊闪。

我想知道问题在哪里呢?如果说GML每一步是先把代码从上到下计算完,所有变量以最终的赋值为准,那么第二张图代码应该没问题啊。还是说它不是这么算的,于是电脑不知道该听谁的?


不知道谁能帮我解答一下,或者说哪里有相关资料。谢谢。





近期喜欢的会员

 
yishalee 2017-08-11


球解惑。

 
eastecho 2017-08-11

yishalee 我还没时间玩 GMS,不过看第二段代码,好象是在循环内,每次都先更改为站立状态,然后才去判断按键。

那么在判断按键之前,总会先设置站立,然后才去设置相应的行走,这不正好就是你出现的问题:闪动么?

另外第一段,觉得这样好一些:

if KeyPressed('A') {
    directionChangeTo('LEFT');
    speed = -1;
} else if KeyPressed('D') {
    directionChangeTo('RIGHT');
    speed = 1;
} else {
    directionChangeTo('STAND');
    speed = 0;
}

move();

抱歉,我并不写 GML,也没去了解它的运行机制,所以仅供参考啦。

 
茶多酚 2017-08-13

第二张图运动速度是否正常?sprite站立的话dx应该是0的,按说step应该是整段算完才会输出的,这个step下面还有别的代码么?

dx=0;
sprite_index=sprite0;
if keyboard_check(ord("A")){
sprite_index=sprite1;
dx=1;}
x+=dx;

试了下如果if正常执行的话开头的东西应该不会影响的,是不是你其他地方有什么会影响state状态的东西?

 
yishalee 2017-08-16

eastecho  茶多酚  多谢帮助,这个问题终于弄明白了。首先GMS是先把代码运行完再把最终结果画到屏幕上,这样看来两张图的代码都没有问题。

的确,问题不在这里。问题是我的行走图有4张子图(即spr_player_walk的image_index最大值为3),而站立图只有一张子图(即spr_player_stand 的 image_index最大就是0)。GMS里当改变一个object的sprite的时候,image_index(需要让电脑显示第几张子图)是会继承过去的,但是如果当前image_index超过了新sprite的最大image_index,则image_index会归零。

当我按住一个方向键,walk的image_index会每一帧都增加0.05,只要他小于1,则画出来的都是行走图的0号子图。知道有一步这个值超过了1,那么这一步结束后画出来的就是行走图的1号子图。但是下一帧在代码开头sprite换成了站立图,由于站立图只有0号子图没有1号子图,所以image_index在这一行代码里被归零,于是每隔若干步小人会有一瞬间行走图的1号子图,然后下一步立刻变回0号子图。

 
顺子 2017-08-17

yishalee 原来如此,又学到了……

 
骨折好少女 2017-08-17

按照事件顺序再安装代码上倒下的顺序然后还有实例的运行顺序

 
yishalee 2017-08-21

是的,关于运行顺序这块以后还要深入了解一下。 骨折好少女 

 

加入 indienova

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