Курсы создания компьютерных игр на C/C++ ( Часть 4 )

Для самых-самых начинающих программистов :] Часть 3 - http://pikabu.ru/story/_3437142
Курсы создания компьютерных игр на C/C++ ( Часть 4 ) Для самых-самых начинающих программистов :]  Часть 3 - <a href="http://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_na_cc__chast_3__3437142">http://pikabu.ru/story/_3437142</a>
6
Автор поста оценил этот комментарий

Эм

Иллюстрация к комментарию
раскрыть ветку (1)
6
Автор поста оценил этот комментарий
Да, видимо не лучший сервис для публичных публикаций раз разрешает редактирование )))
Автор поста оценил этот комментарий

Людей пытается учить человек, считающий, что по младшему адресу лежит старший байт. Вот почему читать надо не всякие гайды в интернете, а одну нормальную книжку

раскрыть ветку (1)
4
Автор поста оценил этот комментарий

Кстати есть отличная книга

Иллюстрация к комментарию
показать ответы
9
DELETED
Автор поста оценил этот комментарий

всего 11? О_о

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
))))
2
Автор поста оценил этот комментарий

Листинг программы со всеми домашними заданиями:
http://www.everfall.com/paste/id.php?xs58y9ahi92f=

показать ответы
1
Автор поста оценил этот комментарий

а когда будет следующий пост? и будет ли он? :)

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
А почему вопрос в Четвертой части? ))

Если нужная Пятая Часть - то вот она:
http://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_n...
А если одиннадцатая, то будет, но хз когда, мы сейчас тут командой свою игрушку пилим, поэтому не до постов сейчас :)

показать ответы
Автор поста оценил этот комментарий

а что в последнем сложного?

int main()

{m1:string i;

/здесь игра

m2:cout<<"eshe?yes/no";

if(i=="yes"){goto m1;}

if(i=="no"){;}

else {goto m2;}

return 0;

}

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Иллюстрация к комментарию
Автор поста оценил этот комментарий
:))) У нас половина IT контор, особенно молодых, по этой книжке отучилось, теперь хуяк, хуяк и в продакшен.
раскрыть ветку (1)
5
Автор поста оценил этот комментарий

Ура, поздравляю автора с прорывом "3-х постов"(Синдром Гейба). Ты первый кто сделал более 3-х постов которые не просто интересные но и информативные. 


Даже я взял некоторые приемы из твоих постов. Так держать. 

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Спасибо, а о каких приемах речь, если не секрет? :)
показать ответы
Автор поста оценил этот комментарий

Уважаемый @Dansken, есть небольшое замечание: по-моему не все компиляторы позволяют создавать такой код:
int count = 10;
int array[count];

По-моему много лучше будет такой код:
int count = 10;
int *array = new int[count];
/*******/
delete[] array;
Во всяком случае, насколько я знаю, такой код будет воспринят нормально всеми компиляторами
Прошу прощения, если такое замечание уже было (нет времени читать все комментарии).
И еще вопрос: каким образом можно задать цвет для очередного символа, который мы собираемся печатать в консоль?
Заранее спасибо.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Если count будет константой, то никаких проблем не будет :) С цветом разберемся на следующем уроке :) Но если есть желание попробовать самостоятельно, то это фукнция - SetConsoleTextAttribute
Автор поста оценил этот комментарий

Согласен, сам уже после публикации заметил, что не уточнил про разрядность приложения. В будущем поправлю. :)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
А вообще нужно будет сделать отдельный пост всех косяков предыдущих постов :)
1
Автор поста оценил этот комментарий
Я присматриваюсь к UE, там вроде бы как можно на плюсах.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Ну с UE плотно дел не имел, но ИМХО порог вхождения туда высоковат, новичку может быть достаточно сложно.
показать ответы
1
Автор поста оценил этот комментарий

Ну я никогда не был фанатом инди игр, может по той причине, что я в них не играл :) Я довольно избирателен в играх и крайне придирчив. Но очень хочется сделать что-то свое, что бы понять, что именно есть "крутая" игра в моем понимании :)

А вот этих знаний, что есть в цикле этих уроков хватает на манипуляции в каком-то популярном движке ?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Ну самым популярным движком в текущее время является Unity и для манипуляций в нем придется изучить еще как минимум язык C#, хотя бы поверхностно ознакомиться с некоторыми современными архитектурными решениями( вроде компонентной системы сущностей ), а также пройти цикл уроков по этому движку :)
Что касается менее популярного, то цикла этих уроков хватит для написания полноценной компьютерной игры, используя мультимедийную библиотеку SFML и язык C++. :)

показать ответы
1
Автор поста оценил этот комментарий
Сам в игровой индустрии работаешь или хобби?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Инди-геймдев )
показать ответы
1
Автор поста оценил этот комментарий
Как то для плюсов мало) Правда я на фронте пишу и как-то плюсы легче, синхронность радует:)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

На большее пока сил и времени нет ) Тут базовый минимум для того, чтобы понять как вообще писать компьютерные игры :)

показать ответы
1
Автор поста оценил этот комментарий

А, нет, понял :)

А будут продолжения с углублением?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Так там впереди еще 6 уроков после этого )
показать ответы
1
Автор поста оценил этот комментарий

херню написал, сделал по человечески

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Все равно прочитал ;)
показать ответы
1
Автор поста оценил этот комментарий

Вот мой код:

// game3.cpp: определяет точку входа для консольного приложения.

//


#include "stdafx.h"

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#include "Windows.h"

#include "conio.h"


int _tmain(int argc, _TCHAR* argv[])

{

const int lettersCount = 20;

char letters [ lettersCount ];

int shag = 0;

int errors = 0;

// System setup


time_t currentTime;

time (&currentTime);

srand(currentTime);


//Initialization


shag = 0;

for( int i = 0; i < lettersCount; i++)

{

letters[i] = 'a' + rand() % ( ('z' - 'a') +1);

}

system("cls");

printf("\n\tReady?\n");

_getch();

printf("\t");

for( int i = 0; i < 5; ++i)

{

printf(".");

Sleep(175);

printf("\n\tGo!");

Sleep(350);


}

do {

system("cls");

printf("\n\t");

for(int i =0; i<lettersCount; i++)

{

if (i<shag)

{

printf("%c ", 176);

}

else

{

printf("%c ", letters[i]);

}

char inputChar=_getch();

if ( inputChar == letters[shag])

{

shag++;

}

else{

errors++;

}

}

}


while(shag<lettersCount);

system("cls");

printf("\tErrors: %i\n", errors);

printf("\n\tPress any key to continue...");


_getch();

return 0;

}

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Вот это блок не должен быть внесен под for:
printf("\n\tGo!");

Sleep(350);



А вот этот соответственно не должен быть внесен под второй for:

char inputChar=_getch();


if ( inputChar == letters[shag])

{

shag++;

}

else{

errors++;

}



http://www.everfall.com/paste/id.php?lobv9ptcsr19=

показать ответы
1
Автор поста оценил этот комментарий

Ну у меня сначала пишет ряд букв, а потом после окончания целого ряда букв - можно уже писать. Надеюсь понятно объяснил xD

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Так в этом уроке не дается возможность писать :)
Там же используется функция _getch() которая сразу отлавливает код нажатого символа :)

http://www.everfall.com/paste/id.php?id=xs58y9ahi92f&v=0

показать ответы
1
Автор поста оценил этот комментарий

Нужно еще помимо ввода, запоминать все буквы? или это я накосячил? xD

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
В каком смысле?
показать ответы
1
Автор поста оценил этот комментарий

Что я делаю не так? 

Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Нет круглых скобочек, означающих вызов функции :)

Должно быть:

char inputChar = _getch();

показать ответы
1
Автор поста оценил этот комментарий

скажи пожалуйста, если я сделал твоё дз с помощью goto, это хуже чем твой способ или лучше?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
намного хуже :) Но при обучении - сойдет :) Просто нужно сделать правильные выводы :)
показать ответы
1
DELETED
Автор поста оценил этот комментарий

Решил двойным вызовом _getch

раскрыть ветку (1)
Автор поста оценил этот комментарий

Так и нужно :)

1
Автор поста оценил этот комментарий

ЧАААВООО ? средний ДЗ легче тяжелого - что там в типах данных разбератся? явное приведение проще простого. А вот грёбанные события это зашквар. Где почерпнуть инфу про события ? или как по другому можно отследить нажата ли кнопка капс лок ?

раскрыть ветку (1)
Автор поста оценил этот комментарий

В данном случае интересует лишь результат ввода - символ в верхнем или нижнем регистре :) И нужно просто привести его к единому регистру - тому, по которому работает логика программы :)

Например, чтобы и 'a', и 'A' превращалось в 'a'

1
Автор поста оценил этот комментарий

а можно одним глазком на код поглядеть, я так понимаю вы через Git это делаете? Люблю просто сам себе задавать вопросы и на них отвечать, а гайды и ютуб трудно даются.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

блин...автор, огромное спасибо!!!

раскрыть ветку (1)
Автор поста оценил этот комментарий
Да не за что :)
1
DELETED
Автор поста оценил этот комментарий

Можно ли с тобой как то связаться?

раскрыть ветку (1)
Автор поста оценил этот комментарий
можно попробовать постучать в скайп - tinaynox
1
DELETED
Автор поста оценил этот комментарий

А можно код с выполненым ДЗ? А то те сслылки не работают

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Все минусы и минусы тыкают, а я не могу понять почему. Мне бы год назад такие статьи и я был бы самым счастливым человеком на земле. Автору огромное спасибо. Отдельная благодарочка за картиночки. Реально всё намного понятнее выглядит, чем на пальцах. Пытался младшую сестру ввести в программирование, не знал как правильно переступить порог, дабы не отпугнуть, а наоборот зажечь желание.  Теперь знаю как. Надеюсь ты не будешь против, если я буду пользоваться твоими статьями. Ещё раз спасибо.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Спасибо за теплый отзыв :)) Я статьи и написал для того, чтобы ими пользоваться :)))

1
Автор поста оценил этот комментарий
*аккуратно спрашиваю* свое время еще не пришло?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Все, теперь пришло :)

показать ответы
1
Автор поста оценил этот комментарий
*аккуратно спрашиваю* свое время еще не пришло?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Та что-то не могу найти пикабушника-художника, чтоб помог с текстурами к новой игре :)

DELETED
Автор поста оценил этот комментарий

В листинге после перезапуска игры y/n не обнуляется счётчик ошибок, так было задумано?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Не, это баг ))
Автор поста оценил этот комментарий

Ахах, неправильно поставленный вопрос создает больше вопросов)

Я имел ввиду, как можно это реализовать?)

И еще вопрос, проблема с выводом float, выдает только целочисленные значения

раскрыть ветку (1)
Автор поста оценил этот комментарий
Ну например загадывать так:

if( rand()%2 )

{

   letters[i] = 'a' + rand() % (('z' - 'a') +1 );

}

else

{

   letters[i] = 'A' + rand() % (('Z' - 'A') +1 );

}



Для float нужен спецификатор формата - %f

показать ответы
Автор поста оценил этот комментарий

а можно реализовать вывод букв в разных регистрах?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Кто ж вам запретит? )))
показать ответы
Автор поста оценил этот комментарий

Можно же буквам регистры менять без всяких библиотек. 

с += 'A' - 'a';

раскрыть ветку (1)
Автор поста оценил этот комментарий
Можно, но это не так очевидно, красиво и удобно :)
показать ответы
Автор поста оценил этот комментарий

PAE (Physical Address Extension)

раскрыть ветку (1)
Автор поста оценил этот комментарий
Не слышал о таком, спасибо за ликбез :)
показать ответы
Автор поста оценил этот комментарий

У меня один вопрос. Когда будет переход от С к С++?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Думаю, что сразу после ООП :)

показать ответы
3
Автор поста оценил этот комментарий
Думаю, что сразу после ООП :)

После?
Т.е. сначала ты расскажешь им про ООП с примерами на С?

Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

Вот как начнет у нас получаться нечто такое:

Иллюстрация к комментарию
показать ответы
Автор поста оценил этот комментарий

Автор, если не секрет, то сколько у тебя уже подписчиков?

раскрыть ветку (1)
Автор поста оценил этот комментарий

не как не пойму именно вот эту часть:

% (('z' - 'a') +1 );

раскрыть ветку (1)
Автор поста оценил этот комментарий

Про случайные числа и остаток от деления было рассказано в Части 2.

'a' + rand() % (('z' - 'a') +1 );
97 + rand() % ( (122 - 97) + 1 )
97 + rand() % 26;

Получим тут случайное число от 97 до 122 включительно. Про то, что это коды символов от 'a' до 'z' было рассказано в Части 3. :)

показать ответы
2
Автор поста оценил этот комментарий

Листинг программы со всеми домашними заданиями:
http://www.everfall.com/paste/id.php?xs58y9ahi92f=

раскрыть ветку (1)
Автор поста оценил этот комментарий

Уже 5-ый длиннопост? Успех.

раскрыть ветку (1)
Автор поста оценил этот комментарий
0, 1, 2, 2.5, 3, 4 - да это же уже 6й ))
Автор поста оценил этот комментарий

Людей пытается учить человек, считающий, что по младшему адресу лежит старший байт. Вот почему читать надо не всякие гайды в интернете, а одну нормальную книжку

раскрыть ветку (1)
Автор поста оценил этот комментарий

Да, пардон, что-то я заработался, описал порядок для Big Endian. :)

В любом случае его чуть проще понять чем Little Endian :)


P.S. Сделаю заметку на будущее для исправления, спасибо :)

показать ответы
1
Автор поста оценил этот комментарий
нет.... только не псевдографика в консоли...

Возьми какой нибудь движок попроще и опиши использование с примерами для продвинутых программеров

раскрыть ветку (1)
Автор поста оценил этот комментарий
Всему свое время :)
показать ответы
Автор поста оценил этот комментарий

Автор, подскажи... на с++ можно будет сделать бродилку - файтинг?

Или мб подскажи бесплатную программу в которой проще такое сделать.


А если можно, напиши заодно, дойдёт ли до чего-то подобного уровня сложности в твоих уроках

раскрыть ветку (1)
Автор поста оценил этот комментарий

В ближайшем будущем:
#comment_48653053

1
Автор поста оценил этот комментарий

Да неважно. У меня знакомый хочет немного раздуплится в C++, если интересно пообщаться с земляком, скинь свои контакты на webcodekeeper@yandex.ru я ему передам. 

раскрыть ветку (1)
Автор поста оценил этот комментарий
да я уже кидал скайп в прошлом посте - danskendan :)
показать ответы
Автор поста оценил этот комментарий

Да будет путаница в виде "тут мы подключали одни либы, а теперь другие, и что за cout/cin" :D

раскрыть ветку (1)
Автор поста оценил этот комментарий
постараюсь без путаницы :)
Автор поста оценил этот комментарий

Автор, скажи, у меня в папке Release висит два файла с названиями проектов, один экзешник и один .pdb
Так вот, для чего нужен этот .pdb и с чем его едят?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Это файл с отладочными символами, чтобы можно было дебажить экзешник (даже релизный) при запуске в студии и он находил что к какой строке кода относится. В будущем для продакшена он не нужен. :)

показать ответы
Автор поста оценил этот комментарий

@Dansken, привет. Я немного отстал от постов, и пока только разбираюсь в этой части, но уже хотел спросить. Как добавить поддержку кириллицы? Видел в уроках js <meta charset="utf-8"> такое, а тут как реализовать? И ещё вопрос, почему функция(?) main указывается как int? Спасибо за посты, очень полезно. Смотрел другие уроки, но там в основном логика, циклы и т.д., а как это всё в программу связать здесь лучше всего видно.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Привет :)

Поддержку кириллицы проще всего реализовать с помощью Юникод UCS-2 - это использование двухбайтовых символов вместо однобайтовых, перед строками будет большая буква L, а все функции заменятся на соответствующие, но работающие с двухбайтовыми символами:

http://www.everfall.com/paste/id.php?id=js3rh5jcbx92&v=0


Функция main согласно стандарту языка должна возвращать код ошибки, который указывает насколько корректно завершена программа.  Возврат нуля означает, что ошибок нет и программа завершена успешно :) Но в геймдеве я ни разу не видел, чтобы кто-то возвращал что-то кроме нуля :)


У меня все уроки связаны последовательно и если не выполять предыдущие уроки, то хотя бы прочитать их полностью стоит :)

показать ответы
Автор поста оценил этот комментарий

Я часто во время код ревью и менторства новичков замечаю, что большинство не понимает как на самом деле работает const. Более того, Си и С++ содержат синтактический сахар, позволяющий писать const перед объявлением переменной - это только путает.


const - указывает, что выражением перед ним - константно. То есть правильная запись выглядит вот так:


int a = 42;

int const b = a; // переменная b неизменяемого типа int, с значением a;

int const * const c = &a; // неизменяемый указатель с незменяемым значением;

c = &b; // ошибка компиляции! указатель запрещено менять.

*c = 99; // ошибка компиляции! значение по адресу запрещено менять.


Именно из-за того, что const действует на впередистоящее выражение, константные методы класса объявляются с констом в конце объявления, а не в начале:


int getSomeProperty() const;


А объявления перменных с констом в начале это всего лишь синтактический сахар и он довольно часто путает новичков


const int ** ppbuffer; // Спроси новичка что из этого константно, и он не сможет дать уверенного ответа.


Автор, если можешь, используй const без сахара, так молодые программисты будут делать меньше ошибок и нам будет легче на код-ревью.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Да, так наверное было бы лучше )) Просто самого уже приучили к сахару с самого начала ))

показать ответы
Автор поста оценил этот комментарий
А как ты спрайты из Зомбоида вытащил? Там файлы запакованы.
раскрыть ветку (1)
Автор поста оценил этот комментарий

У меня он куплен еще начиная с ранней Альфы, там еще ничего не было запаковано :)

Автор поста оценил этот комментарий

И ещё такой вопрос. Раз вы пишете на C, почему тогда расширение исходника – .cpp?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Для плавного перехода на C++

Автор поста оценил этот комментарий

Переделал игру для того, чтобы можно было вписывать ещё и сложность т.е. количество букв в массиве.


printf("Введите сложность: ");

scanf("%d", &letterscount);

char *letters;

letters=new char[letterscount];


Или к этому по курсу приступать рановато?


раскрыть ветку (1)
Автор поста оценил этот комментарий

Ну почему нет, если умеете? )) Главное не забудьте про delete[] letters;

показать ответы
Автор поста оценил этот комментарий

Автор, подскажи... на с++ можно будет сделать бродилку - файтинг?

Или мб подскажи бесплатную программу в которой проще такое сделать.


А если можно, напиши заодно, дойдёт ли до чего-то подобного уровня сложности в твоих уроках

раскрыть ветку (1)
Автор поста оценил этот комментарий
Если так чтоб чисто развлечься и по быстрому что-то веселое начать, то лучше взять GameMaker или Unity3D, на C++ можно, но прийдется получить приличный багаж знаний ))
Автор поста оценил этот комментарий
И с размером указателя как-то неприлично получилось.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Согласен, сам уже после публикации заметил, что не уточнил про разрядность приложения. В будущем поправлю. :)

показать ответы
DELETED
Автор поста оценил этот комментарий

А разве указатель всегда 4 байта? Для 64 битных программ не 8 байтов?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Абсолютно верно, но мы пока создаем исключительно 32х битные. Нужно было уточнить в посте :)
Автор поста оценил этот комментарий

Офтоп: а откуда взяты мелкие картинки, которые ты в оформлении использовал?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Конкретно тут - часть спрайты из игры Project Zomboid, часть - из моего персонального проекта.

показать ответы