Как заставить объект двигаться относительно image_angle?

Примечание. Я использую 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;

person MobyCoding    schedule 08.07.2017    source источник


Ответы (3)


Код @Gamio почти правильный (должно быть _released вместо _release, перепутал знак для клавиш W и S). Вот несколько улучшений:

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, это также возможно, но немного сложнее (вам нужно вычислить дельты x и y с помощью функций lengthdir_x и lengthdir_y, а затем добавить эти дельты к текущим координатам).

person Dmi7ry    schedule 09.07.2017
comment
ну, я не уверен, что здесь необходимо генерировать var spd, а также зачем проверять, был ли освобожден ключ 2 * на каждом шаге, что я решил в своем ответе по-разному, и здесь это не нужно при правильном использовании spd. также, когда игрок нажимает обе клавиши одновременно, а затем отпускает только одну (в случае, если игрок часто переключает клавиши, такие сценарии могут происходить часто, без уведомления игроков), также вы говорите, что необходимо использовать этот код в событии конечного шага, что кажется неправдой, и если это должно что-то предотвратить, я думаю, вы должны немного указать проблему. - person ; 19.07.2017
comment
@ VojtěchŠvrček Это не очень хорошее решение, это просто улучшение кода Gamio. - person Dmi7ry; 20.07.2017
comment
так много думал, просто думал о людях, начинающих с создателей игр, и чем это может закончиться :p. но хорошо, это работает, и если они просто скопируют и вставят коды в проект, то, конечно, будет беспорядок. - person ; 20.07.2017

В вашем коде вы устанавливаете image_angle и direction, но затем меняете только координату y, поэтому, конечно, вы не увидите никаких изменений координаты x.

Вы можете использовать встроенные переменные direction и speed, и гейммейкер автоматически переместит любой объект, или вы можете применить функции lengthdir_x и lengthdir_y к координатам x и y.

Пример direction и speed:

//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_x и lengthdir_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 );
}

Обратите внимание, что все функции Game Maker используют угол в градусах, с углом 0 (360) с правой стороны круга, увеличивающимся против часовой стрелки. Любые функции корректно работают со значениями как ниже, так и выше диапазона от 0 до 360, в то время как, например, -90 = 270 (360-90) и 400 = 40 (400-360). Остерегайтесь того, как производитель игры проверяет true и false. Любое значение ‹, отличное от 0, будет отображаться как false при проверке.

person Community    schedule 19.07.2017

person    schedule
comment
примечание: я обращаю внимание только на две верхние строки, потому что это все, что мне действительно нужно... это все еще не работает... - person MobyCoding; 09.07.2017