Game Maker - создание игр | HellRoom Games
Июнь 19, 2025, 04:06:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Реализация квестов  (Прочитано 7678 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Xell
Участник
****

Репутация: 9
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 177


« : Ноябрь 11, 2011, 20:49:57 »

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

идея такова, изначально в игре будут лишь глобальные переменные по названиям квестов
далее при получении квеста создаётся новый объект и его индекс присваивается глобальной переменной
например:
Код:
global.first_quest=object_add();
после чего все манипуляции с квестом будут происходить в этом объекте, то есть квест, описанный в скрипте, будет задавать и менять переменные данного объекта (например зачитывать по порядку сообщения в диалогах, предлагать выбор и тому подобное)
дело осложняется тем, что я не могу создать данный объект в другой комнате (например в постоянном меню), а игровые комнаты по задумке у меня могут "забываться"
есть ли какой-либо вариант обойти данную неприятность, или какое-либо более простое решение как реализовать квесты?

буду очень благодарен за помощь 
Записан
Gh0sTRus26
Пользователь
***

Репутация: 5
Offline Offline

Пол: Мужской
API: Game Maker 8.0 Pro
Деятельность: Бездельничаю
Сообщений: 82


Let it be


« Ответ #1 : Ноябрь 11, 2011, 22:14:39 »

Пользуйся массивами
Записан

All you need is love
Xell
Участник
****

Репутация: 9
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 177


« Ответ #2 : Ноябрь 11, 2011, 22:22:11 »

Пользуйся массивами
слишком много массивов надо
number_of_repliсa[0,0]='hello' и до 100 предположим, если такое число квестов
number_of_repliсa[1,0]='have you already got it?' и тоже до 100
и так в каждом квесте, а кроме того ещё условия
choose_something[0,0]=3;
разумеется ориентироваться в этом будет абсолютно невозможно  

PS а ещё замечательная возможность удалить этот объект по выполнении квеста будет в моём случае, ну и намного меньше переменных + к тому не глобальных, ну и квесты по именам, а не по номерам 
Записан
redeek789789789
«Старожил форума»
******

Репутация: 42
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]
API: Game Maker 8.0 Pro
Деятельность: 3d model, GM, GML,осваиваю C#, HTML, Paint.net
Сообщений: 530



« Ответ #3 : Ноябрь 11, 2011, 22:34:09 »

знач не пользуйся масивами
Записан

Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #4 : Ноябрь 11, 2011, 23:05:07 »

я бы использовал несколько динамических массивов (в GM это значит списков то бишь).
например, основной список квестов.
в этом списке хранятся указатели на сами структуры квестов.
то есть каждая запись в этом списке - это указатель на другой список, в котором уже непосредственно описывается вся структура квеста.
плюсы: квест выполнили, удалили его из списка (и можно саму структуру, описывающую квест)

структура, описывающая квест должна представлять из себя ещё несколько списков
один - текст, выводящийся на экран
ещё один должен содержать переменные, отвечающие за выполнение квеста
и т.д.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Xell
Участник
****

Репутация: 9
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 177


« Ответ #5 : Ноябрь 11, 2011, 23:07:37 »

немного подумав и решив, что 1 объект, сопровождаемый скриптами, всё-таки проще, чем множество списков, продолжил свою идею
но всё же встретил неприятность на ровном месте (при чём абсолютно непонятно почему)
написал тестовую программу для локализации ошибки, но соображалки у меня не хватило
суть такая, довёл программу до состояния одного объекта с одним событием создания (то есть пустая комната, в которой стоит object0), у объекта в
create:
Код:
global.player_name='name';
global.speaker_name=global.player_name;
global.timeline_for_text=timeline_add();
globalvar q_beginning;
q_beginning=object_add();
object_event_add(q_beginning,ev_room_start,1,timeline_moment_add(global.timeline_for_text,1,global.speaker_name=global.player_name));
как вообще можно понять такую ошибку?
PS вот так - срабатывает, отличия не понимаю errm
Код:
global.player_name=1;
global.speaker_name=global.player_name;
global.timeline_for_text=timeline_add();
globalvar q_beginning;
q_beginning=object_add();
object_event_add(q_beginning,ev_room_start,1,timeline_moment_add(global.timeline_for_text,1,global.speaker_name=1));


схема.JPG
Реализация квестов
* схема.JPG (30.45 Кб, 615x494 - просмотрено 1046 раз.)
Записан
MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #6 : Ноябрь 12, 2011, 21:38:18 »

Убери приставку "player_", то есть:
Код:
global.name='name';
global.speaker_name=global.name;
...
Записан

Xell
Участник
****

Репутация: 9
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 177


« Ответ #7 : Ноябрь 12, 2011, 21:41:27 »

Убери приставку "player_", то есть:
Код:
global.name='name';
global.speaker_name=global.name;
...
вот так - не работает
Код:
name="stroka1";
namee=name;
timelinee=timeline_add();
timeline_moment_add(timelinee,1,namee=name);
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #8 : Ноябрь 12, 2011, 22:01:06 »

Код:
globalvar q_beginning,player_name,speaker_name,timeline_for_text;

player_name='name';
speaker_name=player_name;
timeline_for_text=timeline_add();
q_beginning=object_add();

txt1='timeline_moment_add(timeline_for_text,1,"speaker_name=player_name"); show_message("room start event")'
txt2='show_message("create event")'

object_event_add(q_beginning,ev_other,ev_room_start,txt1);
object_event_add(q_beginning,ev_create,0,txt2);

instance_create(10,10,q_beginning)

первая ошибка - "код" для событий должен задаваться как текст
вторая ошибка - тип события неправильно указан был. внимательнее читайте справку (имитация событий)

Добавлено: Ноябрь 12, 2011, 22:06:02
Пример для GM8.1. Там только код, который я написал выше (пустая комната, один объект, в create которого этот код)

* создание объекта.gm81 (9.19 Кб - загружено 353 раз.)
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Xell
Участник
****

Репутация: 9
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 177


« Ответ #9 : Ноябрь 12, 2011, 22:08:19 »

первая ошибка - "код" для событий должен задаваться как текст
вторая ошибка - тип события неправильно указан был. внимательнее читайте справку (имитация событий)
ну я стараюсь пользоваться встроенной справкой, а там к несчастью не всегда можно найти нужный ответ, особенно когда сообщение об ошибке такое непонятное...
мне просто начав делать квесты пришлось приступить сразу к изучению создания объектов/временных линий, изменения их свойств, а также всё сразу попытался соединить скриптами... вобщем сильно себя переоценил :(
пойду попробую сделать применив ваши рекомендации
спасибо вам что помогаете, всегда очень полезно оказывается

Добавлено: Ноябрь 12, 2011, 23:11:31
Код:
globalvar q_beginning,player_name,speaker_name,timeline_for_text;

player_name='name';
speaker_name=player_name;
timeline_for_text=timeline_add();
q_beginning=object_add();

txt1='timeline_moment_add(timeline_for_text,1,"speaker_name=player_name"); show_message("room start event")'
txt2='show_message("create event")'

object_event_add(q_beginning,ev_other,ev_room_start,txt1);
object_event_add(q_beginning,ev_create,0,txt2);

instance_create(10,10,q_beginning)
вроде бы немного понял, но возник другой вопрос - можно ли как-то кавычки реализовать тройные? то есть в вашей строке txt1=... вместо speaker_name=player_name  написать speaker_name='man1' ?
Записан
Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #10 : Ноябрь 12, 2011, 23:15:48 »

Как использовать апостроф (одиночная кавычка) внутри текстовых переменных:
код апострофа - 39.
Код:
Код:
draw_text(10,10,'text'+chr(39)+'s line');
Выведет на экран:
Цитировать
text's line
Записан

Xell
Участник
****

Репутация: 9
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 177


« Ответ #11 : Ноябрь 12, 2011, 23:32:13 »

Как использовать апостроф (одиночная кавычка) внутри текстовых переменных:
код апострофа - 39.
Код:
Код:
draw_text(10,10,'text'+chr(39)+'s line');
Выведет на экран:
Цитировать
text's line
ну в данном то случае они должны быть не для текста, а для программы
то есть задать событие объекту "задать отсчёт временной линии 'задать значение текстовой переменной??' "
то есть очень хотелось бы узнать есть ли функция, обратная для функции execute_string
чтобы можно было написать вместо
Код:
object_event_add(q_beginning,ev_other,ev_room_start,txt1);
вот так
Код:
object_event_add(q_beginning,ev_other,ev_room_start,какая-то функция(script1));

или вы имеете ввиду, что можно написать внутри двойных кавычек chr(39) и в процессе если можно так сказать "разборки того, что у меня в коде происходит" компилятор сам заменит в нужных местах это на апостроф?
Записан
Hamster099
«Старожил форума»
******

Репутация: 164
Offline Offline

Награды:
1000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+150 репутации]
API: GameMaker Studio Master
Сообщений: 1264



« Ответ #12 : Ноябрь 13, 2011, 01:44:18 »

слишком много массивов надо
number_of_repliсa[0,0]='hello' и до 100 предположим, если такое число квестов
number_of_repliсa[1,0]='have you already got it?' и тоже до 100
и так в каждом квесте, а кроме того ещё условия
choose_something[0,0]=3;
разумеется ориентироваться в этом будет абсолютно невозможно 
Вообще-то, хватит всего одного массива. Например
Код:
quest[2,0]=0                //2 ид квеста, 0 состояние реплики (0-ещё не произносилась)
quest[2,1]='hello'          //1 ид реплики
quest[2,2]=1
quest[2,3]='...'
и тд.
тогда допустим поиск следующей реплики может выглядеть так
Код:
for(i=0;i<max;i+=2)
{
  if quest[current_quest,i]=0
  {
    draw_text(x,y,quest[i+1]);
    break;
  }
}

Таким же образом можно прописывать все варианты ответа, тогда сделать реплики не каждым вторым индексом массива, а каждым пятым например
Код:
quest[2,0]=1
quest[2,1]='хочешь пирожок?'
quest[2,2]='съесть'
quest[2,3]='выбросить'
quest[2,4]='убежать'
quest[2,5]=0
...

Добавлено: Ноябрь 13, 2011, 01:51:24
впринципе сюда же можно даже заносить ссылки до варианта ответа на индекс реплики, куда ведет этот ответ (чтобы перескакивать в конец например) 
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #13 : Ноябрь 13, 2011, 07:35:09 »

Код:
globalvar q_beginning,player_name,speaker_name,timeline_for_text;

player_name='name';
speaker_name=player_name;
timeline_for_text=timeline_add();
q_beginning=object_add();

object_event_add(q_beginning,ev_other,ev_room_start,'timeline_moment_add(timeline_for_text,1,'+chr(39)+'speaker_name=player_name'+chr(39)+'); show_message('+chr(39)+'room start event'+chr(39)+')');
object_event_add(q_beginning,ev_create,0,'show_message('+chr(39)+'create event'+chr(39)+')');
object_event_add(q_beginning,ev_draw,0,'draw_text(10,10,"its work!")');

instance_create(10,10,q_beginning)

Можно писать так, как удобно.
Можно записать так
object_event_add(q_beginning,ev_draw,0,'draw_text(10,10,"its work!")');
а можно так
object_event_add(q_beginning,ev_draw,0,'draw_text(10,10,'+chr(39)+'its work!'+chr(39)+')');
Результат идентичный, но первая запись более наглядна. А, например, запись для события room start вообще сначала обескураживает :)

Чтобы не запутаться самому, сначала сам текст заключайте в одинарные кавычки, а внутри ставьте всё двойными кавычками.
Цитировать
'timeline_moment_add(timeline_for_text,1,"speaker_name=player_name"); show_message("room start event")'

после этого можно просто сделать замену
Цитировать
"
на
Цитировать
'+chr(39)+'
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Xell
Участник
****

Репутация: 9
Offline Offline

API: Game Maker 8.0 Pro
Сообщений: 177


« Ответ #14 : Ноябрь 13, 2011, 09:59:49 »

после этого можно просто сделать замену
Цитировать
"
на
Цитировать
'+chr(39)+'
точно, логичная запись... вчера уже когда спать уходил сам о такой подумал, а теперь вы подтвердили, значит правильно  
а что касается событий - там на самом деле всё сложнее, игра начинается с меню, и при событии нажатия на клавишу начала игры создаётся и появляется (прямо в меню) квестовый объект, которому сразу же задаётся поведение (также задаётся родительский объект и свойство постоянства, чтобы при повторном рестарте игры все эти "квестовики" из меню удалились)
в итоге при начале первой игровой комнаты он задаёт "объекту рисовальщику" (который присутствует в каждой игровой комнате и выполняет операции рисования интерфейса) определённый таймлайн, чтобы тот начал рисовать диалог (3 подряд идущих реплики)
после этих реплик создаётся определённый объект-регион, наступая на который произносятся ещё реплики, а также появляется первый монстр (а сам регион удаляется), и наконец после убийства этого монстра у нас появляется возможность перейти на вторую локацию  


Вообще-то, хватит всего одного массива. Например
Код:
quest[2,0]=0                //2 ид квеста, 0 состояние реплики (0-ещё не произносилась)
quest[2,1]='hello'          //1 ид реплики
quest[2,2]=1
quest[2,3]='...'
и тд.
тогда допустим поиск следующей реплики может выглядеть так
Код:
for(i=0;i<max;i+=2)
{
  if quest[current_quest,i]=0
  {
    draw_text(x,y,quest[i+1]);
    break;
  }
}
Таким же образом можно прописывать все варианты ответа, тогда сделать реплики не каждым вторым индексом массива, а каждым пятым например
Код:
quest[2,0]=1
quest[2,1]='хочешь пирожок?'
quest[2,2]='съесть'
quest[2,3]='выбросить'
quest[2,4]='убежать'
quest[2,5]=0
...

Добавлено: Ноябрь 13, 2011, 01:51:24
впринципе сюда же можно даже заносить ссылки до варианта ответа на индекс реплики, куда ведет этот ответ (чтобы перескакивать в конец например) 
так это не избавит от необходимости создания объектов и прописывания условий произнесения определённых реплик, только вместо указаний реплик прямо на месте в скрипте они все будут храниться в одном большом массиве, из которого их надо будет правильно выбирать... да и зачем в начале игры присваивать сразу все игровые реплики? где-нибудь не то напишу или недопроверю, и вместо "game start!" увидим "END" 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.128 секунд. Запросов: 33.