nikaple吧 关注:165贴子:2,320
  • 3回复贴,共1

任意形状的旋转系统

取消只看楼主收藏回复

一楼还是打老虎


IP属地:广东1楼2014-08-24 22:59回复
    旋转其实非常简单,在这里利用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;
    }


    IP属地:广东3楼2014-08-24 23:01
    回复
      在需要旋转的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事件中被一直限制。


      IP属地:广东4楼2014-08-24 23:01
      回复
        扩展:
        利用上面两个代码做出旋转的效果很轻松了,但还有更多的可发挥空间。
        实例①:
        将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是时候组织一波睡觉了∠( ‘・ω・)/


        IP属地:广东5楼2014-08-24 23:18
        收起回复