Меню сайта
Форма входа

Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Четверг, 16.05.2024, 04:54
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Игровые алгоритмы

Как делать квесты в игре

Как делать квесты в игре

 

Для начала определимся с тем, что мы подразумеваем под словом «Квест». Квест – это игровое задание. То есть игроку дается задание, которое он должен выполнить и получить за его выполнение определенный бонус или возможность перехода на следующий уровень. Благодаря квестам, собственно, и создается сценарий (сюжет) и ветки его развития, окончания и прохождения игры.

 

Теперь попробуем понять структуру квестов. Из чего они состоят? Квест обязательно состоит из самого задания, возможного бонуса, условий его выполнения, а также не обязательно, но иногда нужно хранить того, кто дал Вам этот квест, чтобы прийти за наградой. И многое другое, что также не обязательное.

 

Рассмотрим все эти данные по подробней. Задание квеста – это текст, который описывает, то что Вам нужно сделать чтобы пройти его. Этот текст можно хранить внутри самой программы в переменной типа String:

 

Var

KvestText:String;

 

KvestText:=’Найдите пещеру и принесите мне амулет, который там захоронен’;

 

Также можно хранить внутри базы данных. Не важно будь то Sql Server или стандартный Paradox. Это довольно правильно и удобно, но работать с базами данных для новичков сложновато. Хотя работа с ними дает ряд преимуществ, таких как возможность сортировки, фильтрации, удобного поиска и так далее.

 

Ну и третий вариант. Это хранение внутри текстового файла с расширением txt. Сразу скажу, что это далеко не самый удобный способ, но он очень простой в том случае если дополнительно использовать компонент Memo. Без него прийдется писать текст, который будет открывать текстовый документ, считывать каждую или именно нужную строку (если мы заранее знаем нужные номера строк), присваивать полученные данные в нужные переменные, а затем закрывать текстовый файл. Это долго и не удобно.

 

В случае если мы добавим елемент Memo, все что нам нужно сделать будет это одной строчкой загрузить весь файл целиком, а затем просто из Memo, брать нужные данные. Сразу оговорюсь, что этот компонент визуальный (его видно на форме во время работы программы) поэтому советую скрывать его:

 

Memo1.visible:=false;

 

Чтобы загрузить текстовый файл в Memo достаточно просто указать путь к нему:

 

Memo1.Lines.LoadFromFiles(‘\text\kvest.txt’);

 

Таким образом наш файл полностью загружен в Memo. Также чтобы избежать возможных ошибок, которых в свое время не избежал я и потратил много времени на их поиски. Это когда вы размещаете у себя на форме компонент Memo обязательно в его свойствах ставьте:

 

Memo1.ScrollBars:= ssBoth;

 

Этой строчкой вы сделали прокрутку в компоненте и вертикальную и горизонтальную по тексту. Благодаря этому в случае длинных строк, которые не влазят по ширине в Memo, они не будут обрезаться и переносится на следующую строчку. Потому что каждая строка это отдельный елемент и мы можем запутаться в номерах строк, да и некоторые строки прийдется соединять, а это не удобно и не нужно в принципе.

 

Следующий вопрос, который нас интерисует – как добраться до нужной строки из файла и присвоить ее какой-то переменной? Строки в данном компоненте нумеруются, начиная с нуля. Поэтому первая строка будет с цифрой ноль. Если нам нужно загрузить текст квеста в переменную то делаем это следующим образом:

 

KvestText:=Memo1.Lines.Strings[0];

 

Еще бывают случаи когда нужно загрузить не всю строку, а лишь отдельные ее части. Например нам требуется загрузить первые пять букв в строке. При этом следует помнить что символы в строке нумеруются с единицы, а не с нуля:

 

Var

S, KvestText:String;

 

S:=Memo1.Lines.Strings[0];

KvestText:=s[1]+s[2]+s[3]+s[4]+s[5];

 

Возможно эта часть Вам и не пригодится, но знать о ней нужно. Теперь продолжим рассматривать другие составляющие квеста, которые также могут храниться и в базе данных и в текстовом фале и напрямую в программе.

 

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

 

Условия выполнения квеста нужны если прохождение разных квестов должны отличаться друг от друга. Например один квест должен быть пройдет на время (например 5 минут), другой – нужно победить 5 монстров, третий – заработать 1000 золотых монет и так далее.

 

Автор квеста – это тот, от кого персонаж получил задание. Нужен в том случае, если награда не дается автоматически, а за ней нужно возвращаться в таких случаях делается проверка на встречу с таким автором. Также иногда нужен номер квеста или его название, чтобы по таймеру проверять наличие текущих квестов и проверять их на выполнение.

 

Квесты могут представлять из себя массив записей. Запись примерно такого рода:

 

Type

TKvets=record

Text:String;

Usloviya:Integer;

Author:String;

Bonus:String;

End;

 

Var

Kvests:array[1..10] of TKvest;

 

Так мы создали массив заданий для персонажей (в нашем случае на 10 квестов). Далее эти данные нужно заполнить. Я заполню 1 пример и покажу как с ним работать:

 

Kvests[1].Text:=’Найди сундук’;

Kvests[1].Usloviya:=1;

Kvests[1].Author:=King;

Kvests[1].Bonus:=’zoloto’;

 

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

 

Pers.Kvest:=0;

 

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

 

If (Pers.x=King.x) and (Pers.y=King.y) then

Begin

Randomize;

i:=random(10)+1;

Pers.Kvest:=i;

Pers.TextKvest:=Kvests[i].Text;

Pers.Usloviya:=Kvests[i].Usloviya;

Pers.Author:=Kvests[i].Author;

Pers.Bonus:=Kvests[i].Bonus;

Pers.KvestVipolnen:=false; //kvest eshe ne vipolnen

End;

 

Этот код можно разместить или в таймере или где обрабатывается движение героя. Мы сделали так, что квест автоматически будет присваивать персонажу при сближении с королем, но правильнее сделать так чтобы появлялось окошко с текстом квеста и двумя кнопочками «принять» и «отклонить». Причем кнопочка принять должна быть активной только когда у персонажа нет уже взятого и еще не выполненного задания. То есть с учетом изменений код будет следующим:

 

If (Pers.x=King.x) and (Pers.y=King.y) then

Begin

Randomize;

i:=random(10)+1;

form2.Show;

Form2.Label1.Caption:= Kvests[i].Text;

If Pers.Kvest=0 then form2.button1.Enabled:=true

Else form2.button1.Enabled:=false; 

End;

 

Если нажали клавишу кнопку «принять»:

 

Pers.Kvest:=i;

Pers.TextKvest:=Kvests[i].Text;

Pers.Usloviya:=Kvests[i].Usloviya;

Pers.Author:=Kvests[i].Author;

Pers.Bonus:=Kvests[i].Bonus;

 

А если нажали кнопку «от клонить»:

 

Form2.close;

 

После того как задание получено, в таймере должна постоянно идти проверка на выполнение квеста примерно такая:

 

If Pers.Kvets>0 then

Begin

If (Pers.Kvest=1) and (Pers.Inventary=5) then  Pers.KvestVipolnen:=true;

If Pers.KvestVipolnen=true then ShowMessage(‘Иди за наградой к ’+Pers.Author);

End;

 

Используя ShowMessage будьте предельно осторожны. Ведь все что записано будет после него может не выполняться, поэтому все действия внутри одного алгоритма должны писаться до этой записи. Очевидно это недоработка разработчиков Делфи, но это не принципиально.

 

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

 

If (Pers.x=King.x) and (Pers.y=King.y) then

Begin

If (Pers.Kvest=1) and (Pers.KvestVipolnen:=true) and (Pers.Bonus=’zoloto’) then

Pers.Zoloto:=Pers.zoloto+1000;

ShowMessage(‘Вами получено 1000 золотых монет’);

End;

 

Также в этой статье на последок рассмотрим как создавать диалоги. Ведь это может очень пригодиться в квестах. Так же как и сами квесты диалоги заранее создаются и записываются в текстовый файл каждая фраза с новой строки. На каждую фразу соперника нужно написать несколько своих на выбор и на каждую из них ответ соперника также… А затем опять же при сближении нужно просто выбирать нужные фразы из Memo, в который загружен файл с диалогами:

 

Var

Dialog:String;

 

If (Pers.x=King.x) and (Pers.y=King.y) then

Begin

Randomize;

i:=random(10)+1;

form2.Show;

Dialog:= Kvests[i].Text;

Form2.Label1.Caption:=Dialog;

End;

 

Далее если нажат первый вариант ответа (нажата первая кнопка):

 

Dialog:=Memo1.Lines.Strings[1];

 

Form2.Label1.Caption:=Dialog;

 

Далее если нажата вторая кнопка, то внутр. нее (дважды кликнув по кнопке) пишем код:

 

Dialog:=Memo1.Lines.Strings[2];

Form2.Label1.Caption:=Dialog;

 

То есть получается что в зависимости от кликнутого нами варианта ответа, мы просто вытягиваем нужный ответ из текстового файла и отображаем его для чтения, а также если нужно и переименовываем кнопки вариантов ответов в новые варианты. Можно просто в зависимости от текста соперника сразу ставить нужные варианты ответов:

 

If Form2.Label1.Caption=’la la la’ then

Begin

Form2.Button1.Caption:=’nu nu’;

Form2.Button2.Caption:=’ogo’;

Form2.Button3.Caption:=’net’;

End;

 

Кликнув по одной из кнопок должен или выбираться новый ответ соперника или происходить каное-то дейтсвие – дача квеста, закрытие диалога, получение информации или бонусов и так далее. Это все прописывается внутр. Каждой кнопки.

 

Источник: delgame.at.ua

Категория: Игровые алгоритмы | Добавил: Armageddets (29.03.2014) | Автор: Как делать квесты в игре
Просмотров: 2623 | Теги: игра на делфи, прохождение игры, Как делать квесты в игре, и гровые задания | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Уроки по созданию каких игр Вам интересны?
Всего ответов: 167
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0