Предупреждение: не буду расписывать отвлеченные вещи вроде рисования спрайтов и создания объектов. Только говорю - все препятствия на пути героя должны быть
с Solid! Давайте поразмышляем: что необходимо для РПГ? Прокачка героя, разные суперпуперспособности, адекватные сражения и диалоги - правильно? Вот этим и займемся. В Create пропишем необходимые переменные. Так как в РПГ может быть множество локаций, логично, что переменные эти глобальны (существуют в одном экземпляре и
сохраняются при переходе героя на другую локацию). Скажем, так:
Code
global.xp=0 //Очки опыта героя global.level=1 //Уровень global.maxhealth=100 //Максимальное здоровье, увеличивается при прокачке. global.mana=100 // Мана global.maxmana=100 //Максимальная мана, тоже увеличивается при прокачке. //Также наш герой должен менять одежду, оружие, как в больших РПГ. Пропишем для начала: global.oruzhie='Кулаки' global.odezhda='Обноски'
С переменными разобрались. Сделаем герою движение - он не может стоять на месте, верно? Вид у нас будет сверху и движение - с помощью тыканья мышкой.
Создайте спрайт и объект зеленой точки (она обозначает, куда двигается герой). В событии у героя Global Mouse Left (нажатие левой кнопки мыши в любом месте)
ставим: 1)удаление всех объектов зеленой точки; 2)создание объекта этой зеленой точки в координатах mouse_x,mouse_y; 3)движение героя опять-таки в mouse_x, mouse_y. В столкновении героя с этой самой точкой пишем исчезновение точки и остановку героя (думаю, обойдемся без подробных объяснений). Теперь в Степе image_angle=direction (у вас должен быть лицензионный ГМ!), чтобы спрайт героя поворачивался в сторону движения. Спрайт должен быть нарисован
изначально повернутым вправо. Получилось движение героя! Что там дальше? Ну конечно, какая РПГ без сражений с монстрами! Сделать монстра не так уж сложно. Есть кнопка передвижения с обходом препятствий (Step Towards Point), ее и перетаскиваем монстру в Step, в координаты там пишем: hero.x, hero.y. Перед этой кнопкой ставим кнопку проверки переменной, в поле переменной пишем "distance_to_object(hero)", а ниже выбираем smaller than и пишем во второе поле, например, 200. Теперь у монстра есть простенький ИИ - при приближении героя враг начинает бежать за ним. В Create монстра ставим heal=100 (это его здоровье) В событии нажатия на монстра (в объекте монстра) ставим примерно так:
Code
if global.oruzhie='Кулаки' heal-=2 if global.oruzhie='Меч' heal-=4 if global.oruzhie='Еще что-нибудь' heal-=7
Естественно, также ставим при столкновении героя с монстром так:
Code
if odezhda='Обноски' health-=1 if odezhda='Плащ' health-=0.6 if odezhda='Еще что-нибудь' health-=0.3
У монстра, кстати, ставим в Степ image_angle=direction (он тоже имеет право поворачиваться, куда хочет ). Но это не все. Герой еще бессмертный и ему плевать на уменьшение здоровья (как и монстру). У героя пишем в степ:
Code
if health<=0 {show_message('ЛУЗЕР!!!' )game_end()}
А у монстра
Code
if heal<=0 {instance_destroy() global.xp+=50}
Фу-ух, разобрались. Простенькая игрушка создана. Но это все еще не совсем РПГ. Нужна прокачка, верно? В степе что-нибудь вроде этого:
Code
if global.xp>=300 { global.level+=1 global.xp=0 show_message('ВАШ УРОВЕНЬ - '+string(global.level)+'!' ) global.maxhealth+=10 global.maxmana+=10 global.mana+=10 health+=10 }
Это пример прокачки героя - когда опыт больше 299, повышается уровень и максимальные мана и здоровье.
Остались магические способности героя. Рассмотрим, скажем, файерболы. Пишем в событии глобального нажатия левой кнопки мыши:
Code
if global.mana>=20{ instance_create(x,y,faerball) global.mana-=20} у файербола в Create: move_towards_point(mouse_x,mouse_y,15) И в столкновении монстра с файерболом: heal-=30 //или сколько надо
С заклинанием разобрались, настало время последнего элемента - диалогов. С этим просто. В столкновении героя с НПС пишешь вот (пример):
Code
speed=0 //НПС должен быть solid! dialog=show_message_ext('Что вы хотите?','Как дела?','Исчезни','Пока!' ) if dialog=1 {show_message('Да нормально все!' )} if dialog=2 {with (other) instance_destroy()} if dialog=3 {show_message('Пока! Удачи!' )}
Предупреждение: везде, где сказано про нажатие кнопки мыши, должно быть именно нажатие Pressed, а не удержание Button.
В столкновении героя с этой самой точкой пишем исчезновение точки и остановку героя (думаю, обойдемся без подробных объяснений).
Вот здесь у меня проблема... После исчезновения точки она больше не появляется! И игрок движется бесконечно в направлении куда кликнул мышью... Мой блог: http://terv-blog.blogspot.ru/
if !instance_exists(obj_point) //Если точка отсутствует, то { instance_create(mouse_x,mouse_y,obj_point); //создаем точку, где была нажата мышка }
obj_point - Это объект этой точки, может быть назван хоть как. ! перед instance_exists означает действие, если чего-то нет, эта команда без ! проверяет, есть-ли объект на уровне. mouse_x и Mouse_y обозначают координаты, где появится эта точка, в нашем случае там, где была нажата ЛКМ. Этот код нужно вставить в объект персонажа, а лучше создать объект obj_control (любое название) с него будут обрабатываться все переменные - это очень удобно. Вставлять код в Step.
Надеюсь, помог.
Добавлено (18.10.2012, 17:41) --------------------------------------------- Я сейчас работаю над своим RPG-примером, там все события в коде, ждем.
Добавлено (18.10.2012, 18:42) --------------------------------------------- В общем, пример готов, правда не убивается никто, но система прокачки работает. Скачать Код хорошо прокомментирован.
Не, это то я и сам сделал, проблема в том что не получается её удалить когда ставлю новую, точнее получается, но потом при попытке поставить следующую она не ставится...
Quote (CrashOne)
В общем, пример готов, правда не убивается никто, но система прокачки работает.
TeRV, можно было сделать немного иначе.Когда игрок коснётся точки булевую переменную изменять, а когда он её не косается, то опять булевую переменную изменять и поставить проверку на то, если эта самая переменная имеет определённое значение, то двигать игрока к ней. В этом случае меньше кода будет, а соответственно производительность. Лично я на гамаковском скрипте 2 года просидел. И знаю, что пара строчек простого кода может пару фпс сожрать, что не есть хорошо.
TeRV, можно было сделать немного иначе.Когда игрок коснётся точки булевую переменную изменять, а когда он её не косается, то опять булевую переменную изменять и поставить проверку на то, если эта самая переменная имеет определённое значение, то двигать игрока к ней. В этом случае меньше кода будет, а соответственно производительность. Лично я на гамаковском скрипте 2 года просидел. И знаю, что пара строчек простого кода может пару фпс сожрать, что не есть хорошо.
Можно было и так, но в моем примере все сделано, чтобы было понятно и просто) Производительность в этом примере сильно не понизится, максимум пара процентов. Вот если в игре, то тогда точно нужно будет оптимизировать. В январе у меня уже 3 года на GML будет) Где-то в интернете статью об оптимизации кода на гамаке видел, как найду, выложу здесь.