level 11
旋转其实非常简单,在这里利用3个局部变量:len、dir和spin(所以在其他的事件中最好不要用到这几个变量)。len、dir表示该obj离旋转中心的距离、方向;spin表示该obj是否在旋转(1表示正在旋转)。这里写成两个脚本使用:
①脚本名:spin_around
代码:
//spin_around(x,y,len,dir,speed),(x,y)为旋转中心坐标,speed为旋转速度(度每步)
{
x=argument0+lengthdir_x(argument2,argument3);
y=argument1+lengthdir_y(argument2,argument3);
dir+=argument4;
}
②脚本名:spin_init(x,y)
代码:
//spin_init(x,y),(x,y)为旋转中心坐标,如不填的话则默认为中心(400,304)
{
xx=argument0;
yy=argument1;
if !xx{xx=400;}
if !yy{yy=304;}
len=point_distance(xx,yy,x,y);
dir=point_direction(xx,yy,x,y);
spin=1;
}
2014年08月24日 15点08分
3
level 11
在需要旋转的obj的step事件中,写入代码:
if spin{
spin_around(400,304,len,dir,5);
}
当你想让它们开始旋转的时候,让它们执行一下spin_init()即可。
这里在alarm[0]中写入:
spin_init();
最后在create中写入:
alarm[0]=50;
这样能转的obj就搞定了,把它扔一堆到房间里面都没问题。
值得注意的是,如果在旋转之后还有其他事件(例如扩散、收缩、飞向player之类),必须将spin设置为0停止旋转,否则obj的坐标会在step事件中被一直限制。
2014年08月24日 15点08分
4
level 11
扩展:
利用上面两个代码做出旋转的效果很轻松了,但还有更多的可发挥空间。
实例①:
将step中代码改为:
if spin{
spin_around(400,304,len,dir,dirspd);
dirspd += 0.1;
}
并在create中写入:
dirspd = 5;
即可达到越转越快的效果。
同理,对len这个变量进行同样的操作,可以达到将图形放大或缩小的效果。
实例②:
将Alarm 0中的代码改为:
spin_init();
lenspd = len / 100;
将step中的代码改为:
if spin{
spin_around(400,304,len,dir,dirspd);
len += lenspd;
}
如果想让图形保持外形缩小的话,则需要将len改变的速率设置为跟len值正相关的一个数(相似图形原理),也就是lenspd = len / (一个常数)。这个常数根据当前图形大小来决定,一般来说试试就行了。
实例③:
将Alarm 0 中的代码改为:
spin_init();
ll = len; //记录初始值
将step中的代码改为:
if spin{
spin_around(400,304,len,dir,dirspd);
len = ll + len/3*sin(t);
t += 0.1;
}
利用sin函数让半径周期性放大缩小...Zzz是时候组织一波睡觉了∠( ‘・ω・)/
2014年08月24日 15点08分
5
@332382229 那我可能是瞎写的 应该是len=ll+ll/3*sin(t)
2017年05月02日 14点05分
level 3
逻辑清晰,论述简洁!可惜我看不懂\("▔□▔)/膜拜之
2015年01月16日 07点01分
15