【问题标题】:How to rotate my character while jumping (Gamemaker Studio 2)如何在跳跃时旋转我的角色(Gamemaker Studio 2)
【发布时间】:2021-09-21 23:40:00
【问题描述】:

我想制作一个角色跳跃时旋转的简单动画。我正在制作一个独立平台游戏,所以我认为这应该很简单,但我对这个太新手了。 这是运动代码。

//------------------------- MOVEMENT INPUT

xMove = kRight - kLeft;

xSpd = xMove * mSpd;
ySpd += 0.65;

//------------------------- JUMP

onGround = place_meeting(x,y+1,oSolid);

if(onGround) airJump = 1;
if(kJump){
    if(onGround or airJump > 0){
        ySpd = -12; 
        airJump = 0;
    }
}

//------------------------- FINAL MOVEMENT

if(place_meeting(x + xSpd, y, oSolid)){
    while(!place_meeting(x + sign(xSpd), y, oSolid)) x += sign(xSpd);
    xSpd = 0;
}

if(place_meeting(x + xSpd, y + ySpd, oSolid)){
    while(!place_meeting(x + xSpd, y + sign(ySpd), oSolid)) y += sign(ySpd);
    ySpd = 0;
}

x += xSpd;
y += ySpd;

if xSpd < 0 dir = -1;
if xSpd > 0 dir = 1;

播放器是一个简单的正方形,所以我想让它在空中旋转 360 度。

【问题讨论】:

    标签: game-maker-studio-2


    【解决方案1】:

    您应该能够为此使用image_angle,更改该值将更改精灵的角度,并且不断增加/减少该值将模拟旋转。

    但是,请记住,如果您旋转精灵,精灵的碰撞箱也会旋转。您可能可以将 hitbox 与 sprite 分开,这样它就不会互相打断。

    示例: https://manual.yoyogames.com/GameMaker_Language/GML_Reference/Asset_Management/Sprites/Sprite_Instance_Variables/image_angle.htm

    【讨论】:

      【解决方案2】:

      对于玩家运动碰撞处理,您希望避免使用 image_angle 变量,方法是使用您自己的变量来使用 draw_sprite_ext 函数进行图像旋转。另外,如果您尝试使用 fov 而不是什么,那么通过更改,您最终会想要将图像角度用于任何可以很好地包装它的东西。

      例如

      function Scr_Player_Create(){
          image_offset = 0;
      }
      
      function Scr_Player_Step(){
          image_offset += (keyboard_check(vk_right) - keyboard_check(vk_left)) * 10;
          image_offset = wrap(image_offset, 0, 359);
      }
      
      function Scr_Player_Draw(){
          draw_sprite_ext( sprite_index, image_index, x, y, image_xscale, image_yscale, 
              image_angle + image_offset, image_blend, image_alpha );
              
          draw_text(10, 10, image_offset);
      }
      
      function wrap(wrap_value, wrap_minimum, wrap_maximum){
          // Credit: Juju from GMLscripts forums!
          var _mod = ( wrap_value - wrap_minimum ) mod ( wrap_maximum - wrap_minimum );
          if ( _mod < 0 ) return _mod + wrap_maximum else return _mod + wrap_minimum;
      }
      

      您可以采取的另一种方法来避免 image_angle 影响您的碰撞

      var _angle = image_angle;
      image_angle += image_offset;
      draw_self();
      image_angle = _angle;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-28
        相关资源
        最近更新 更多