如何使对象相对于 image_angle 移动?

Posted

技术标签:

【中文标题】如何使对象相对于 image_angle 移动?【英文标题】:How to make an object move in relation to 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;

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何使对象相对于 image_angle 移动?的主要内容,如果未能解决你的问题,请参考以下文章

如何相对于角度移动?

相对于对象移动背景[关闭]

AS3使一个显示对象相对于另一个显示对象居中

AS3 - 相对于角度移动阵列对象

脚本移动选择相对于传播范围?

如何使position:fixed;相对于父元素定位