Простой движок для написания игр на языке C под Linux. Почему я пишу игры на C (да, на C) Как работает «Space Invader»

Компьютерные игры - это большой бизнес. Суммарная выручка индустрии видеоигр в США достигла 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».

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

Вопрос: Что посоветуйте для создания игр с нуля?


Доброго времени. Не так давно был вдохновлен игрушками вроде 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); bool DrawImage(Image* img, int x, int y); bool DrawImage(Image* img, int x, int y, int startX, int startY, int endX, int endY); void Flip(); }; #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|SDL_DOUBLEBUF); } Image* Graphics::NewImage(char* file) { 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)); SDL_SetColorKey(image->surf, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(image->surf->format, r, g, b)); 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); return true; } bool Graphics::DrawImage(Image* img, int x, int y, int startX, int startY, int endX, int endY) { 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); bool IsMouseButtonUp(byte key); POINT GetButtonDownCoords(); bool IsKeyDown(byte key); bool IsKeyUp(byte key); byte GetPressedKey(); bool IsExit(); }; #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) { if(evt.type == SDL_MOUSEBUTTONUP) if(evt.button.button == key) return true; return false; } POINT Input::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; SDL_Quit(); return 0; } Graphics* Game::GetGraphics() { return graphics; } Input* Game::GetInput() { return input; } void Game::Exit() { run = false; }

1.4. Итоги

Это был первый урок. Если вы дошли до этого места, я вас поздравляю! У вас есть воля, присущая программисту:) Смотрите ссылки в начале статьи на последующие уроки для того, чтобы узнать еще много нового!

По всем вопросам обращайтесь в ЛС, а если вам не повезло быть зарегистрированным на хабре, пишите на мейл [email protected]