Xell
Участник
  
Репутация: 9
Offline
API: Game Maker 8.0 Pro
Сообщений: 177
|
 |
« : Ноябрь 11, 2011, 20:49:57 » |
|
предполагается достаточно большое количество квестов в игре, само собой я в них буду путаться, посему решил их как-то систематизировать идея такова, изначально в игре будут лишь глобальные переменные по названиям квестов далее при получении квеста создаётся новый объект и его индекс присваивается глобальной переменной например: global.first_quest=object_add(); после чего все манипуляции с квестом будут происходить в этом объекте, то есть квест, описанный в скрипте, будет задавать и менять переменные данного объекта (например зачитывать по порядку сообщения в диалогах, предлагать выбор и тому подобное) дело осложняется тем, что я не могу создать данный объект в другой комнате (например в постоянном меню), а игровые комнаты по задумке у меня могут "забываться" есть ли какой-либо вариант обойти данную неприятность, или какое-либо более простое решение как реализовать квесты? буду очень благодарен за помощь 
|
|
|
Записан
|
|
|
|
Gh0sTRus26
Пользователь
 
Репутация: 5
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
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 а ещё замечательная возможность удалить этот объект по выполнении квеста будет в моём случае, ну и намного меньше переменных + к тому не глобальных, ну и квесты по именам, а не по номерам 
|
|
|
Записан
|
|
|
|
|
Dmi7ry
Гл. Администратор
Репутация: 1379
Offline
Пол:  Награды:  ![За постоянность! [200 дней на форуме] За постоянность! [200 дней на форуме]](https://forum.hellroom.ru/awards/78e87f17e3713947881315332c8ce619_hellroomforum_time_silver.gif) ![За лояльность! [+1000 репутации] За лояльность! [+1000 репутации]](https://forum.hellroom.ru/awards/49d1e615667c15086498002286ccd3e9_hellroomforum_good_gold.gif)   
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626
|
 |
« Ответ #4 : Ноябрь 11, 2011, 23:05:07 » |
|
я бы использовал несколько динамических массивов (в GM это значит списков то бишь). например, основной список квестов. в этом списке хранятся указатели на сами структуры квестов. то есть каждая запись в этом списке - это указатель на другой список, в котором уже непосредственно описывается вся структура квеста. плюсы: квест выполнили, удалили его из списка (и можно саму структуру, описывающую квест)
структура, описывающая квест должна представлять из себя ещё несколько списков один - текст, выводящийся на экран ещё один должен содержать переменные, отвечающие за выполнение квеста и т.д.
|
|
|
Записан
|
- А какой, собственно, командой процессора колобок ест черта? - Командой EAT... |  | Справка и FAQ в правом верхнем углу... |  |
|
|
|
Xell
Участник
  
Репутация: 9
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 вот так - срабатывает, отличия не понимаю  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 (30.45 Кб, 615x494 - просмотрено 1046 раз.)
|
|
Записан
|
|
|
|
MusNik
KeeVee Games
GM Pro user
Репутация: 733
Offline
Пол:  Награды:  ![За постоянность! [200 дней на форуме] За постоянность! [200 дней на форуме]](https://forum.hellroom.ru/awards/78e87f17e3713947881315332c8ce619_hellroomforum_time_silver.gif) ![За лояльность! [+500 репутации] За лояльность! [+500 репутации]](https://forum.hellroom.ru/awards/90cb589b7473ca11705300194079bf64_hellroomforum_good_bronze.gif)   ...
API: GameMaker Studio 2
Сообщений: 3241
|
 |
« Ответ #6 : Ноябрь 12, 2011, 21:38:18 » |
|
Убери приставку "player_", то есть: global.name='name'; global.speaker_name=global.name; ...
|
|
|
Записан
|
|
|
|
Xell
Участник
  
Репутация: 9
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
Пол:  Награды:  ![За постоянность! [200 дней на форуме] За постоянность! [200 дней на форуме]](https://forum.hellroom.ru/awards/78e87f17e3713947881315332c8ce619_hellroomforum_time_silver.gif) ![За лояльность! [+1000 репутации] За лояльность! [+1000 репутации]](https://forum.hellroom.ru/awards/49d1e615667c15086498002286ccd3e9_hellroomforum_good_gold.gif)   
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626
|
 |
« Ответ #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 которого этот код)
|
|
|
Записан
|
- А какой, собственно, командой процессора колобок ест черта? - Командой EAT... |  | Справка и FAQ в правом верхнем углу... |  |
|
|
|
Xell
Участник
  
Репутация: 9
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
Пол:  Награды:  ![За постоянность! [500 дней на форуме] За постоянность! [500 дней на форуме]](https://forum.hellroom.ru/awards/e0371460a203dd46d2dc161571bf6144_hellroomforum_time_gold.gif) ![За лояльность! [+1000 репутации] За лояльность! [+1000 репутации]](https://forum.hellroom.ru/awards/49d1e615667c15086498002286ccd3e9_hellroomforum_good_gold.gif)   ...
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
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
|
 |
« Ответ #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
Пол:  Награды:  ![За постоянность! [200 дней на форуме] За постоянность! [200 дней на форуме]](https://forum.hellroom.ru/awards/78e87f17e3713947881315332c8ce619_hellroomforum_time_silver.gif) ![За лояльность! [+1000 репутации] За лояльность! [+1000 репутации]](https://forum.hellroom.ru/awards/49d1e615667c15086498002286ccd3e9_hellroomforum_good_gold.gif)   
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626
|
 |
« Ответ #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
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" 
|
|
|
Записан
|
|
|
|
|