【问题标题】:How to make an object move in relation to image_angle?如何使对象相对于 image_angle 移动?
【发布时间】:2017-07-08 14:13:42
【问题描述】:

注意:我使用的是 GameMaker 1.4,而不是 2。我不知道这是否会有所不同,但我指出以防万一。

好的,我在我的 GameMaker 游戏中遇到了一个问题,我让一个对象相对于 image_angle 上下移动。出于某种原因,它真的想像往常一样在 y 轴上移动,并且完全忽略了 image_angle。这真的很烦人,如果不解决可能会彻底改变游戏规则。

我的步骤事件代码是:

// Mouse controls.
image_angle = point_direction(x, y, mouse_x, mouse_y);

if(keyboard_check(ord('W')))
{
    y -= playerSpeed;
}

if(keyboard_check(ord('S')))
{
    y += playerSpeed;
}

我的创建事件代码是:

globalvar fuelRemaining;
fuelRemaining = 60;

playerSpeed = 3;

【问题讨论】:

    标签: game-maker game-maker-studio-1.4


    【解决方案1】:
    image_angle = point_direction(x, y, mouse_x, mouse_y);
    direction = image_angle;
    
    if(keyboard_check(ord('W'))){
        speed = -playerSpeed;
    }
    if(keyboard_check_release(ord('W'))){
        speed = 0;
    }
    
    if(keyboard_check(ord('S'))){
        speed = playerSpeed;
    }
    if(keyboard_check_release(ord('S'))){
        speed = 0;
    }
    

    【讨论】:

    • 注意:我只关注前两行,因为这就是我真正需要的......它仍然无法工作......
    【解决方案2】:

    @Gamio 代码几乎是正确的(应该是_released 而不是_release,混淆了WS 键的符号)。以下是一些改进:

    image_angle = point_direction(x, y, mouse_x, mouse_y);
    direction = image_angle;
    
    if point_distance(x, y, mouse_x, mouse_y) < spd
    {
       speed = 0;
    }
    else
    {
        var spd = 0;
    
        if keyboard_check(ord("W")) 
            spd += playerSpeed; // If pressed both W and S, then will stop 
    
        if keyboard_check(ord("S"))
            spd -= playerSpeed;
    
        speed = spd;
    
        if keyboard_check_released(ord("W")) or keyboard_check_released(ord("S"))
            speed = 0;
    }
    

    将代码放在Step End 事件中(不是Step)。

    如果您想直接更改坐标,不使用speed,也可以,但稍微困难一些(您需要使用lengthdir_xlengthdir_y 函数计算xy 增量,然后添加这些函数增量到当前坐标)。

    【讨论】:

    • 好吧,我不确定是否有必要在这里生成 var spd,以及为什么要检查密钥是否已被释放 2* 每一步,我在我的答案中以不同的方式解决了,这里不会正确使用 spd 是必要的。同样,当玩家同时按下两个键然后只释放一个(如果玩家经常切换键,这种情况可能经常发生,而玩家没有注意到),您还说有必要在结束步骤事件中使用此代码,这似乎不是真的,如果它应该阻止任何事情,那么你应该稍微说明一下我猜的问题。
    • @VojtěchŠvrček 这不是一个很好的解决方案,它只是 Gamio 代码的改进。
    • 想了这么多,只是想想人们从游戏制作者开始,它怎么会结束:p。但是,它可以工作,如果他们只是将粘贴代码复制到项目中,那么它当然会一团糟。
    【解决方案3】:

    在您的代码中,您设置了image_angledirection,但随后只更改了y 坐标,因此您当然不会看到x 坐标有任何更改。

    您可以使用内置的directionspeed 变量,游戏制作者会自动移动任何对象,或者您可以在xy 坐标上应用lengthdir_xlengthdir_y 函数。

    directionspeed 示例:

    //create event
    
    playerSpeed = 3;
    
    //step event
    
    image_angle = point_direction(x, y, mouse_x, mouse_y);
    direction = image_angle;
    speed = 0; //reset speed at start of each step event
               //now you wont have to check if key has been released to stop object
    
    if(keyboard_check(ord('W')))
    {
        //distance between player and target
        distance = point_distance(x, y, mouse_x, mouse_y)
    
        if distance < playerSpeed
        {
            //with this, object will move only to mouse position, not further
            speed = distance;
        }
        else
        {
            speed = playerSpeed;
        }
    }
    else if(keyboard_check(ord('S')))
    {
        speed = -playerSpeed;
    }
    

    lengthdir_xlengthdir_y 示例:

    // create event
    
    playerSpeed = 3;
    
    // step event
    
    image_angle = point_direction(x, y, mouse_x, mouse_y);
    
    if keyboard_check( ord("W") )
    {
        x += lengthdir_x( playerSpeed, image_angle );
        y += lengthdir_y( playerSpeed, image_angle );
    }
    else if keyboard_check( ord("S") )
    {
        x += lengthdir_x( playerSpeed, image_angle-180 );
        y += lengthdir_y( playerSpeed, image_angle-180 );
    }
    

    请注意,所有游戏制作函数都使用角度(度数),圆的右侧角度为 0(360),逆时针方向增加。 任何函数都可以在 0 到 360 范围以下和以上的值下正常工作,例如 -90 = 270 (360-90)400 = 40 (400-360)。 注意游戏制作者如何检查truefalse。任何小于 0 的值都将在检查时生成false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多