Початкові тексти ігор (240). Чому я пишу ігри на C (так, на C) Ігри мовою сі

Запитання: Що порадьте для створення ігор з нуля?


Доброго часу. Нещодавно був натхненний іграшками на кшталт Papers, Please і Hotline Miami. Є своя ідея створення гри. Але річ у тому, що не знаю на чому краще писати. Гра задумав з видом зверху, не 3D, для ПК. По роботі пишу на 1С, але с-ка не для ігор, хоча якщо дуже постаратися можна, також вивчав самі ази Java. Я розумію, що спочатку краще спробувати зробити щось просто, типу хрестики-нуліки або змійку, щоб отримати базові знання.
На просторах інтернету пропонують використовувати C + +, але також пропонують використовувати C # + XNA. У кого є досвід у створенні ігор, порадьте літературу або дайте якісь поради щодо програмування ігор з нуля.

Відповідь:

Повідомлення від MonteKristo

порадьте літературу

На жаль російською дуже мало літератути, тим більше якісної. Перекладають далеко не все, не відразу, а буває, що не якісно. Буває, що переведуть книгу за два роки після виходу оригіналу, а вже вийшла нова версіяоригіналу та перша застаріла. Тому я вивчаю англійську та перекладаю за допомогою Lingvo та translate.google.com актуальні книги

Шукати книги зі створення ігор різними мовами та технологіями можна тут:

Але не в жодному разі не починайте з книг з категорій: Progressing та Mastering

Що якийсь розділ означає можна дізнатися якщо клікнути "i". Можна ще безкоштовно завантажити приклади після реєстрації. Я це показав на малюнку:

Питання: Створення гри мовою Сі?

Відповідь: Додано через 30 хвилин

Повідомлення від HighPredator

Взагалі на сі можна написати все. Було б бажання, мізки та час.

Бажання є, мізків немає, час шукатиму >< Благодарю!

Повідомлення від McFair

Так само можна самому почати без движка ще вивчати Opengl, створити пару тетрісів, і дивишся зрозумієш що до чого.

Відчуваю доведеться писати движок самому

Повідомлення від McFair

7.Невідомо, нібито частину малюнка вирізати і накласти на куб?

Так, відмалювати об'єкт і відтектурувати його, наклавши зображення.

Повідомлення від cyber-satyr

GTK, наприклад, крос. А так, для венд юзай winapi, там чисто сиший інтерфейс.

Дякую! Це я й мав на увазі

Повідомлення від McFair

8.Більше залежить від гри, цілей і стилю програмування, все потрібно враховувати, якщо брати один і той же проект на сі і шарп то звичайно сі набагато виграє, але в шарпі швидкість розробки на 2 \ 3 по-моєму підвищиться.

Непоганим вибором напевно буде поєднання їх. Основу писати на шарпі, а на Сі докручувати фітчі?)

Запитання: Створення ігри ММОРПГ


Здрастуйте. Нещодавно створював тут тему, де дізнавався про створення гри 2д.
Все ж таки я вирішив дізнатися, в якому напрямку мені вчитися.
Ось 2 скріншоти:
http://kape.cc/uploads/posts/2011-05...a630f08343.jpg
http://mmohuts.com/wp-content/galler..._07.jpg?bb7a3b
І відео:

Мені потрібно зробити подібну гру. Загалом, локація – системою сітки. Локація поділена на деякі кубики
Я розумію, що потрібна графіка, звуки, звукові бібліотеки, але для початку візьмемо звукові бібліотеки.
Забудьте про графіка (вона допустимо є), є звуки.
Хочу запитати, чи задовольняє зв'язка з +++ OpenGL моїм вимогам та створенню схожої гри, А саме: пересування об'єкта по клітинах з анімацією, зіткнення об'єктів, взяття графіки зі спрайтів + ​​скелетна анімація (голий персонаж + прив'язка предметів – графіки, до тіла персонажа (одяг)).

Відповідь: 8Observer8, ніколи не любив фізику, поки не зрозумів, що вона така необхідна ... Але зараз, я зрозумів, що Box2D для моєї задуманої гри точно не потрібен ... Дивився документацію на SFML, після, сьогодні потикав попередній напрацювання і зміг зробити щоб взаємодіяв зі стінами, скільки щастя було)) Просто витратити прийшло близько 1-2 години щоб зрозуміти як це зробити, але це того варте.
До речі хочу спробувати зробити хоча б перший рівень бомбермена)

Додано через 10 хвилин
P.S. паралельно вивчаю c++

Запитання: Порадьте літературу зі створення ігор від початку до кінця


Порадьте літературу зі створення ігор від початку до кінця. З усіма елементами, на + можна. Тільки нову книгувидавництва 2010-2015 року

Відповідь:А ви що для малювання використовуватимете: DirectX чи OpenGL? Я дивився є спільні книги з теорії ігор ->. Якого плану ви будете ігри писати: 2D, 3D, RPG, стрілялки, гонки, шахи, го? У всіх цих ігор специфіки різні

Питання: створення гри


Здрастуйте, задумав зробити простеньку гру (rpg). Робитиму просто "Для себе". Гра буде статична (bmb картинки персонажів, об'єктів і т.д, можливо gif) Коли почав ритися в інтернеті в пошуках того, як це взагалі робиться, знайшов купу готових компонентів для delphi (наприклад delphix) і тому у мене виникло питання, чи варто використовувати щось подібне? Чи краще все самому вимальовувати на canvas?

Відповідь:

MrDmitry,
Статична гра? Це щось нове у програмі будівлі.
Якщо вона і в правду така, то вам вистачить TImage.
А якщо все ж таки це динамічна гра то вам знадобиться TPaintBox.

Мало хто знає але у помсті з Delphi поставляються приклади програм включаючи 3 міні-ігри!

У Windows 7 натисніть пуск | Усі програми | Embarcadero RAD Studio XE5 Samples.

У мене ця папка
C:\Users\Public\Documents\RAD Studio\12.0\Samples\

Що стосується компонентів та двигунів.
Про компоненти одразу забудьте. Немає компонента який зробить за вас гру. Гра пишеться руками та головою.

Що стосується двигунів. Двигун прискорює розробку.
У движку ви знайдете купу готового коду. Двигун треба підбирати під гру.

Від двигуна раджу подивитися математичну та геометричну бібліотеку. Бібліотеку для роботи з континентом та мультимедіа. Які формати файлів підтримує програма?
Підтримка камери. Підтримка спецефектів.

Ви не сказали 2D чи 3D гра.
Наявність відсутність підтримки спрайтів, білбордів. Виведення тексту.

Додано через 14 хвилин та 34 секунди
Думаю, вам буде цікаво. Є сайт відвіданий створення ігор.

Тут можна і підглянути і запозичити як ідеї для гри, так і ідеї реалізації.

Питання: Створення мови у Visual Studio


шукаю зрозумілі покрокові приклади/уроки зі створення мови у Visual Studio.

Знайшов приклад мови, але мені треба зрозуміти що, як і навіщо, т.к. мій асм мало схожий на око.

--
Потрібно взагалі:
"Кросскомпілятор" зі свого асму в студії, з підказками коду, в коди для процесора Z80 (поки не розбирався зі способом завантаження на "залізку" або емулятор, це наступний етап).

Вимоги:
редактор - сама НД (2013);
асемблерний Z80 код на екрані, без зайвих модулів;
вибір мови під час створення проекту (де список мов C#, F#, VB.NET та інших).

Відповідь:а як "сказати" студії 2013 року щоб вона підсвічувала і підказувала?

Питання: Створення гри на движку C++


Народ, допоможіть зі створенням гри на движку з ++. Doodle jump, Буду вдячний аналогу. Проблема в тому, що почав тільки нещодавно вивчати. І ніяк не можу написати правильну програму. Мабуть, я ще конкретний Нуб. Вдячний заздалегідь!

Доброго дня, Хабрахабре!

На хабрі не дуже багато уроків щодо створення ігор, чому б не підтримати вітчизняних девелоперів?
Представляю свої уроки, які вчать створювати ігри на C++ з використанням SDL!

Що потрібно знати

  • Хоча б початкові знання C++ (використовуватимемо Visual Studio)
  • Терпіння

Про що ця частина?

  • Ми створимо каркас для всіх ігор, як малювач буде використовувати SDL. Це бібліотека для графіки.

У наступних постах буде більше екшену, це лише підготовка:)

Чому SDL?

Я вибрав цю бібліотеку як найлегшу і найшвидшу в освоєнні. Справді, від першої прочитаної статті з OpenGL або DirectX до стотисячного перевидання змійки пройде чимало часу.

Тепер можна стартувати.

1.1. Початок почав

Завантажуємо SDL із офіційного сайту.
Створюємо проект Win32 в Visual Studio, підключаємо lib"и і includ"и SDL (якщо ви не вмієте цього робити, то гугл вам на допомогу!)

Також необхідно використовувати багатобайтне кодування символів. Для цього йдемо в Проект->Властивості->Властивості конфігурації->Набір символів->Використовувати багатобайтне кодування.

Створюємо файл main.cpp
#include int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) ( return 0; )
Поки що він нічого не робить.

Цар та бог каркасу - клас Game
Game.h
#ifndef _GAME_H_ #define _GAME_H_ class Game ( private: bool run; public: Game(); int Execute(); void Exit(); ); #endif
Game.cpp
#include "Game.h" Game::Game() ( run = true; ) int Game::Execute() ( while(run); return 0; ) void Game::Exit() ( run = false; )

Створюємо файл Project.h, він нам дуже стане в нагоді в майбутньому
#ifndef _PROJECT_H_ #define _PROJECT_H_ #include #include "Game.h" #endif

Змінюємо main.cpp
#include "Project.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) ( Game game; return game.Execute(); )

Вже трохи краще, але все одно якось не густо.

1.2. Графіка

Створюємо аж 2 класи - Graphics для малювання графіки та Image для малювання картинок

Graphics.h
#ifndef _GRAPHICS_H_ #define _GRAPHICS_H_ #include "Project.h" #include "Image.h" class Image; class Graphics ( private: SDL_Surface* Screen; public: Graphics(int width, int height); Image* NewImage(char* file); Image* NewImage(char* file, int r, int g, int b); Image* img, int x, int y); #endif

Image.h
#ifndef _IMAGE_H #define _IMAGE_H #include "Project.h" class Image ( private: SDL_Surface* surf; public: friend class Graphics; int GetWidth(); int GetHeight(); ); #endif

Змінюємо Project.h
#ifndef _PROJECT_H_ #define _PROJECT_H_ #pragma comment(lib,"SDL.lib") #include #include #include "Game.h" #include "Graphics.h" #include "Image.h" #endif

SDL_Surface - клас із SDL для зберігання інформації про зображення
Розглянемо Graphics
NewImage - є 2 варіанти завантаження картинки. Перший варіант просто вантажить картинку, а другий після цього ще й дає прозорість картинці. Якщо у нас червоне тло в картинці, то вводимо r=255,g=0,b=0
DrawImage - теж 2 варіанти малювання картинки. Перший малює всю картинку повністю, другий лише частина картинки. startX, startY – координати початку частини картинки. endX, endY – кінцеві координати частини картинки. Цей спосіб малювання застосовується, якщо використовуються атласи картинок. Ось приклад атласу:

(зображення взято з веб-ресурсу interesnoe.info)

Розглянемо Image
Він просто тримає свій сурфейс та дає право доступу до своїх закритих членів класу Graphics, а він змінює сурфейс.
По суті це обгортка над SDL_Surface. Також він дає розмір картинки

Graphics.cpp
#include "Graphics.h" Graphics::Graphics(int width, int height) (SDL_Init(SDL_INIT_EVERYTHING); Screen = SDL_SetVideoMode(width,height,32,SDL_HWSURFACE| ) ( Image* image = new Image(); image->surf = SDL_DisplayFormat(SDL_LoadBMP(file)); return image; ) Image* Graphics::NewImage(char* file, int r, int g, int b) ( Image * image = new Image(); image->surf = SDL_DisplayFormat(SDL_LoadBMP(file)); return image; ) bool Graphics::DrawImage(Image* img, int x, int y) ( if(Screen == NULL || img->surf == NULL) return false; SDL_Rect Area; Area.x = x; Area .y = y; SDL_BlitSurface(img->surf, NULL, Screen, &Area); ) ( if(Screen == NULL || img->surf == NULL) return false; SDL_Rect Area; Area.x = x; Area.y = y; SDL_Rect SrcArea; SrcArea.x = startX; SrcArea.y = startY; SrcArea.w = endX; SrcArea.h = endY; SDL_BlitSurface(img->surf, &SrcArea, Screen, &Area); return true; ) void Graphics::Flip() ( SDL_Flip(Screen); SDL_FillRect(Screen,NULL, 0x000000); )
У конструкторі ініціалізується SDL та створюється екран.
Функція Flip повинна викликатися кожного разу після відтворення картинок, вона представляє на екран і чистить екран у чорний колір для дальнього малювання.
Інші функції малоцікаві, рекомендую розібратися в них самому

Image.cpp
#include "Image.h" int Image::GetWidth() ( return surf->w; ) int Image::GetHeight() ( return surf->h; )
Ні, ви все правильно робите, цей файл і має бути таким:)

Потрібно змінити Game.h, Game.cpp та main.cpp
Game.h
#ifndef _GAME_H_ #define _GAME_H_ #include "Project.h" class Graphics; class Game ( private: bool run; Graphics* graphics; public: Game(); int Execute(int width, int height); void Exit(); ); #endif
Тут ми додаємо покажчик на Graphics і до Execute додаємо розмір екрану

Game.cpp
#include "Game.h" Game::Game() ( run = true; ) int Game::Execute(int width, int height) ( graphics = new Graphics(width,height); while(run); SDL_Quit() ; return 0; ) void Game::Exit() ( run = false; )

Нічого особливого, хіба що не пропустіть SDL_Quit для очищення SDL

Main.cpp
#include "Project.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) ( Game game; return game.Execute(500,350); )
Тут створюємо екран розміром 500 на 350.

1.3. Введення

Потрібно попрацювати із введенням з клавіатури

Створюємо Input.h
#ifndef _INPUT_H_ #define _INPUT_H_ #include "Project.h" class Input ( private: SDL_Event evt; public: void Update(); bool IsMouseButtonDown(byte key); byte key); #endif
SDL_Event - клас якоїсь події, його ми тримаємо в Input'і для того, щоб не створювати об'єкт цього класу кожен цикл
Нижче розташовані методи, що не становлять особливого інтересу. Примітка: методи із закінченням Down викликаються, коли кнопка була натиснута, а із закінченням Up - коли опущена.

Input.cpp
#include "Input.h" void Input::Update() ( while(SDL_PollEvent(&evt)); ) bool Input::IsMouseButtonDown(byte key) ( if(evt.type == SDL_MOUSEBUTTONDOWN) if(evt.button.button == key) return true; return false;) bool Input::IsMouseButtonUp(byte key) ::GetButtonDownCoords() ( POINT point; point.x=evt.button.x; point.y = evt.button.y; return point; ) bool Input::IsKeyDown(byte key) ( return (evt.type == SDL_KEYDOWN && evt.key.keysym.sym == key); ) bool Input::IsKeyUp(byte key) ( return (evt.type == SDL_KEYUP && evt.key.keysym.sym == key);) byte Input::GetPressedKey() ( return evt.key.keysym.sym; ) bool Input::IsExit() ( return (evt.type == SDL_QUIT) ;)
Тут ми обробляємо наш об'єкт подій у функції Update, інші функції просто перевіряють тип події та її значення.

Змінюємо тепер Game.h та Game.cpp
#ifndef _GAME_H_ #define _GAME_H_ #include "Project.h" #include "Graphics.h" class Graphics; #include "Input.h" class Input; class Game ( private: bool run; Graphics* graphics; Input* input; public: Game(); int Execute(int width, int height); Graphics* GetGraphics(); Input* GetInput(); void Exit(); ; #endif
Як видно, ми додали покажчик на Input і створили методи-повертачі Graphics та Input

Game.cpp
#include "Game.h" Game::Game() ( run = true; ) int Game::Execute(int width, int height) ( graphics = new Graphics(width,height); input = new Input(); while (run) ( input->Update(); ) delete graphics; delete input; ; ) void Game::Exit() ( run = false; )

1.4. Підсумки

То був перший урок. Якщо ви дійшли до цього місця, я вітаю вас! У вас є воля, властива програмісту:) Дивіться посилання на початку статті на наступні уроки, щоб дізнатися ще багато нового!

З усіх питань звертайтесь до ЛЗ, а якщо вам не пощастило бути зареєстрованим на хабрі, пишіть на мейл [email protected]

Я – той ще фрукт. Усі мої особисті ігрові проекти, якими я займався в останнім часом, були написані на "vanilla" C. Більше ніхто так не робить, тому, гадаю, вам може бути цікаво дізнатися, чому я зробив такий вибір.
Написане далі містить думку про мови програмування, яка може не сподобатися. Я попереджав.

Що мені потрібно від мови

Деякі вимоги не підлягають обговоренню чи пошуку компромісів. По-перше, мова має бути надійною. Я не можу дозволити собі витрачати свій час на пошук помилок, яких я не робив.

Я написав велику кількість ігор на Flash, і ось, Flash помер. Я не хочу витрачати час на портування старих ігор на сучасні платформи, хочу писати нові ігри. Мені потрібна платформа, у довговічності якої я буду впевнений.

Чого я точно хочу, то це уникнути залежності від певної ОС. В ідеалі – мати можливість розробляти і для консолей. Тому важливо, щоб мова дозволяла легко портувати написане нею, а також мала хорошу підтримку кросплатформових бібліотек.

Чого я хочу від мови

Найважливішою, але не обов'язковою вимогою є простота. Вивчення особливостей мови та її дивовижного «розумного» API я знаходжу шалено нудним. Ідеальну мову можна одного разу вивчити і ніколи більше не користуватися її документацією.

Пошук та виправлення багів виснажує творчий потенціал. Я хочу залишати менше багів, тому бажаю строгу типізацію, якісні повідомлення про помилки та статичний аналіз коду. Хочу спростити пошук помилок, а отже хороші налагоджувальні засоби та динамічний аналіз.

Мене не цікавить красива реалістична картинка, зате я дбаю про продуктивність. Найменша вимогливість до ресурсів розширює спектр можливостей, доступних для реалізації. Особливо цікаво спостерігати за тим, що відбувається із сучасним потужними комп'ютерамиколи розробник про продуктивність не думає.

Ще більше за мене хвилює швидкість компілятора. Я не будь-який буддійський майстер концентрації, і чекати більше 10 секунд - марнотратство. Найгірше, це вибиває з потоку. Начебто лише глянув Twitter, а 5 хвилин кудись зникли.

Я не є адептом ОВП. Більшість часу, проведеного за роботою, я мав справу з класами та об'єктами. Але що далі, то менше я розумію, чому треба так жорстко об'єднувати код та дані. Я хочу працювати з даними, як із даними, і писати код, який найкраще підходить у конкретній ситуації.

Альтернативи

C++ продовжує залишатися найбільш поширеною мовою для розробки ігор, і на те є причини. Досі більшість моїх замовних проектів пишеться на ньому, і це мені не подобається.

C++ покриває мої потреби, але відповідає бажанням. Він дуже складний. Незважаючи на наявність придатних інструментів, на ньому легко припускатися підступних помилок. З іншого боку, проти C, він повільно компілюється. C++ має високу продуктивність і надає можливості, яких немає в C, але це не те, чого я хочу, та й досягається це великою складністю.

C# та Java мають схожі проблеми. Це багатослівні і складні монстри, а мені потрібне маленьке просте звірятко. Обидві мови направляють програміста прямо в безодню ОВП, а я проти цього. Як і в більшості високорівневих мов, багато складних речей тут ховаються так, що нічого не заважає випадково вистрілити собі в ногу.

Мені дуже подобається Go. У багатьох аспектах це винайдений наново C, з поправкою на те, що до представлення його публіці він продумувався кілька років. Я хотів би використовувати Go, але є один величезний підводний камінь – складання сміття. Розробка ігор на Go сумнівна, адже збирач сміття припинятиме весь ігровий світ, що розробник не може дозволити. Також тут все не дуже добре з ігровими бібліотеками. І хоча завжди можна пристосувати для цієї справи бібліотеку на C, причому без особливих проблем, все одно породжує багато зайвої роботи. Крім того, у мене є сумніви щодо перспектив. Go був би непоганий для Інтернету, але це стрімко мінливе середовище. Особливо це відчулося зі смертю Flash.

JavaScript мені абсолютно не подобається. Він надає стільки свободи, що мені незрозуміло, як люди примудряються писати складні проекти на ньому. І не хочу навіть намагатись його пробувати.

Haxe виглядає набагато перспективніше за інші мови в цьому списку. Він не має проблем із бібліотеками. Якщо я почну писати під веб, то обов'язково познайомлюся з ним ближче. Дещо турбує відносна молодість мови, чи він житиме? Більше мені додати нічого, з Haxe я встиг лише трохи погратися, не заглиблюючись.

Джонатан Блоу пише свою мову. Мова, якою він сам захотів би користуватися. Я захоплююсь його рішенням, іноді й сам займаюся ідеєю вчинити так само. Але ж не викинути всі існуючі бібліотеки. А реалізувати повну з ними сумісність – не так просто. Та й взагалі це важко, я хотів би далі писати ігри, а не мови програмування.

Чому C - найкращий вибір для мене

Хоча C і небезпечний, зате надійний. Це дуже гострий ніж, здатний відрубати пальці так само легко, як нарізати овочі. Але він простий, і навчитися правильно його використовувати не складе.

Він швидкий. А коли справа доходить до компіляції, я й уявити не можу, що якась мова здатна зробити це швидше.
Є можливість писати код так, щоб він працював скрізь. І зазвичай, це відносно нескладно. Важко уявити, що якось це зміниться.

Є чудова підтримка бібліотек та інструментів.

Хоч мене це і трохи засмучує, але C досі залишається найкращою мовоюдля мене.

Я зовсім не хочу сказати щось на кшталт: "Гей, ви теж повинні писати на C". Я усвідомлюю, що мої уподобання дуже специфічні. Крім того, за кількістю, написаної мною різними мовами, код на vanilla C займає лідируючу позицію, так що це вже частина моєї зони комфорту.

Так що так, C для мене - найкращий вибір.

Від перекладача

Переклад місцями досить вільний, але не на шкоду змісту чи змісту.

Підготував переклад спеціально до п'ятниці, цього дня він особливо доречний, як на мене. Хоч автор оригінального текстуі пише, здається, цілком серйозно... ви самі все розумієте, якщо прочитали. Як істину прочитане сприймати не варто.

З пропозиціями, побажаннями та зауваженнями, як завжди, у ЛЗ.

Комп'ютерні ігри – це великий бізнес. Сумарний виторг індустрії відеоігор у США досяг 23,5 мільярдів доларів минулого року, що на 5% більше, ніж у 2014 році. великою гроюстоять програмісти, які роблять істотний внесок у кінцевий продукт. Звичайно, для створення різних ігорвикористовуються різні мови програмування. У цій статті ми представимо вам кілька найпопулярніших.

Мова асемблера

Багато ігор для Sega та Dendy були написані на різних діалектах мови асемблера, включаючи Super Mario Brothers.

Ігри серії Super Mario були продані тиражем понад 70 мільйонів копій. IGN назвала третину Super Mario Brothersнайбільшою грою всіх часів.

Мова Сі

Мова Сі досі залишається однією з найпопулярніших мов програмування через свою відносну простоту і чітку структуру. Компанія id Software використовувала Сі для створення ігри Doom, вперше випущений у 1993 році.

Doom була названа найвпливовішою FPS-грою, ставши прообразом багатьох інших ігор від першої особи та 3D-ігор загалом. За приблизними оцінками Doom набрав близько 10 мільйонів установок 1995 року.

С++

Мова С++ використовувався для створення багатьох сучасних операційних систем, софту, ігор та ігрових двигунів. Завдяки його гнучкості, ігри можна відносно нескладно портувати з ПК на консолі та у зворотному напрямку. Однією з самих популярних ігор, написаних С++, є World of Warcraft.

З моменту запуску було продано 14 мільйонів копій. 48% передплатників проживають в азіатському регіоні, 22% із США. На вікі WoW міститься більше 100 000 статей.

C#

Розроблений компанією Microsoft у 2000 році, С# став досить популярним серед розробників ігор. Двигун Unity, що широко використовується при створенні ігор для ПК, консолей та мобільних пристроївнаписаний переважно на С#. Одна з найпомітніших ігор у даному класі – Angry Birds.

Angry Birds знаходиться на третьому місці за популярністю серед усіх ігор для iOS всіх часів, відразу за Candy Crush Saga і Fruit Ninja. Вартість розробки першої версії гри склала близько $140 000, що є дуже скромним числом свого роду. Чотири людини працювали над грою сумарно близько восьми місяців.

Java

Java є певною мірою родичем C#. Вони розвиваються під впливом один одного, обидва мають збирачі сміття та об'єктно-орієнтовані. Але Java спочатку позиціонується як платформонезалежна мова, що означає, що він (за задумом) працює абсолютно однаково на всіх пристроях. Історії успішних ігор, написаних на Java, включають RuneScape і Minecraft.

Альфа-версія гри була створена лише за 6 днів. Minecraft - друга найпопулярніша гра у світі. Спочатку вона називалася Cave Game.

Хочете знайти більше матеріалів з розробки ігор і, можливо, навіть розробити одну свою? Загляньте в .

Створення гри для Linux за допомогою Weaver Framework

Це стаття про Weaver Framework, невеликий фреймворк для створення двовимірних ігор під Лінукс. Weaver написаний мовою програмування Сі, тобто. для створення гри з його допомогою вам знадобиться хоча б початкові знання цієї мови програмування.

Спочатку потрібно сказати, що фреймворк всього містить близько 70 функцій для маніпулювання звуком, картинками, створення графічних примітивів, детектора зіткнень і ще. У ході цієї статті буде описано майже всі функції.

Сайт проекту знаходиться за адресою http://weaver.nongnu.org/ Там же можна отримати вже зібраний пакет у форматі.deb або тарбол з вихідним кодом, для не debian-based систем. Отже, почнемо.

Після завершення успішної установки, можна відразу приступати до створення проекту. Для цього потрібно відкрити консоль, перейти в директорію, де розташовуватиметься наш новий проект і набрати:

weaver

У ході створення проекту Буде створено ієрархію директорій, призначених для зберігання графічних, звукових та вихідного коду файлів. Для початку, щоб потренуватися, створимо проект test. Він використовуватиметься для вивчення можливостей weaver.

2.1. Створення порожнього проекту

weaver test

Декілька слів про вміст директорії проекту.

test

|-fonts

|-images

|-music

|-sounds

| |-weaver

LICENSE

Makefile

У принципі назви говорять самі за себе. Згадаю лише про/src , тут містяться як безпосередньо файли проекту ( game.c, game.h - основні), так і (у директорії/weaver ) файли самого фреймворку необхідні для вдалого складання проекту.

Розглянемо файл /src/game.c докладніше. Він є основним файлом проекту і саме в ньому є головний цикл програми.

int main(int argc, char **argv)

Awake_the_weaver(); // Initializing Weaver API

// Main loop

For(;;)(

Get_input();

If(keyboard)(

Break;

Weaver_rest(10000000);

May_the_weaver_sleep();

Return 0;

Функції

awake_the_weaver()

may_the_weaver_sleep()

дозволяють і забороняють використання функцій із фреймворку. Між ними є головний цикл програми.

get_input() служить для захоплення стану клавіатури та мишки. Слідом за цим йде ділянка коду. відповідальний за вихід із програми натискання будь-якої клавіші.

weaver_rest(n) призначена для призупинення програми на кілька наносекунд, ця ж функція відповідає і за FPS, чим нижче число n, тим вище FPS.

Для складання проекту набираємо в консолі команду make та чекаємо вдалого завершення.

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/display.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/keyboard.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/vector2.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/vector3.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/vector4.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/weaver.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/sound.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/image.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/font.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/game.c

gcc -Wall -O2 -g $(freetype-config --cflags) -g -o test display.o keyboard.o vector2.o vector3.o vector4.o weaver.o sound.o image.o font.o game. o -lX11 -lXext -lm -lvorbisfile -lasound -lpng -lfreetype $(freetype-config --cflags)

Успіх. Запустимо проект:

./test

Ось і все! Натискання будь-якої клавіші закриває гру.

2.2. Робота з клавіатурою

Стан клавіатури містить глобальну змінну keyboard . Дізнатися, чи натиснута потрібна нам клавіша можна таким нехитрим чином:

if (keyboard[ ])

// щось відбувається

Якщо потрібно, щоб програма реагувала на поєднання клавіш, використовуємо Логічне-І:

if (keyboard[ ] && keyboard[ ])

/ / Щось так станеться!

Тепер змінимо програму так, щоб вихід проводився за натисканням Ctrl-Q.

Змінимо

if(keyboard)

Break;

на

if(keyboard && keyboard[Q])

Break;

Ризикнемо зібрати і запустити гру. Тепер для виходу необхідно натиснути комбінацію клавіш Ctrl-Q.

2.3. Малювання графічних примітивів

Для малювання примітивів є функції:

draw_circle()

draw_ellipse()

draw_line()

draw_point()

draw_rectangle()

Для заливки примітно використовуються функції

fill_circle()

fill_ellipse()

fill_rectangle()

Їх назва, як і назви більшості функцій weaver, наочні і не потребують докладний опис. Описи вимагають лише параметри, але посилання на Reference Guide буде дано наприкінці статті.

Не будемо стояти на місці і намалюємо жовтий квадрат із координатами (x=50, y=150) та розміром 125x125. В основний цикл додамо такий запис:

draw_rectangle(50, 150, 125, 125, YELLOW);

де YELLOW – колір нашого квадрата.

Збираємо проект і дивимося, що вийшло.

Не те, на що ми очікували, правда?

Справа в тому, що задаючи колір у малюванні квадрата, ми задаємо колір його межі, тому нам необхідно залити наш квадрат за допомогою функції fill_rectangle(). Що ми робимо, додаючи після команди малювання квадрата наступний рядок:

fill_rectangle(50, 150, 125, 125, YELLOW);

Пробуємо та дивимося!

На цей раз у нас все вийшло. Тепер спробуємо поєднати наші знання про використання клавіатури та малювання примітивів. Але перед цим трохи оптимізуємо нашу програму, створивши квадрат як змінну.

rectangle є структурою, з 4 параметрами вісь x (параметр x), вісь y (параметр y), ширина (параметр w) та висота (параметр z).

Створимо змінну типу rectangle, додавши після ініціалізації weaver (нагадаю, це awake_the_weaver()):

rectangle rect1;

Потім ініціалізуємо її параметри:

rectangle rect1;

rect1.x=50;

rect1.y=150;

rect1.w=rect1.z=125;

Задамо обробку для натискання клавіш<стрелка-влево>і<стрелка-вправо>клавіатури.

If (keyboard)

Rect1.x-=10;

If (keyboard)

Rect1.x+=10;

А потім і малювання самого квадрата:

draw_rectangle(rect1.x, rect1.y, rect1.w, rect1.z, YELLOW);

Зазначу, що ініціалізація параметрів змінної має бути до головного циклу відмальовки, тобто. до for(;;).

Зберемо та запустимо наш проект.

І знову не те, що ми хотіли б бачити?

Справа в тому, що малювання відбувається при кожній ітерації головного циклу, але й лише. Все, що було намальовано до цієї ітерації, так і залишається на екрані ніяк не стираючись. Це легко вирішується очищенням екрана перед кожним новим відображенням екрана. Для заливки (а в даному випадку очищення) екрана використовується функція

fill_screen()

приймає як параметр колір заливки. Додамо її перед малюванням квадрата і знову побачимо, що вийде.

Успіх! Перейдемо до завантаження та малювання зображень.

Єдиний можливий weaver формат зображення - . png , його і використовуватимемо. Потрібно пам'ятати, що всі зображення повинні бути в директорії/images.

Для початку оголосимо та ініціалізуємо покажчик на тип surface, що представляє зображення:

surface *face=new_image("face.png");

Функція new_image() приймає один аргумент – назву графічного файлу.

Для відображення графічного файлу існує функція

draw_surface()

приймає в якості аргументів покажчик на графічний файл, що зображається ( surface *origin ), покажчик на те, де зображатиметься ( surface *destiny) та координати (x, y).

Графічні файли можна малювати на інших графічних файлах, щоб малювати просто на екрані, як параметр destiny потрібно вказувати window, це і є покажчик на поточне вікно малювання.

Заберемо зайві згадки про квадрат, зберемо проект і запустимо його.

Підсумок наших старань:

Для зручнішої маніпуляції малюнком створимо структуру, що складається з покажчика на картинку та її координат на екрані.

struct pict(

Surface * FC;

Int x;

Int y;

Наново створимо та ініціалізуємо зображення:

face.fc=new_image("face.png");

face.x = 100;

face.y=100;

Змусимо його відображатися:

draw_surface(face.fc, window,face.x, face.y);

Тепер можна спробувати керувати розташування зображення, використовуючи наші знання про клавіатуру. Не підказуватиму вам, сподіваюся у вас вийти.

2.5.Виведення тексту на екран.

Цей розділ напевно розчарує, але weaver не вміє виводити текстові повідомлення на екран. У проекті є модулі, які відповідають за виведення тексту, але вони не використовуються. Чому? Мабуть, автор ще не готовий до цього;). Але він сам запропонував вирішення проблеми. Для виведення тексту використовується своєрідна палітра - набір літер, розміщений на зображенні, звідки літери в разі потреби беруться і виводяться на екран. Цей прийом використовувався і раніше у старих (і не дуже) іграх.

Скористаємося ним і ми. Для цього завантажимо картинку з набраними літерами в нашу гру.

surface * font=new_image("font2.png");

Отже, ми маємо картинку з розміщеними на ній кількома літерами. Як брати з неї потрібні на літери? Для виведення певної частини зображення використовується функція blit_surface(). Параметр *src приймає покажчик на вихідний графічний файл, *dest приймає покажчик на поверхню для зображення, (x_src, y_src) - координати, звідки починатиметься вирізане зображення, width - ширина нового зображення, height - його висота, (x_dest, y_dest) - координати цільової поверхні, куди буде виводитися вирізане зображення.

Додамо виклик функції та подивимося, що вийде.

blit_surface(font, window, 0, 0, 90, 100, 500, 500);

Не так це і страшно, але залишилося одне питання – на малюнку червоні літери на темно-синьому тлі, але виводяться лише літери червоного кольору. Це пов'язано з тим, що темно-синій колір (#00029a) вважається прозорим і не виводиться. Якщо вас не влаштовує саме цей колір, можна його поміняти, просто задавши інше значення змінної transparent_color.

2.5.Звук

На жаль, формат звукових файлів теж накладено обмеження - weaver програє лише файли формату Ogg Vorbis. Для відтворення звуків є дві функції: play_music() і play_sound(). Різниця між ними в тому, що play_music() повторюватиме музику доти, доки не буде викликана функція stop_music(). Функція play_sound() програє музичний файл лише один раз і керувати відтворенням цієї функції ми не в змозі. Очевидно, що play_music() краще використовуватиме відтворення звукового фону гри, а play_sound() для відтворення звукових ефектів.

Спробуємо відтворити звук. Для play_sound() файл повинен розташовуватись у директорії sound, а для play_music() у директорії music відповідно.

Додамо перед головним циклом:

play_sound("sound.ogg");

Потім, як завжди, зберемо і запустимо гру. Et voilà, чути звук пострілів.

2.6.Визначення зіткнень

Для визначення зіткнень між об'єктами служить набір функцій, що має назву префікс collision_* . Використовувати їх так само легко, як і все інше. Для прикладу створимо два прямокутники:

rectangle rect1, rect2;

rect1.x=rect1.y=50;

rect1.w=rect1.z=25;

rect2.x=rect2.y=150;

rect2.w=rect2.z=50;

Один з них рухатиметься:

if (keyboard)

Rect1.x-=10;

if (keyboard)

Rect1.x+=10;

if (keyboard)

Rect1.y-=10;

if (keyboard)

Rect1.y+=10;

І фінальна частина, перевірка на зіткнення та реакція на це:

if (collision_rectangle_rectangle(&rect1, &rect2))

Break;

Звичайно, що для наочності слід відображати наші прямокутники на екрані.

Тепер ми знаємо, щоб спробувати написати власну невелику гру. Це буде дуже спрощений Маріо без перешкод, але з ворогами.

Почнемо!

3.1. Проект називатиметься YAM (Yet Another Mario)

weaver yam

Це все добре, але з чого почати? Для початку непогано було б вигадати інтерфейс гри, потім знайти необхідні ресурсидля графічного оформлення гри. Що це таке? Це можуть бути спрайти персонажів, фоновий малюнок, палітра букв.

Про інтерфейс. Його у нас не буде, по суті гра буде одним коротким рівнем, пройти його потрібно буде з однієї спроби.

Тепер про спрайти. Докладніше про них ви можете почитати у Вікіпедії. Є велика кількість сайтів, де можна знайти як скрипнуті з ігор спрайти, так і авторські, зроблені «за мотивами». Нам потрібні як мінімум два типи спрайтів, для Маріо та для його супротивника. Погуглив, я знайшов кілька сайтів з базами даних спрайтів, на одному з них спрайти були розміщені в єдиному зображенні, на іншому надавалися окремими картинками. Виберемо, де вони розбиті, це нам знадобиться для більш зручного створенняанімації персонажів.

3.2. Так як ми бажаємо, щоб при натисканні на клавішу руху переміщалася не просто статична картинка, а була хоч якась подоба руху, нам потрібно анімувати персонажів. Робиться це з допомогою низки схожих зображень, де розбіжності лише у деталях.

У нас є 3 види спрайт для анімації Маріо.

Принцип анімації, я думаю вам знайомий, це просто послідовне зображення кількох картинок.

Створюємо структуру, де зберігатимемо дані про персонажа:

struct character(

Surface * FC;

Int x;

Int y;);

Ініціалізуємо змінну для Маріо:

Mario.x=mario.y=100;

Mario.fc=new_image("mw1.png");

Mario.fc=new_image("mw2.png");

Mario.fc=new_image("mw3.png");

Ну і нарешті навіщо анімацію персонажа, але так як екран оновлюється кожні 0.01 секунди, то зображення змінюватимуться дуже часто. Це можна виправити або зменшивши значення FPS, передавши функції weaver_rest() значення більше поточного, або використовуючи лічильник кадрів, який буде вирішувати, який спрайт буде відображатися в даному кадрі. Будемо використовувати метод із лічильником.

Перед головним циклом створимо змінну counter, яка і буде лічильником

int counter = 0;

А в головному циклі буде перевірка лічильника і в залежності від його значення буде малюватись той чи інший спрайт анімації:

If (counter<=10){

Counter++;

If (counter>10 && counter<=20){

Draw_surface(mario.fc, window, mario.x, mario.y);

Counter++;

If (counter>20 && counter<=29){

Draw_surface(mario.fc, window, mario.x, mario.y);

Counter++;

If (counter>29)

Counter = 0;

Готово, можна збирати проект та запускати.

Так само анімуємо і противника Маріо.

Тепер, щоб Маріо мала хоч якусь можливість перемогти, реалізуємо можливість його стрибка. З цим все просто при натисканні на клавішу змінюється значення координат по вертикалі.

Після цього можна почати обробляти зіткнення Маріо та його супротивника. Для цього додамо до структур, що описують персонажа гри, прямокутник, за перетином яких і відстежуватимемо.

Тепер структура виглядає так:

struct character(

Surface * FC;

Int x;

Int y;

Rectangle col_det;);

Задаємо базові значення для персонажів (в принципі це і не потрібно, тому що в головному циклі вони все-одно оновляться), додаємо пару рядків для прив'язки прямокутників до координат спрайтів. Для наочності змусимо на деякий час прямокутники будуть відображатись червоним кольором, це ми приберемо в самому кінці. Запускаємо і дивимося, що вийшло.

Тепер можна приступити і до реалізації відповіді на перетин прямокутників, для цього ми використовуємо вже знайому функцію collsion_rectangle_rectangle():

if (collision_rectangle_rectangle(&mario.col_det, &bowser.col_det))

Break;

Ось і все, при зіткненні персонажів гра завершуватиметься. Легко та просто.

3.3. Залишилося додати останні штрихи до гри, тобто. фон та звукові ефекти

Для додавання звукових ефектів та фонової музики скористаємося функціями play_music()/stop_music() та play_sound().

Управління просте - стрілка вліво - стрілка вправо - рух, стрілка вгору - стрибок

Ось і готова наша убога пародія на чудову гру. Якщо виникне бажання, можете додати хмари, кущі, та й, звичайно ж, грибочки.

Як бачите, написати гру, використовуючи лише Сі досить легко, набагато важче зробити це добре.

Насамкінець невеликий список корисних посилань

http://weaver.nongnu.org / - Веб сайт фреймворку Weaver, там ви знайдете як докладну документацію, так і приклади коду.

Якщо ви бажаєте повторити приклади зі статті – ось посилання на архів із вихідними текстами нашої гри:http://narod.ru/disk/16196657001/yam.tar.gz.html.



Дурень