Создание РПГ - Форум Игроделов
Пн, 06 Май 2024, 15:19 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » GAME MAKER » МАНУАЛЫ И УРОКИ » Создание РПГ
Создание РПГ
ScorpioДата: Вт, 17 Авг 2010, 13:26 | Сообщение # 1
 
Сообщений: 41
Награды: 1
Репутация: 41
Статус: Offline
Предупреждение: не буду расписывать отвлеченные вещи вроде рисования спрайтов и создания объектов. Только говорю - все препятствия на пути героя должны быть

с 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.

Вот и подошел урок к концу. Если что-то непонятно, есть проблемы - обращайтесь ко мне!
Полностью сделанный пример RPG - http://depositfiles.com/ru/files/u2f6m9sc2

 
СообщениеПредупреждение: не буду расписывать отвлеченные вещи вроде рисования спрайтов и создания объектов. Только говорю - все препятствия на пути героя должны быть

с 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.

Вот и подошел урок к концу. Если что-то непонятно, есть проблемы - обращайтесь ко мне!
Полностью сделанный пример RPG - http://depositfiles.com/ru/files/u2f6m9sc2


Автор - Scorpio
Дата добавления - 17 Авг 2010 в 13:26
MrWolfДата: Вт, 17 Авг 2010, 17:41 | Сообщение # 2
[color=#fff600]
 
Сообщений: 211
Награды: 4
Репутация: 131
Статус: Offline
Quote (Scorpio)
Полностью сделанный пример RPG - http://depositfiles.com/ru/files/u2f6m9sc2

Это самый популярный пример. Сейчас многие используют его! biggrin happy
 
Сообщение
Quote (Scorpio)
Полностью сделанный пример RPG - http://depositfiles.com/ru/files/u2f6m9sc2

Это самый популярный пример. Сейчас многие используют его! biggrin happy

Автор - MrWolf
Дата добавления - 17 Авг 2010 в 17:41
TeRVДата: Чт, 18 Окт 2012, 00:40 | Сообщение # 3
Белый Волк
 
Сообщений: 1517
Награды: 13
Репутация: 331
Статус: Offline
Quote (Scorpio)
В столкновении героя с этой самой точкой пишем исчезновение точки и остановку героя (думаю, обойдемся без подробных объяснений).

Вот здесь у меня проблема... После исчезновения точки она больше не появляется! И игрок движется бесконечно в направлении куда кликнул мышью...


Мой блог:
http://terv-blog.blogspot.ru/
 
Сообщение
Quote (Scorpio)
В столкновении героя с этой самой точкой пишем исчезновение точки и остановку героя (думаю, обойдемся без подробных объяснений).

Вот здесь у меня проблема... После исчезновения точки она больше не появляется! И игрок движется бесконечно в направлении куда кликнул мышью...

Автор - TeRV
Дата добавления - 18 Окт 2012 в 00:40
CrashOneДата: Чт, 18 Окт 2012, 18:42 | Сообщение # 4
Нет аватара
Dead Head Games
 
Сообщений: 1042
Награды: 13
Репутация: 374
Статус: Offline
TeRV, это, думаю, можно обойти вот так:
Code

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)
---------------------------------------------
В общем, пример готов, правда не убивается никто, но система прокачки работает.
Скачать
Код хорошо прокомментирован.

 
СообщениеTeRV, это, думаю, можно обойти вот так:
Code

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)
---------------------------------------------
В общем, пример готов, правда не убивается никто, но система прокачки работает.
Скачать
Код хорошо прокомментирован.


Автор - CrashOne
Дата добавления - 18 Окт 2012 в 18:42
TeRVДата: Чт, 18 Окт 2012, 19:44 | Сообщение # 5
Белый Волк
 
Сообщений: 1517
Награды: 13
Репутация: 331
Статус: Offline
Quote (CrashOne)
TeRV, это, думаю, можно обойти вот так:

Не, это то я и сам сделал, проблема в том что не получается её удалить когда ставлю новую, точнее получается, но потом при попытке поставить следующую она не ставится...

Quote (CrashOne)
В общем, пример готов, правда не убивается никто, но система прокачки работает.

Щас гляну ,может есть решение моей проблемы

Добавлено (18.10.2012, 19:44)
---------------------------------------------
Code
if instance_number(obj_point)>1     //Если число точек больше одного, то
with (obj_point) instance_destroy();  //уничтожить точку

и это))

with (other) instance_destroy(); //При столкновении с точкой точка уничтожится

Во! Точно надо) Я пробовал подобное написать но не правильно использовал команды)) Спасибо за пример


Мой блог:
http://terv-blog.blogspot.ru/


Сообщение отредактировал TeRV - Чт, 18 Окт 2012, 19:46
 
Сообщение
Quote (CrashOne)
TeRV, это, думаю, можно обойти вот так:

Не, это то я и сам сделал, проблема в том что не получается её удалить когда ставлю новую, точнее получается, но потом при попытке поставить следующую она не ставится...

Quote (CrashOne)
В общем, пример готов, правда не убивается никто, но система прокачки работает.

Щас гляну ,может есть решение моей проблемы

Добавлено (18.10.2012, 19:44)
---------------------------------------------
Code
if instance_number(obj_point)>1     //Если число точек больше одного, то
with (obj_point) instance_destroy();  //уничтожить точку

и это))

with (other) instance_destroy(); //При столкновении с точкой точка уничтожится

Во! Точно надо) Я пробовал подобное написать но не правильно использовал команды)) Спасибо за пример

Автор - TeRV
Дата добавления - 18 Окт 2012 в 19:44
НиколайДата: Чт, 18 Окт 2012, 21:02 | Сообщение # 6
 
Сообщений: 385
Награды: 5
Репутация: 78
Статус: Offline
TeRV, можно было сделать немного иначе.Когда игрок коснётся точки булевую переменную изменять, а когда он её не косается, то опять булевую переменную изменять и поставить проверку на то, если эта самая переменная имеет определённое значение, то двигать игрока к ней. В этом случае меньше кода будет, а соответственно производительность. Лично я на гамаковском скрипте 2 года просидел. biggrin И знаю, что пара строчек простого кода может пару фпс сожрать, что не есть хорошо.

 
СообщениеTeRV, можно было сделать немного иначе.Когда игрок коснётся точки булевую переменную изменять, а когда он её не косается, то опять булевую переменную изменять и поставить проверку на то, если эта самая переменная имеет определённое значение, то двигать игрока к ней. В этом случае меньше кода будет, а соответственно производительность. Лично я на гамаковском скрипте 2 года просидел. biggrin И знаю, что пара строчек простого кода может пару фпс сожрать, что не есть хорошо.

Автор - Николай
Дата добавления - 18 Окт 2012 в 21:02
CrashOneДата: Пт, 19 Окт 2012, 09:53 | Сообщение # 7
Нет аватара
Dead Head Games
 
Сообщений: 1042
Награды: 13
Репутация: 374
Статус: Offline
Quote (Колямба)
TeRV, можно было сделать немного иначе.Когда игрок коснётся точки булевую переменную изменять, а когда он её не косается, то опять булевую переменную изменять и поставить проверку на то, если эта самая переменная имеет определённое значение, то двигать игрока к ней. В этом случае меньше кода будет, а соответственно производительность. Лично я на гамаковском скрипте 2 года просидел. И знаю, что пара строчек простого кода может пару фпс сожрать, что не есть хорошо.

Можно было и так, но в моем примере все сделано, чтобы было понятно и просто) Производительность в этом примере сильно не понизится, максимум пара процентов. Вот если в игре, то тогда точно нужно будет оптимизировать. В январе у меня уже 3 года на GML будет) Где-то в интернете статью об оптимизации кода на гамаке видел, как найду, выложу здесь.

Добавлено (19.10.2012, 09:53)
---------------------------------------------

Quote (TeRV)
Во! Точно надо) Я пробовал подобное написать но не правильно использовал команды)) Спасибо за пример

всегда пожалуйста,будут вопросы, обращайся, помогу, чем смогу)
 
Сообщение
Quote (Колямба)
TeRV, можно было сделать немного иначе.Когда игрок коснётся точки булевую переменную изменять, а когда он её не косается, то опять булевую переменную изменять и поставить проверку на то, если эта самая переменная имеет определённое значение, то двигать игрока к ней. В этом случае меньше кода будет, а соответственно производительность. Лично я на гамаковском скрипте 2 года просидел. И знаю, что пара строчек простого кода может пару фпс сожрать, что не есть хорошо.

Можно было и так, но в моем примере все сделано, чтобы было понятно и просто) Производительность в этом примере сильно не понизится, максимум пара процентов. Вот если в игре, то тогда точно нужно будет оптимизировать. В январе у меня уже 3 года на GML будет) Где-то в интернете статью об оптимизации кода на гамаке видел, как найду, выложу здесь.

Добавлено (19.10.2012, 09:53)
---------------------------------------------

Quote (TeRV)
Во! Точно надо) Я пробовал подобное написать но не правильно использовал команды)) Спасибо за пример

всегда пожалуйста,будут вопросы, обращайся, помогу, чем смогу)

Автор - CrashOne
Дата добавления - 19 Окт 2012 в 09:53
Форум Игроделов » GAME MAKER » МАНУАЛЫ И УРОКИ » Создание РПГ
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024