Game Maker - создание игр | HellRoom Games

Game Maker | GameMaker: Studio [Game-Maker.ru] => Статьи / уроки => Тема начата: Grim от Октябрь 01, 2011, 14:50:30



Название: Создание Бега/Ходьбы
Отправлено: Grim от Октябрь 01, 2011, 14:50:30
Мой первый урок для всех 8))

Почитал темы на форуме и не нашел такой. Вроде как не объяснялось нигде, а вещь довольно таки полезная для разных жанров.(не все темы просмотрел уж извольте 8(( ниасилю столько читать)

что в уроке:

Итак, начнем:

1)Для того чтобы передвинуть вашего героя, как я понял, есть уйма способов. Мне самым удачным кажется функция 
Код:
if place_free(x-4,y) then x-=4

поэтому давайте в событии клавиатуры для кнопки Left пропишем этот код. И такой же код пропишем в том же собитии только для кнопки Right и соответственно поменяем два минуса перед четверками на плюсы. готово, наш герой бегло двигается влево и вправо. Но что если противник обладает такой же скоростью(в данном случае скорость 4?) или даже чуть большей? Это not будет значить неизбежную смерть нашего героя, он сможет убежать если в код добавить еще одну небольшую строчку ;)

Код:
if keyboard_check(ord('X')) && place_free(x-4,y) then x-=2

для левой кнопки
и естественно таже строчка только с плюсами для правой кнопки.

примерно тоже самое можно создать и практически без кода. В событии нажатой кнопки вверх ставим квадрат с 8 стрелками и задаем движение вверх со скоростью 4 ставим этот квадрат между двумя треугольниками дальше ставим "else" и между еще двумя треугольниками ставим 8угольник со знаком вопроса и вот тут то и заминка. там придется написать " keyboard_check(ord('X')) " и нажать окей. а следом вставит квадрат со стрелками и приказать герою двигаться вверх пошустрее
проделать такуюже операцию для клавиши вниз и мы почти закончили. остался один штрих для события отпушенных кнопок вверх и вниз надо поставить квадрат со стрелками и приказать остановится, а то персонаж будет вечно идти наверх.

2)Чтож мы тут такого понаделали? все просто: герой двигается в 4 стороны
а при нажатой вдобавок букве "x" будет прибавлять скорости 8)

сделано двумя способами чтобы поняли и новички которые могут не сразу вникнуть в код хоть и довольно простой

строчка if place_free(x,y) неоднакратно обсуждалась на форуме ее опустим. единственно что, так это при нажатии кнопки "x" и стрелки мы пишем не 6(скорость которая нам нужна) а 2, потому что мы прибавляем 2 к уже имеющимся 4м.

check_keyboard(ord('X')) это функция проверки нажата ли та или иная клавиша. В данном случае это: ord('X') тоесть клавиша "x" . Код каждой клавиши написан в стандартном хелпе в разделе GML

3)Что же лучше? тут уж как вам нравится 8) можно повозится и поэксперементировать с квадратами и сделать ровные послушные движения
, можно почитать про " движение другие темы "
, можно скопировать код и не заморачиватся ;)

4)Люди знающие дальше у меня вопрос к вам 8) посмотрите нижеприведенный код и выразите свое мнение плз. критика/похвала но обоснованно 8))
5)Использовать данный прием можно в платформерах, каких нибудь мейзах с видом сверху, туда же идут ТДС, и даже файтинги
а улучшить можно например ограничив бег по времени
можно сделать так чтоб со временем способность бегать востанавливалась
, например чтобы на бегу нельзя было стрелять
, чтоб на бегу персонаж мог перелетать через небольшие ямы, или чтобы прыжок с разбега был повыше и подальше, к бегу можно добавить торможение
и уйма всяких вкусностей что бы улучшить вашу игру 8))


Название: Re: Создание Бега/Ходьбы
Отправлено: Dmi7ry от Октябрь 01, 2011, 18:37:26
Я бы сделал так:
В step объекта:
Код:
stepx=0; stepy=0
if (keyboard_check(vk_shift)) { step=8 } else { step=4 }

if (keyboard_check(vk_left)) { stepx-=step }
if (keyboard_check(vk_right)) { stepx+=step }
if (keyboard_check(vk_up)) { stepy-=step }
if (keyboard_check(vk_down)) { stepy+=step }

if (place_free(x+stepx,y+stepy)) { x+=stepx; y+=stepy }

Если нужно добавить проверку, чтобы не выходить за пределы комнаты, то ниже добавляем:
Код:
if (x<0) { x=0 }
if (x>room_width-sprite_width) { x=room_width-sprite_width }
if (y<0) { y=0 }
if (y>room_height-sprite_height) { y=room_height-sprite_height }

В вашем же коде получается 4 проверки на столкновение, вместо одной в моём коде. И он более прост для восприятия.


Название: Re: Создание Бега/Ходьбы
Отправлено: Server313 от Октябрь 01, 2011, 18:40:25
А 16 сторон можно?


Название: Re: Создание Бега/Ходьбы
Отправлено: Dmi7ry от Октябрь 01, 2011, 18:45:18
А 16 сторон можно?
С клавиатуры? Это не удобно.
А с мышки - элементарно.

Добавлено: Октябрь 02, 2011, 06:29:32
Код:
{
        if keyboard_check(vk_left) && x > 0 && place_free(x-4,y) then x -= + walk
        if keyboard_check(vk_right)&& x < room_width -32 && place_free(x+4,y) then x -= - walk
        else
        if keyboard_check(vk_left)&& x > 0 && keyboard_check(ord('X')) && place_free(x-4,y) then x-= +run
        if keyboard_check(vk_right)&& x < room_width -32 && keyboard_check(ord('X')) && place_free(x+4,y) then x-= -run
}

1. если (нажата влево) и (X>0) и (слева никого нет), значит перемещаем влево
2. если (нажата вправо) и (не вылезли за правый край комнаты) и (справа никого нет), идём вправо
    ИНАЧЕ
    если (нажата влево) и (X>0) и (нажата X) и (слева никого нет), значит перемещаем влево
3. если (нажата вправо) и (не вылезли за правый край комнаты) и (нажата X) и (справа никого нет), значит перемещаем вправо

Во-первых, если нажать влево и X, то действие на клавишу влево будет исполнено два раза - в первой строке и во второй.

Во-вторых, не понятно, зачем нужно двойное преобразование знаков:
Код:
x -= + walk
x -= - walk
если более логично будет сделать
Код:
x-=walk
x+=walk
То же самое с run.

В-третьих, если переменные run и walk не равны, то нужно в проверке свободного места использовать разные значения, а не 4, как у вас, в обоих случаях. Если же они равны, то нет необходимости использовать две переменные вместо одной.

В-четвёртых, вообще не очень понятно какая логика должна была быть у вашего кода.
вариант 1:
1. если стрелка нажата, то смещаем героя на 4 точки
2. если нажата X, то смещаем ещё на 2 (например) точки

вариант 2:
1. если стрелка нажата, но не нажата X, то смещаем на 4 точки
2. если стрелка нажата и нажата X, то смещаем на 6 (например) точек

Смущает ваше непонятное else. Склоняюсь всё же к тому, что вы планировали вариант 1, судя по вашему примеру.
Но в любом из вариантов, логика построения программы немного не правильная.