Свободен форум

Начало » Игри » Как да напишем браузърна RPG игра

Как да напишем браузърна RPG игра

Следва серия от ръководства за това как да напишем браузърна RPG игра. Езикът, който ще използваме е познатият и обичан PHP.

От какво се нуждае една игра:

- играч;

- герой/герои;

- NPC (Non playing characters) (в това число противници и помощници);

- предмети (оръжия, брони, щитове, джунджурии и всякакви други);

- свят - място където да се развива действието;

- история;

Това са основните съставки на нашето RPG. Може и да съм пропуснал нещо но ще го уточним в течение на работата.

Следва да разгледаме по отделно всеки един от компонентите

28-03-2011 13:31 #576
[] [редакция]

Играч - Re:Как да напишем браузърна RPG игра

Играчът е основната фигура, която взаимодейства с играта. Той трябва да се идентифицира по някакъв начин като най-често това става с потребителско име/e-mail и парола. Алтернативи на тази оторизация са O-Auth (Facebook, Twitter, Googlе и.т.н.), клиентски SSL сертификати, HTTP Basic access authentication и други;

HTTP Basic access authentication - се използва много рядко в онлайн игри, поради няколко причини:

- сравнително труден е за поддръжка

- използва браузърни диалози за оторизация, които не позволяват никаква промяна;

- несигурен е, използва само Base64 кодиране на данните;

Клиентски SSL сертификати

- предлагат много добра сигурност (само притежателят на сертификата може да използва акаунта);

- трудна и тромава процедура по инсталиране за потребителите; сертификата трябва да се инсталира на всеки браузър, на който ще се играе;

O-Auth - напоследък широко използван метод;

- един акаунт за много услуги (обикновено играчът вече има акаунт в някоя от популярните услуги: Facebook, Twitter, Google и.т.н.);

- не всички O-Auth доставчици следват стриктно стандарта (т.е. трябва да се пише повече код за по-широка съвместимост);

- не всички потребители имат акаунти в услугите на доставчиците т.е. трябва да се осигури алтернатива на потребителите;

Класически метод с регистрация на акаунт;

- това е най-гъвкавият метод за оторизация на потребителите;

- може да се направи сигурен ако се ползва SSL;

- интуитивен (макар и досаден) за по-голямата част от потребителите;

Най-добрият вариант е комбинация от последните два метода. За съжаление това изисква повече програмиране и е извън обхвата на това ръководство, така че ще се спрем само на класическия метод.

Играчът трябва да има следния необходим минимум от възможности;

- регистрация;

- вход;

- изход;

- промяна на парола;

- възстановяване на изгубена парола;

Необходимия минимум данни за него са:

- e-mail;

- парола;

Ще използваме e-mail вместо потребителско име за да "спестим" едно поле и на себе си и на играча/. Недостатъкът на този подход е че e-mail адреса обикновено е по-дълъг от потребителското име.

29-03-2011 05:15 #712
[] [редакция]

Свят - Re:Как да напишем браузърна RPG игра

Свят - Светът е мястото, където се развива действието на играта. Светът може да е ограничен или безкраен, ръчно изработен или автоматично генериран, плосък или триизмерен.

В нашият случай ще изберем ръчно изработен свят, съставен от карти като всяка карта е съставена от плочки (tiles) с декартови координати двете координати на всяка плочка ще са положителни числа по x и y. Еднослойната карта може да бъде много скучна, така че може да помислим за много слоеве. Важен въпрос е къде ще съхраняваме картите.

- във файл: бърз но най-често неудобен достъп (освен ако не го направим удобен). Неудобен, защото за да изчертаем картата на екрана, обикновено се нуждаем от област от координати.

- в БД: удобен достъп, можем да оставим базата да се грижи за изчисляването на координатите. Нужна е администрация за промяна на картите или функции за импорт/експорт. Лесно се променят програмно.

Как ще рисуваме картите?

Можем да направим редактор на карти но това не е лесна работа и в нашия случай не си струва. Ще използваме Tiled (http://www.mapeditor.org/), безплатен редактор с отворен код и впечатляващ набор поддържани формати.

Все още не съм решил къде ще се съхраняват каритите, така че няма да фиксираме това решение засега.

Колко карти са ни нужни?

Ще ни е нужна поне една карта на населено място, със съответните сгради, търговци и т.н. и по една карта за всеки “остров” или открито пространство. Връзката между отделните карти ще се осъществява чрез портали (най-вероятно в населените места).

29-03-2011 12:03 #707
[] [редакция]

Герой - Re:Как да напишем браузърна RPG игра

Героят е аватара на играча във виртуалния свят. Той трябва да е добре балансиран, с много възможности, които да реализира в хода на играта. Героят е комплексна единица, с много възможни характеристики, които го описват:

- Ниво (level). Нивото е дискретна единица, описваща прогреса на героя. Обикновено е обвързано с “опит” като за определени стойности на “опит” се инкрементира нивото, което води до промяна и в други параметри;

- Опит (exp, experience) - опитът е величина, указваща прогреса в играта. Опит се получава обикновено при битки, решаване на загадки, откриване на нещо скрито. В повечето случаи опитът е основната величина, движеща героя към развитие.

- Раса (class) - расата не е задължителна но присъства в много от игрите за да даде на играчите възможност да предпочетат един или друг стил на игра. Расата обикновено определя началните стойности на характеристиките, коефициентите им за промяна, възможността да се използват едни или други оръжия/защити или бонусите получавани при използването им.

- HP (hit pointegers) това са точките удари/зловредни влияния, които героят може да поеме преди да умре/има нужда от почивка или друго наказание предвидено в играта. Присъстват в почти всички игри. Обикновено горната граница нараства в течение на играта.

- MP (magic pointegers) точките, необходими за изпълнение на магия. Особено важни са за магическите раси, които разчитат на магията за основно оръжие и защита. Държат се като HP.

- TP (travel pointegers) точките за пътуване не са задължителни но често се използват в браузърните игри за да предпазят играта от “бързо превъртане”. Те се използват при движение по картата или движение между картите. Горната им граница се променя, подобно на HP и MP.

- Автоматично лекуване (autoheal) автоматичното лекуване се използва за време-базирано възстановяване на HP. Това е главно удобство за играча, който получава още една възможност да “вдигне героят” си дори да няма налични средства.

- Пари (gold) - парите са стандартна характеристика, но обикновено не са основна цел в този род игри а по-скоро средство за постигането на развитие;

- Атака/защита (attack/defence) - използват се при битки и зависят до голяма степен от използвания инвентар;

Героят може да има още много характеристики в зависимост от жанра и типа на играта. Винаги можем да измислим нова характериситка стига да подсигурим метод за управлението и и приложение.

30-03-2011 03:41 #709
[] [редакция]

NPC - Re:Как да напишем браузърна RPG игра

NPC са всички същества с които можете да взаимодействате в играта. Те могат да бъдат.

- фон: просто разни лентяй които се размотават окола вас

- търговци/шамани и други шарлатани: от които можете да купувате/продавате/учите/получавате разни неща;

- противници - или т.нар. чудовища. Срещу тях се биете и в случай на победа може да получите награда

- босове - босове са пак противници но обикновено по-силни и обозначават преломен момент в играта. Обикновено босовете се убиват само по веднъж от играча т.е. те са индивиди за разлика от другата паплач, която най-често се генерира динамично и никога не свършва;

Всеки тип NPC изисква собствена обработка като най-трудни са търговците (тъй като имат различни специфични изисквания) и противниците където трябва да се разработи един от най-важните и трудни елементи в играта: битката.

30-03-2011 13:43 #711
[] [редакция]

Герой - полета в БД - Re:Как да напишем браузърна RPG игра

id integereger not null autonumber, /* идентификатор на героя */

user_id integereger not null, /* идентификатор на потребителя, на който принадлеи героя */

name varchar(50) not null, /* име на героя, макс 50 символа */

level integereger default 0, /* ниво на героя */

exp integereger default 0, /* опит */

created timestamp DEFAULT CURRENT_TIMESTAMP, /* дата-час когато е създаден героя */

last_online timestamp DEFAULT null, /* дата-час когато е последно е използван героя */

status varchar(30) not null, /* последен статус */

status_ref_id integereger not null DEFAULT 0, /* указател на последен статус */

map_id integereger default 1 /* карта, на която се намира героят */

map_x integereger not null default 0,

map_y integereger not null default 0,

_data text default '{}' /* Всичко друго в JSON стуктура */

Малко разяснения по (псевдо) схемата. Използваме отделна таблица за потребителите и героите поради няколко причини:

по-чисто е така данните за пароли и e-mail нямат работа при информацията за героя;

по-"сигурно" поради горната причина;

един играч може да има повече от един герой. Неизменно ще се стигне до този момент, в който някой от играчите ще иска да смени героят си. Затова ще го изпреварим и ще му дадем възможност да си прави колкото желае герои. Това ни позволява да организираме и споделяне на ресурси между героите на един играч.

името на героя мисля че не се нуждае от разяснения. Ограничаваме го до 50 символа, което би трябвало да е достатъчно.

ИДЕЯ - играчът може да укаже обща фамилия за всичките си герои. Примерно "Пачикраков" и няколко героя: Мунчо Пачикраков, Пунчо Пачикраков. Така неговата орда ще бъде по-познаваема.

Ниво и опит са си характеристики на героя но са изнесени в таблицата, защото може да се наложи да сортираме героите по тях.

created запазва момента на раждането на героя (винаги е добре да се знае за да почерпи на рожденния си ден:)

last_online ще се обновява при всяка промяна в таблицата с текущите дата-час; Така ще знаем кога последно е използван героят;

status тук нещата стават малко мъгливи. Специфичното при нашата браузърна игра е че на всеки ход от страна на играча трябва да съхраняваме цялото състояние на играта, като не можем да рачитаме на клиента да пази нищо. Реален пример: играчът влиза в битка и в този момент влиза майка му да му се кара защо не си е написал домашните, при което той затваря браузъра. Когато си напише домашните (или майа му затвори вратата) ние трябва да можем да прдължим играта от момента, до който е стигнал (или до последен checkpointeger. Затова ще използваме двете полета status (контролера/метода които ще използваме) и status_ref_id (указател към конкретен елемент ако е нужно)

map_id, map_x, map_y са съответно карта, и координати на които се намира героя. Ще са ни необходими за движението му и при определяне на "съседни" герои.

_data: сигурно сте забелязали че изпускаме сума ти характеристики като HP, MP, TP, атака, блок и.т.н. тъй като промяната на структурата на базата е особено досадно а и някой полета са ни нужни само в контекста на определен герой (т.е. не ги използваме за група или всички герои), всички допълнителни полета ще записваме като JSON сериализиран хеш масив в полето data.

Малко пояснения върху "JSON сериализиран хеш масив";

хеш масив е списък с наредени име => стойност; сериализиран означава че е структурата е превърната в текст, който след това отново може да бъде превърнат в структура на езика (десереализация); JSON принципно е JS стандарт за сериализация на обекти. Имаме и други варианти тук: xml, serialize фунцкията на PHP, собствен формат .. но последният път като проверявах JSON функциите работиха най-бързо а и ще ползваме JSON на доста места в играта, така че той остава най-разумният избор;

31-03-2011 02:54 #710
[] [редакция]

Инструменти - Re:Как да напишем браузърна RPG игра

Инструменти, които ще използваме в проекта:

- [CodeIgniter Reactor](http://codeigniter.com/) - за PHP framework; Преди време си пишех всичко сам от нулата. След това използвах нещо като собствен framework за проектите си. След това открих CodeIgniter. Разбира че ако правите игра, ще искате тя да е максимално бърза и ненатоварваща, затова може би най-добрият избор е писане на PHP без framwork, който да заема памет и да бави заявките. Прави сте разбира се. Но ако тръгнем по този път, въобще не бихме избрали PHP. По-подходящи биха били Python (заради Twisted), Java (заради application сървърите), NodeJS (.. заради себе си) но в случая сме избрали PHP, затова искаме да вземем най-доброто от него. CodeIgniter е сравнително лек, предлага кеш provider-и, и url-routing, добра абстракция за работа с БД а е и лесен за научаване. Така че това е моят избор.

- [vim](http://www.vim.org/) - за текстов редактор; По принцип използвам NetBeans за разработка но повечето неща в това рководство пиша на Lenovo S10e, който е с 10" екеран, 1 GB RAM и Atom процесор 1.6GHz. Затова vim e разумният избор в моят случай. Разбира се можете да използвате който редактор пожелаете.

- [github](http://github.com) - за хостинг, source control и bugtracking; Харесвам Google Code но за съжаление Google не поддържат git, а subversion ми е доста по-неудобен за работа. GitHub е едно прекрасно място, затова и моят първи избор;

- [Gimp](http://www.gimp.org/) - за нашите растерни нужди. Има всичко, което ми е необходимо. Не съм дизайнер и Gimp ми е достатъчен.

- [InkScape](http://inkscape.org/) - за нашите векторни нужди; Лек бърз и удобен.

- [wwwsqldesigner](http://code.google.com/p/wwwsqldesigner/) - за схемата на БД; Много удобен инструмент за създаване на прототипи на БД. За съжаление не е особено популярен и може би затова автора не го е завършил но за нашите цели е идеален.

- [MySQL](http://mysql.com) - за БД. MySQL защото е бърз и лек. Предпочитам PostgreSQL но за съжаление на моят хостинг връзката към Postgre сървъра е отчайващо бавна дори с pconnect. Ако предпочитате друга база, не би трябвало да има проблем. Ще се опитам да не използвам MySQL специфични заявки така че прехвърлянето би трябвало да е лесно.

31-03-2011 04:13 #706
[] [редакция]

Градът - Re:Как да напишем браузърна RPG игра

Градовете, респективно селата, паланките и.т.н. са нервните центрове на играта. Тук се извършват почти всички не-батални действия. Градовете най-често са предефинирана част от картите, ни има варианти, в които играчите могат да основат собствен град, което наклонява малко везните към икономическа стратегия.

Класически елементи на градския пейзаж:

магазин за оръжия - основният дилър на оръжия в квартала. Работят с висок марж на цените за да не се изкушавате да лежите по цял ден и да живеете от прекупуване на боздугани. Обикновено магазините предлагат базовите оръжия за определено ниво трудност. В случай че се продава специален предмет той обикновено е на много висока цена, която рядко си заслужава.

магазин за брони - може да е отделен а може да е комбиниран и с този за оръжия. И в двата случая работи на същите пазарни принципи;

мистичен храм/магическа школа/колибата на стария Оз - е мястото където се купуват/научават нови магии. Това е основният източник на арсенал за магическите раси. Работят на същите пазарни принципи като другите. Може да продават и разни билки и отвари за вдигане на това онова.

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

болница/хоспис/хотел/хостел/таверна - възстановяват характеристиките на героя към номиналните нива срещу определена сума.

арена: обикновено в населените места не се провеждат битки, освен в определените за това места. В арената могат да се намерят противници с които да премерите сили. Противниците са или автоматично генерирани или други играчи. Някой игри използват арената за придобиване на допълнителни бойни умения и бонуси.

свободен пазар - ако е позволена търговия, между играчите то тя се извършва тук. Един истински малък Уолстрийт, където можете да купите и продадете почти всичко срещу пари (разменната търговия не е застъпена почти никъде).

транспортна фирма/логистични услуги/Джо Камилата - ще ви прекарат някъде ако имате достатъчно пари.

подземия, канали, вертепи - в някой игри градовете имат подземно ниво, което обикновено е свързано с различни задачи, които трябва да изпълните.

Градът може да има собствена карта, където магазините са разпръснати по уличките или всички да са в един мегамол и градът да е представен само с меню за избор. Не е задължително всеки град да притежава всички елементи, дори е по весело когато има частични съседни градове, които заедно допълват целия комплект. Така играчът трябва да кръстосва насам натам (или да си плати) за да получи желаната услуга.

01-04-2011 02:39 #708
[] [редакция]

Предмети - Re:Как да напишем браузърна RPG игра

Предметите в ролевите игри играят важна роля за балансирането на героя. Разнообразието от предмети обикновено е голямо но най-общо те могат да се разпределят в следните категории;

- оръжия (или предмети служещи за оръжия, някой хора правят чудеса с обикновена пръчка). Оръжието най-често определя силата на атаката а в някой случаи и вида на атаката (огнена, водна и.т.н). Могат да се класифицират по следните признаци:

- според износването си:

- износващи се

- не-износващи се;

- според дълготрайноста си:

- вечни;

- поправими;

- непоправими;

- според нуждата от амуниции;

- самодостатъчни

- нуждаещи се от амуниции;

- според големината си;

- за една ръка;

- за две ръце;

- според възможностите за подобряване;

- фиксирани

- разширяеми (подобряеми) через слотове, сокети и.т.н.

- според груповата си принадлежност;

- част от комплект;

- самостоятелни;

- според типа си;

- ръце;

- пръчки;

- камъни;

- мечове;

- ножове;

- алебарди;

- боздугани;

- копия;

- пики;

- лъкове;

- магически жезъли;

- и.т.н (арсенала зависи от епохата)

- брони - осигуряват защита на героя в битка. Могат да са носител и на допълнителни бонуси;

- ботуши , ръкавици, наметала, щитове, шлемове, колани - обиновено защитни елементи. Не са задължителни но позволяват по-прецизно регулиране на защитата и допълнителните бонуси;

- амулети/пръстени и всякакви други накити - най-често носят допълнителни бонуси в някоя характеристика (може да имат и частичен негативен ефект върху друга).

- колби/хапчета/билки/инстантни магии - са предмети с непосредствен ефект върху героя, Обикновено променят еднократно или в рамките на определен период характеристика на героя.

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

Производство и пласмент.

Предметите се “произвеждат” служебно в магазините или като награда след битка от противниците. Продават се най-често в населените места или от пътуващи търговци в пустощта. Стойността им може да бъде в една или в комбинация от всички валути в играта.

Не трябва да се пренебрегва и възможността за изработка на предмет от самия играч. За целта ще нужна система от занаяти, които той да усвои предварително. изработените предмети могат да се ползват или да се продават на свободния пазар. Това би могло да осигури постоянен доход за играча.

02-04-2011 08:25 #705
[] [редакция]

Re:Как да напишем браузърна RPG игра

02-03-2015 00:44 #4678
 

млкмлкм

клнмлк;клкллклкклкл

26-01-2016 21:23 #5710
 

Отговор

*

За да вмъкнете изображение, напишете URL с i отпред ihttp://

Leave thiz field empty
Top Site Counter

Powered by scif