0

注意:我使用的是 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;
4

3 回答 3

0

在您的代码中,您设置image_angleand direction,但随后仅更改y坐标,因此您当然不会看到坐标的任何更改x

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

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检查结果。

于 2017-07-19T10:01:29.283 回答
0

@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,这也是可能的,但稍微困难一些(您需要使用and函数计算x和增量,然后将这些增量添加到当前坐标中)。ylengthdir_xlengthdir_y

于 2017-07-09T05:51:29.903 回答
0
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;
}
于 2017-07-08T21:39:41.173 回答