gamemaker吧 关注:13,631贴子:95,070
  • 12回复贴,共1

请问如何实现按键加减速,放开恢复速度的效果?

只看楼主收藏回复

需要实现的目的:
按住shift时,变量a,b每过1秒进行一次a-=1,b-=0.5,直到a=1.5,b=0.5
放开shift时,变量a,b停止增减,变量a,b每过一秒进行一次a+=0.5,b+=0.25, 直到a=7.5 b=3.75


IP属地:美国1楼2018-07-06 19:39回复
    Create:
    State = "move"
    Step:
    //行走
    var a = 7.5; //x移动值
    var b = 3.75; //y移动值
    //匍匐
    var c = 4.5; //x移动值
    var d = 2.25; //y移动值
    //////////////////////////////////////////////////////////////////////////////////
    //移动状态
    if state = "move"
    {
    x+=2; //滑落效果
    y+=1; //滑落效果
    //不动
    ifnot keyboard_check(vk_right)
    andnot keyboard_check(vk_left)
    andnot keyboard_check(ord("A"))
    andnot keyboard_check(ord("D"))
    {
    sprite_index= magentalittle_stand;
    }
    //左上方向移动
    ifkeyboard_check(ord("A")) || keyboard_check(vk_left)
    {
    sprite_index= magentalittle_walk;
    image_speed= 1;
    x-= a; //需要改变的值
    y-= b; //需要改变的值
    //移动时按下相反的按钮
    ifkeyboard_check(vk_right) || keyboard_check(ord("D"))
    {
    x+= a; //需要改变的值
    y+= b; //需要改变的值
    }
    //行走射击
    //需要实现的目的:
    //按住shift时,变量a,b每过1秒进行一次a-=1,b-=0.5,直到a=1.5,b=0.5
    //放开shift时,变量a,b停止增减,变量a,b每过一秒进行一次a+=0.5,b+=0.25, 直到a=7.5 b=3.75
    ifkeyboard_check(vk_lshift) || keyboard_check(vk_rshift)
    {
    state= "walkshoot";
    }
    }
    //站立射击
    //目的同上
    ifkeyboard_check(vk_lshift) || keyboard_check(vk_rshift)
    {
    state= "shoot";
    }
    //加减速代码
    //加入后没有任何影响,按shift不能减速
    if(keyboard_check(vk_lshift)) ||keyboard_check(vk_rshift)
    {
    a-= 1;
    if(a<1.5){a=1.5}
    b-=0.5
    if(b<0.5){b=0.5}
    }
    else
    {
    a+= 0.5;
    if(a>7.5){a=7.5}
    b+= 0.25
    if(b>3.75){b=3.75}
    }
    //趴下
    ifkeyboard_check(vk_down) || keyboard_check(ord("S"))
    {
    state= "crawl";
    }
    }
    //////////////////////////////////////////////////////////////////////////////////
    if state = "crawl"
    {
    x+= 2;
    y+= 1;
    sprite_index = magenta_tilt_left;
    ifkeyboard_check(vk_left) || keyboard_check(ord("A"))
    {
    x -= 4.5;
    y -= 2.25;
    if keyboard_check(vk_right) ||keyboard_check(ord("D"))
    {
    x += 4.5;
    y += 4.5;
    }
    }
    ifkeyboard_check(vk_up) || keyboard_check(ord("W"))
    {
    state = "move";
    }
    }
    //////////////////////////////////////////////////////////////////////////////////
    if state = "shoot"
    {
    sprite_index= magenta_shoot;
    image_speed= 1;
    x+= 10; //记得测试成功后改为40 后坐力
    y+= 5 ; //记得测试成功后改为20
    }
    //////////////////////////////////////////////////////////////////////////////////
    if state = "walkshoot"
    {
    sprite_index= magenta_walkshoot;
    image_speed= 1;
    x+= 10;//记得测试成功后改为40
    y+= 5; //记得测试成功后改为20
    动画结束:
    ifstate == "shoot"
    {
    state = "move"
    }
    ifstate = "walkshoot"
    {
    state = "move"
    }


    IP属地:美国2楼2018-07-06 19:40
    回复
      问题在于var声明的是临时变量,当执行完step后将被删除。就算去掉var,每step开始就使a,b,c,d为特定值,这样即使在下面对这些值更改,也是没用的,因为每step开始这些值又变回来了。应当在create中写a=xx,b=xx,......,然后在step中更改。


      IP属地:浙江来自iPhone客户端3楼2018-07-06 19:56
      回复(3)
        if keyboard_check(vk_lshift) || keyboard_check(vk_rshift)
        {
        state = "shoot";
        //alarm[0]= 90;
        a-= 3;
        if(a<1){a=1}
        b-=1.5;
        if(b<0.5){b=0.5}
        }
        else
        {
        alarm[1]= 60;
        a+=0.2;//减小此值,仍然抵消
        if(a>8){a=8}
        b+= 0.1;//减小此值,仍然抵消
        if(b>4){b=4}
        }


        IP属地:美国4楼2018-07-06 23:06
        收起回复
          因为当lshift或rshift按下是时state发生改变,变为shoot,而abcd的变化是当state为move时才能发生


          IP属地:浙江来自Android客户端5楼2018-07-07 17:50
          回复(3)
            已经搞定,其实原因主要是两个,a,b或是speed 会不会被变化后的值覆盖,以及set中alarm会无限次重置,无法执行,这个只要提前到create中就行了


            IP属地:美国6楼2018-07-09 13:38
            回复