It's Pac Time!

1 седмица.
Пакман.
C++.

Post mortem.
Надолу има картинки и архив с играта.
Направо към картинките.
Направо към игричката.

Това е Post mortem за моята версия на Пакман.

Какво е post mortem? Буквално означава аутопсия(йей, положително мислеща гейм индустрия!). Това се прави когато една игра е завършена. Един вид равносметка.

През последната седмица писах Pacman.
Получи се на 90% каквото исках да се получи.

Screenshot-Pacmaaan!.png

Но да започнем по ред.

Какво е Пакман?

Какво е Пакман?
КАКВО Е ПАКМАН?
Ти не знаеш за най-великия герой в историята на компютрите? Махай се оттук, не искам да те виждам повече. Сериозно, махай се, звъня на бърза помощ и отивам да си взема касапския нож.
… оня тръгна ли си? Добре, мразя го тоя.

Всеки в някой момент е чувал характерното Wakka-wakka-wakka-wakka.
Е, моят компютър технически нямаше звук в онези години, но говоря принципно.

Време

Една седмица.
Имам проблем.
Очевидно, когато върша нещо интересно, не мога да го оставя докато не е свършено. Обсесивно разстройство на максимум.
Не звучи толкова зле, но буквално не мога да правя нищо друго. Предполагам на хората около мен им е било скучно да разговаряме последните седем дни, защото съм говорел само за едно и също.
Знам, не звучи като нещо реално негативно, но си лягах в 6 и ставах в 10. Преди часовника. Сега съм планирал да си почивам няколко дни, за да не се повредя още по-зле.
Не че съжалявам за свършената работа, де.

Какво се получи добре?

  • Има Пакман. Той се движи по забележимо удобен начин по дъската. Ако се движи в хоризонтален коридор и играчът натисне, например "нагоре", то в първия момент, в който е възможно движение нагоре, Пакман ще го извърши. Т.е. в никой момент не е нужно да се задържат клавиши.
  • Има четири призрака. Те са с оригиналните си алгоритми от седемдесетте години. Сериозно, ти въобще знаеше ли, че всеки от четирите призрака има уникален алгоритъм? Съмнява ме. Та, поразрових се и възстанових оригиналните. Дълго време се чудех дали да напиша и бъговете в тях, но в крайна сметка реших да не1. Твърде незабележими бяха. Впрочем, поздрави на всички хора, които специално ме попитаха дали съм включил бъга с розовия призрак и бъга със завиването на Пакман. Имам наистина хардкор познати :)2
  • Има лабиринт. Нещо повече, има лабиринт, който не е бъгав по никакъв забележим начин. С точки в него и т.н.
  • Има проклетия Cruise Elroy!! Ако не знаеш кой е Cruise Elroy, не се притеснявай. Но все пак го има.
  • Играта реално е хубав, работещ Пакман. Има нужда от още полиране, но всички основни части са на лице и нещата, които не са готови, могат да се сложат сравнително лесно. Т.е. кодът ми не е пълен боклук(макар и да не е чак мечта, реално).

Какво се обърка

  • Нещата, които съм слагал през последните 2 дена са със забележимо по-ниско качество от тези в началото. Просто бях преуморен, предполагам. Уплашените призраци(когато Жълтият ни приятел може да ги яде) са малко бъгави. Ако играчът натисне пауза докато са уплашени, таймерите им не спират. Което си е кофти и се оправя лесно, но това за следващата версия. Явно мога да действам под напрежение(т.е. повече от няколко часа на ден) до 5 дена.
  • Memory Leaks… В общи линии, всяко място, от което можеше да изтече памет - е, изтече. Ето затова никой не пише на C++. Подобрението в скоростта е толкова незначително, че само за игри със сложност от ранга на Crysis си струва(но, реално, дори и там използват скриптови езици). А когато в програмата ти се появи дупка, за 15 минути тя заема 200 мегабайта RAM. Знам, знам, аз съм некадърен програмист, на *истинските* майстори не им тече паметта. Иди до най-близката дупка, заври се с главата напред, задуши се и умри. Обичам те :)
  • Има само едно ниво. Т.е. в оригиналния пакман също има само едно ниво. Но призраците стават по-бързи с времето. При мен винаги са еднакви. Това ще се оправи лесно, в момента, в който спра да мразя играта :)
  • Дребни детайли липсват. Черешките, които Пакман яде и т.н. Неща, за които не остана време. Отново, това е лесно, но е за после.

Какво научих

  • Защо и как се ползват .h файлове. Incremental Compilation. В общи линии, как наистина се правят програми. Така де, на състезания по информатика научаваш нещо, но то не е точно това. Е, и преди си имах някаква идея, но сега вече съм го тествал на практика и знам защо нещата се правят точно така.
  • Makefiles. За какво са, как се пишат и т.н. Тези неща спестяват адски много главоболия, впрочем.
  • Как се прави движение независимо от рисуването. Т.е. ако компютърът ти е як, играта ще рисува 60 кадъра в секунда, а героите ще се движат по 100 пъти в секунда(вместо 60/60 ако беше направено по тъпия начин). Ако компютърът ти е кофти, ще се рисува по 20 пъти в секунда, но героите ще се движат пак по 100(вместо 20/20). Движението на героите изисква много по-малко процесорно време от тяхното рисуване. Това е вярно и за по-големи игри.
  • Как се прави почти правилно OOP. Обектно-ориентираното програмиране е нещо толкова забулено в мистерия, че не съм чувал и за един човек, който е успял да го направи правилно. Но архитектурата на класовете ми беше сравнително сполучлива, т.е. не се налагаше да пиша много неща по 2 пъти и почти нищо не трябваше да го пренаписвам в последствие. В общи линии това е: Имам базов клас Актьор. Той се грижи за рисуването на героите по екрана, както и за тяхното правилно движение(т.е. да не излизат през стените и т.н.). Него го наследяват 2 класа - Пакман и Призрак. Двата класа имат различни поведения в редица ситуации - например Пакман може да завива назад, а призракът не(освен точно в момента, в който се уплаши). После има четири класа, всеки от които наследява Призрак(по един за всеки от 4-те призрака…duh). Тези класове предефинират начина, по който съответния цветен чаршаф гони жълтата топка. Ако беше написано на друг език, това нямаше да е нужно. Но oh well, C++'est la vie. Има и разни помощни класове, за зареждане на картинки и т.н. …
  • Как се прави tile-based collision detection. Много ми хареса тази част. Няма бъгове, правилно се изчислява… Бих могъл да използвам това и в други игри.
  • Как се правят 2D игри. Написах си малко функцийки, които и другаде биха били полезни.

По-интересната част

Ето ден по ден разбиване на свършената работа. С картинки.

Ден Първи

Screenshot_day_1.png

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

Ден Втори

Screenshot_day_2.png

Започва да се очертава как ще са представени плочките в играта. В оригиналния Пакман засичането на сблъсък е на ниво плочка(не на ниво пиксел). Реално, в повечето игри някога правени, това е така. Включително 3D екшъните, включително ролевите игри - всичко. Просто е твърде голяма играчка да се прави пиксел по пиксел, освен това забавя цялата игра 10 пъти, а на всичкото отгоре… никой никога няма да забележи разликата :)

Ден Трети

Screenshot_day_3.png

Знам, изглежда отвратително. Все пак, това е истинското ниво в играта, просто още не е достатъчно красиво. Ще стигна и дотам. Аз съм програмист, не художник, ок? Приоритети! Та…
Вече си имам специални функцийки за зареждане на нивото. То се пази в един файл(level.map) и може да се променя по желание на играча :) Просто казвам, ако на някой това му е интересно. Има си и "Пакман". Това обаче е малко измамно. Така де, реално на ден 3 точките не можеха да се ядат(бяха просто декор), а Героят не можеше да се движи. Или по-точно, можеше да се движи, но го правеше с идиотска скорост, игнорирайки всякакви стени. Просто летеше в пространството. Май ще се окаже, че през повечето време просто съм вземал супер-способностите на Пак, една по една…

Ден Четвърти

Screenshot_day_4.png

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

Ден Пети

Screenshot_day_5.png

А? А? Кой е шефа на картинките :) Нарисувах си собствени Пакман, Призраци и Подземие(ППП). Вече изглежда доста по-добре. На картинката Пакман не изглежда правилно, но това се дължи на начина, по който се записват Screenshot-овете. Т.е. в играта реално няма такова отрязване.
Също така, о Йей, имам си един призрак. Кодът още далеч не е готов, но поне може да се движи насам-натам не много бъгаво. Най-яката част от ден 5 беше идеята, която имах за рисуване на подземието. Динамично му се определя кой спрайт(картинка) да се сложи на коя плочка. Т.е. ако ти си направиш ниво, то ще бъде оцветено кажи-речи както това. Типично състезателна задача реших с това нещо :)
Стените, които нарисувах, не са най-перфектното нещо на света, но за момента ми харесват. Изглеждат малко Арт, йей :)
Пакман е забележимо безсмъртен. Дънкан Паклауд.

Ден Шести

Screenshot_day_6.png

Вече имам 4 призрака. Също така, Energizers(големите точки, които правят Пакман по-силен). Призраците са трепач, Енергиите даже работят почти правилно. Нарисувах си различните призраци(преди беше само червеният), дебъгвах разни глупости. Играта вече може да се играе. Пакман вече може да бъде изяден :`(

Ден Седми

Screenshot_day_7.png

Призраците мигат малко преди да им свърши уплашеното. Сори, това още е малко бъгаво, така и не го оправих докрай. Има текст по екрана от време на време. С F2 се пуска нова игра. С P е пауза. Показват се точки. Тези неща ми изгубиха толкова много време… Заради глупости в SDL започна да ми тече паметта по изключително груб начин. Не от призраците. Не от точките по полето. От надписите. Йей. Колко яко да пиша на C++ и винаги да съм на пръсти дали няма да се счупи някаква тотална глупост. Но, казал съм си, че този проект ще е на C, значи така ще бъде. Във всеки случай, станах по-кадърен след тази седмица.
В крайна сметка, програмата не хаби идиотско количество памет. А и нямам намерение да го оптимизирам - който няма 8MB RAM на Уиндоус(4 на Линукс), да отиде да си купи нов компютър. Оригиналният Пакман е бил написан на Асемблер… за година и половина. С Ц++ ми трябваше седмица, на Питон щях да съм готов за три дни.


Най-интересната част

Ето текущата версия на играта. В крайна сметка, това е проверката дали нещото, което съм направил си струва. Не беше лесно да се направи, но предполагам точно затова на мен лично ми харесва.
Играта. Йей.
Сорс код. Винаги е добре да откраднеш идеи от някой, който вече го е правил преди теб. Само внимавай да не откраднеш точно тъпите части :) Компилира се под Уиндоус, както и под Линукс. Ползва SDL, SDL_image, SDL_ttf.

Писал съм го на Линукс, естествено. Ако бях работил на Уин, може би и месец нямаше да ми стигне.

Това тръгва под Wine, впрочем. Ако някой има Линукс(Всичките двама души), но не му се занимава да компилира.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License