Собствена 2D независима игра в Delphi (7) без DirectX - лесно е! - Създаване на игри - Статии за създаване на игри
Статията ще бъде попълвана на части и не веднага (извинете, но създаването на пълноценна статия е много тежка интелектуална работа.)
Част I.Въведение.
Някои програмисти на Delphi (имах и това) понякога съжаляват, че са решили да овладеят тази конкретна среда за разработка, а не по-подходящи такива като C ++ или игрални машини като Unity. Това повдига въпроса, "Така че наистина ли си струва да започнете да разработвате игра в Object Pascal? Може би да започнете да научавате нещо друго?" Ще отговоря веднага - определено си заслужава. Винаги ще имате време да започнете да овладявате нещо ново, както се казва - няма граница за съвършенство. И натрупаните ви знания за Delphi не бива да губят. Да, напълно възможно е C ++ да е по-гъвкав и в него има много повече документация за създаване на игри, но ви уверявам, че и с Delphi можете да получите страхотни резултати. Един от най-добрите примери е Soldat 2D. В края на краищата основното нещо при разработването на игра все още е резултатът, а не начинът за постигането му (но също така е много важен).
Сега да започнем.
Сега вече сте избрали версията на Delphi (ще оставя избора на вас, защото мисля, че това не е толкова важен момент), създадохте папка за проекта и се надявам да сте поне двама. Сега ще разберем кое е най-важното в играта? Няма общ отговор на този въпрос. всеки във всяка игра харесва нещо различно. Някой харесва сюжета, някой харесва графиката, някой харесва музиката. Но когато създавате игра (или по-скоро игрален механизъм), една от основните точки е развитието на графичния компонент. В края на краищата играта е предимно компютърна програма, която показва цялата информация на монитор и както знаете, човек възприема повече от 90% от информацията с помощта на очите си. Ето защо в тази статия ще се опитам да ви разкажа възможно най-пълно за изпълнението на графики в моя проект, а останалото (звук например) ще оставя на вас.
И така, какво може да служи като графично ядро (освен DirectX) на нашия проект? В Интернет също има много отговори на този въпрос, но в тази статия ще се спра на библиотеката FastLIB (или по-скоро набор от модули).
Но не се страхувайте от този минус, защото дори на слаби стари процесори (имам стар едноядрен Pentium 4 - 3000 Hz) с няколко тежки специални ефекта честотата поддържа нормата на 60 fps. А голяма (много по-голяма) част от потребителите отдавна имат многоядрени машини.
Внедряване на FastLIB в проекта.
И така, как използвате библиотеката FastLIB? Всъщност най-трудното нещо, което срещнах в него, беше включването на алфа канала. Първо копирайте всички библиотечни модули в папката на проекта и ги включете в проекта чрез Delphi по какъвто и да е обикновен начин (отново ще оставя тази задача на вас). След това можете да отворите и изучите най-важния модул - FastDIB. Той описва най-важния клас - TFastDIB. Всъщност това е същият TBitmap, но насочен към получаване на по-голяма скорост при рендиране. И всички библиотечни функции се използват специално за този клас TFastDIB. Освен това, каквото и да използваме - било то текстура, или спрайт, или повърхност, то определено ще се основава на класа TFastDIB.
Част II.
Основни функции на класа TFastDIB.
Тъй като класът TFastDIB е обект, той трябва да бъде създаден в началото и унищожен в края. Това се прави с помощта на функциите Създайте и Унищожи. Необходимо е да се създаде обект веднага щом стане необходимо да се работи с него, но само веднъж, в противен случай ще се създаде нов обект, а предишният ще се загуби в паметта на компютъра. Също така трябва да унищожите същото само след като обектът вече не се използва и никога повече няма да бъде използван.
След като обектът е създаден, можете да го нарисувате на всяка повърхност. Има много функции за рисуване в класа TFastDIB (различни начини на рисуване), но най-елементарната функция е Рисувам.
Пример за създаване, изчертаване и унищожаване на променлива от тип TFastDIB:
В този пример ние правим спрайт към манипулатора на повърхността на прозореца с координати 0x0, но в кода няма пример, който да запълни нашия спрайт с данни. Тези. всъщност няма да получим нищо на прозореца си. За да нарисувате нещо, трябва да нарисувате нещо. В този случай има две опции - или първо чертаем нещо върху самия спрайт, или зареждаме картина от файл с помощта на функцията LoadFromFile.
Пример за създаване, зареждане, изобразяване и унищожаване на променлива от тип TFastDIB:
Забележка: тази функция може да зарежда само графични данни във формат * .bmp.
Също така е възможно да запишете резултата с помощта на функцията SaveToFile.
Нека разгледаме всички възможни методи за изобразяване и техните функции:
Рисувам(fDC: HDC; x, y: Integer) - копира съдържанието на TFastDIB в дескриптора fDC в координати [x; y];
Опъвам, разтягам(fDC: HDC; x, y, w, h: Integer) - разтяга съдържанието на TFastDIB до дескриптор fDC в координати [х, у] широк w и височина з;
TransDraw(fDC: HDC; x, y: Integer; c: TFColor) - копира съдържанието на TFastDIB в дескриптора fDC в координати [x; y] с изключение на пикселите с цвят ° С;
TransStretch(fDC: HDC; x, y, w, h: Integer; c: TFColor) - разтяга съдържанието на TFastDIB до дескриптор fDC в координати [х, у] широк w и височина з с изключение на пикселите с цвят ° С;