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

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

Я тебя очень уважаю за твои труды, но лучше было начать давать шарп применительно к юнити, лично моё мнение

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

СЕРЬЕЗНО ? Вы решили объяснять людям как писать игры на С++ ? И "вскользь" пройтись по ООП?  Вы же сами прекрасно понимаете, что "основ" программирования не уместить в двух-четерёх листах А4....

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

Без обид.

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

А во-вторых, я - злостный юнити-хейтер :)))

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

СПАСИБО! Как же мы ждали!

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

У меня вопрос. Можно ли каким то образом сделать массив из функций? Просто перед каждым уровнем надо сделать описание, а оно же разным будет и чтобы не пользоваться switch, можно было бы просто вызывать функции в зависимости от номера уровня. Я где-то читал, что можно сделать указатель на функцию, но больше этого ничего не помню. Подскажи, пожалуйста, как тут удобнее сделать.

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

void Function1()

{

}


void Function2()

{

}


typedef void (*FunctionRef)();


int main()

{

FunctionRef pointer1 = &Function1;

FunctionRef pointer2 = &Function2;


std::vector< FunctionRef > pointers;

pointers.push_back( pointer1 );

pointers.push_back( pointer2 );


(*pointers[0])();


return 0;

}

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

Все, проблему окончательно решил и у меня возник к тебе вопрос. Что должно происходить с противником, когда его убили. У меня есть метод в классе, который этим занимается. Так вот он обнуляет ХП и отрисовывает на месте противника пробел, и выставляет координаты противнику куда подальше (у меня эти координаты находятся за полем игры, куда никто не заходит). Это нормально, что я так делаю или это как-то можно более грамотно реализовать?

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

Так курсовой проект задали реализовать игру именно в консоли, причем применяя MVC в обязательном порядке. Надеялся на Ваши уроки, думал, что поболее вникну в указатели и объекты - и справлюсь, но нет... Причем само описание паттерна вполне понятно, а вот на реализации встрял, не то что с нуля, а даже просто переделать мозгов не хватает.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
Ну если так, то можно просто переименовать часть файлов и классов ))) RenderSystem превратится во View, Game в Controller, а level.h переименовать в model.h )))
показать ответы
1
Автор поста оценил этот комментарий

Нет, уроки то я читаю. Теория нужна. Но вот как реализовать саму игру пытаюсь сам. Потому что иначе это будет просто бездумное списывание.
По поводу перемещения. Как оно происходит у меня прямо по шагам:
1. Высчитываю новую позицию противника (float).
2. Проверяю перешел ли он в новую клетку (if ((int)NewPosition_X == Position_X))
3. Если да, то просто ему прописываю новую координату.
4. Если нет, то тут идет несколько действий:
5. Отрисовываю пробел на старой позиции противника
6. В схему уровня (которая двухмерный массив) ставлю пробел в клетку старой позиции

7. Прописываю новую координату (точно также как в п.3)
8. На новой позиции отрисовываю противника.
9. В схему уровня ставлю значок противника в клетку новой позиции

Так вот у меня вопрос. Так ли я все делаю. Оно работает, но тот баг не дает мне покоя. Если они стоят, то он не возникает, но как они двигаются, то иногда проскакивает эта временная "неуязвимость".

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
Ну пробел точно не нужно рисовать руками, еще с прошлой части это автоматически делает система рендера :) Как и руками не нужно рисовать вообще никакие значки, они автоматически должны рисоваться через вызовы render для GameObject.
показать ответы
1
Автор поста оценил этот комментарий

Можно тебя совета попросить, а то у меня мелкий баг появился, а код я пишу сам, стараясь в твой не смотреть. Можешь словами описать то, как у тебя перемещаются противники вбок. Ну сам процесс по шагам. Вот у меня просто есть специальный класс для противников. Я создал массив из объектов этого класса. Так вот, чтобы каждый противник двинулся, я создал функцию, которая циклом перебирает каждый объект и двигает его (с помощью метода класса) вбок на определенное расстояние. Движение происходит так: если он двигался в своей клетке - просто меняем координату. Если он двинулся в другую клетку, то мы ставим пробел на то место где он был, меняем координату, отрисовываем его в новой координате.

В принципе, все работает, я даже сделал нормальную стрельбу и противники уничтожаются, но есть мелкий баг. Иногда при стрельбе попадаются противники, которым насрать на снаряды, которые попадают в них. Они их как будто проглатывают их. Это происходит буквально долю секунды и как только этот противник перемещается (вбок или вниз), то эта "неуязвимость" пропадает. Мелочь, но довольно досадная. И поймать ее очень сложно.

Я думаю это связано с кривым перемещением.

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

Во-первых отрисовка в клетки не должна влиять на позицию объектов, просто должно происходить отрезание дробной части координат для получения row и column :)
Во-вторых лучше посмотреть как это реализовано у меня, ибо какой смысл тогда в уроках? :)

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

Привет, извини за долгое отсутствие, пару месяцев занят был и что-то забыл про эти уроки. Теперь пора вернутся и делать игры. Так вот, собественно, у меня возник вопрос по поводу реализации классов в этой игре.
Ты сделал класс Game для реализации всей игры, но есть ли в этом смысл, если объект этого класса будет всего один? Не проще ли разбить игру на несколько более мелких классов, чтобы уже на каждый класс было больше одного объекта. Например, класс для уровня, класс для врага и т.п.

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

Смысл в правильной архитектуре. :) Классов должно быть столько, сколько существует сложных отдельных модульных задач :) Ну и я приверженец древовидной архитектуры с главным корневым классом-объектом( Как Game в данном случае ). Остальные объекты должны находится внутри Game, а в них уже могут быть свои объекты, ну и так далее :)
В этом уроке происходит только ознакомление с классами, поэтому тут используется такая упрощенная архитектура из нескольких классов :)

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

Хотел бы напомнить что все ждут новых постов!)

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
Я знаю.. знаю... Уже написано 30% нового поста )))
1
Автор поста оценил этот комментарий
Очень понравились ваши уроки) Будет ли продолжение серии ваших постов?
раскрыть ветку (1)
3
Автор поста оценил этот комментарий
Будет :) Как с работой разберусь - допишу :)
показать ответы
Автор поста оценил этот комментарий

Сделал большую часть.

Осталось сделать второго игрока, чтобы пришельцы делали что-нибудь интересное(например, при смерти) и бонусы. Но в игре и без того уже немало наворочено :)


Из особенностей:

* Стрелять стрелочкой вверх. Пробел не стал, т.к. когда добавится второй игрок, будет не круто.


* Код инвейдера отделен от общих файлов. Можно сказать что получилось подобие движка. Надо будет почитать как в плюсах либы создаются и вынести отдельно, а потом переписать марио и подъемелья. :)


* Экраны. Отображаются либо пока не истечет таймер, либо по нажатию на кнопку. Соответственно есть экран лого/загрузки, экран перехода на новый уровень и окончания игры.


* Пришельцы:

- ярко зеленый: два попадания (потом сделаю, чтобы при смерти создавал других)

- фиолетовый: 3 попадания (потом добавлю, чтобы по кд появлялись новые пришельцы рядом с ней)

- красный: 5 попаданий. Просто танк.


* Через определенный промежуток времени выбирается случайный пришелец и стреляет.


Сорцы тут:

https://github.com/deadly-cat/cpp-space-invaders-console


Экзешник тут:

https://drive.google.com/file/d/0B-5kzMyUwusILUx4OWlqbW5oWDg...


Для ленивых на время теста есть кнопка N. Начинает работать через 2 секунды после старта уровня и сразу запускает следующий уровень.

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

Ну вообще в планах еще две части :)

Девятая - про инкапсуляцию и полиморфизм

Десятая - про подключение графического движка


Как будет время - займусь :)

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
*инкапсуляцию, наследование и полиморфизм


И кстати вот набросок новой части:

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

Очень вдохновился этим уроком и решил сделать более менее полноценную игру. И вот наконец доделал, прошу оценить)

Папка с игрой - https://yadi.sk/d/rJzd5loiooEVzQ , в ней экзешник и мануал по игре, советую сначала прочитать его, там довольно много полезного.

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

Давно меня так не удивляли... Пожалуй, что лучшая работа по этому уроку за всё время :)
Жду теперь Часть 9 ;)

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

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

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

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

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

Все, понял, спасибо. Завтра буду переписывать код так, чтобы у меня был один большой класс Game. И у меня опять вопрос)

У меня есть большой класс Game. Соответственно он должен содержать всякие другие классы помельче. Точнее объекты этих классов. Это значит, что нужно в отдельных файлах, эти классы расписать и подключить эти файлы потом к файлу, где мы описываем класс Game. Но проблема в том, чтобы описать эти мелкие классы, понадобятся переменные из большого класса. Что делать в таком случае?

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

Зачем? Классы нужно разбивать так, чтобы они по-максимуму были самодостаточными и независимыми. Если что-то нужно для настройки, то это можно передать в конструктор при создании.

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

Вот смотри. Конкретный пример. Вот есть массив указателей на объект, в частности на выстрелы. И вот наш персонаж стреляет. Значит должен создаваться объект и его адрес должен передаваться в этот массив, а точнее в элемент массив с каким-то номером. Вот как у меня определяется этот номер. Существует глобальная переменная, которая по началу равна нулю. Персонаж делает первый выстрел и в нулевом элементе массива теперь хранится адрес о первом выстреле. После этого эта переменная увеличивается на один, чтобы следующий выстрел хранился уже в первом элементе массива.
Так вот эта переменная, по сути, является глобальной. И как я понял, у тебя в программе такие переменные являются членами класса Game, да?

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

Ох, это сложно. Но есть очень похожая ошибка, и если с ней разобраться то и та не будет проблемой. Касается она заголовочного файла со всякими константами и прочими переменными, которые используются по всей программе. Если это константа, то проблем нет. Но если это переменная, то как раз вылезает ошибка о множественном определении, потому что этот заголовочный файл встроен почти во все другие файлы программы.

Просто если я ставлю static на таких переменных (в прошлой игре так и делал и это работало), то в этой это вызывает обнуление этих переменных когда не надо.
Как вообще должны быть организованны эти переменные и константы? Где их хранить и как использовать?

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

Константы - можно глобально, можно в классах, по необходимости :)
Переменные - желательно внутри классов, глобальные - только по острой необходимости или для отладки

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

Проблема в том, что даже первый у меня не работает, потому что лежит в заголовочном файле рядом с определением класса, и поэтому выдает ошибку, что массив несколько раз определяется.

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

Скриншоты в студию :)

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

Нет, я не про это. Просто проблему с массивом указателей по другому не решить? Ну, не создавай большой класс Game.

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

Ну я про то, что он не в воздухе должен висеть типа
static GameObject* s_globalObjects[256];
А аккуратно лежат внутри какого-нибудь класса:
GameObject* m_objects[256];

P.S. Работать то будут оба варианта, но второй - правильный с точки зрения архитектуры.

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

То есть, если у меня нет класса, который описывает всю игру, то по другому мне уже не сделать?

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

Вот еще один вопрос возник по той же тематике. Пилю я игру уже по следующему уроку. Там у меня есть заголвочный файл для снарядов, которые выстреливают игрок и мобы. В нем описан класса снаряда. Его методы описаны в файле исходного кода. Все гладко.
Но где создавать массив указателей, где будут хранится указатели на объекты этого класса?
Если создать в файле исходного кода, то пользоваться этим массивом в других файлах будет нельзя. Если создать в заголовочном, то будет выдавать ошибку из-за многократного определения.
Мне помогло только то, что я определил этот массив как static. Но правильно ли это?

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

Я закончил. Подошел ответственно. Сделал 10 уровней. 10 различных противников, 5 бонусов. Полировал от багов пару дней. Вроде таких явных уже не осталось. Посмотри, пожалуйста.
https://wdfiles.ru/901q

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

Огромный плюс за старания ))) К сожалению уровни довольно долгие, поэтому пока на работе особо поиграть не могу :) Выглядит круто ))

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

Не подскажешь, а какие виртуальные коды у клавиш с буквами?

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

А, все понял, спасибо. А почему мы обязательно создаем ссылки на функцию. Можно ли сделать указатель на функцию и создать просто массив таких указателей вместо контейнера?

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

Это и есть указатель :)
Просто "FunctionRef pointer" писать приятнее, чем "void (*pointer)()";

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

Я почти понял. Это контейнер из STL. Мы создаем ссылки на функции и закидываем их в контейнер. Но я не понял вот эту строчку:
typedef void (*FunctionRef)();
И соответственно, что за тип FunctionRef. И смысл последней строчки:
(*pointers[0])();
Что мы с помощью этого делаем?

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

typedef void (*FunctionRef)(); - объявлем свой тип данных FunctionRef, который является указателем на функцию возвращающую void и не принимающую аргументов.

(*pointers[0])(); - разыменование указателя на функцию и собственно её вызов.
показать ответы
1
Автор поста оценил этот комментарий

Все, разобрался. То есть мы в начале создаем массив указателей. Потом туда закидываем динамически выделенный указатель на объект. И дальше на протяжении программы работаем с объектом только через указатель, так?

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

верно :)

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

Ну он же в массиве, как можно удалить его из массива?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
в массиве - только указатель на объект, см. метод destroyObject
показать ответы
1
Автор поста оценил этот комментарий

А вот как бы данную прогу выполнить в стиле Model-View-Controller?

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

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

Думаю, если уж с этой разберусь, то что-то немногим сложнее как по маслу пойдет.

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

Эээм... Ну это ИМХО уже слишком - наворачивать MVC для примитивного консольного приложения :) Оверинженеринг какой-то :)

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

Мотивация не та, но мысль правильная.То, что у класса лишь один экземпляр - это не плохо само по себе. Есть даже такой архитекрутный паттерн, как "Singleton". (Готов поспорить с желающими назвать его антипаттерном).

Модуляризацией приложения можно улучшить абстракцию элементов программы, что упростит поддержку (модернизацию) и позволит проводить их независимое тестирование.


Но чтобы понять, какие проблемы такой подход решает, их нужно встретить самостоятельно.

Ну и монолит пишется компактнее и лучше читается. Новичкам это важнее.

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

Я как Singleton использую в 99% случаев только главный корневой класс-объект :) И то, только с возвратом экземпляра без автоматического создания :) Это отличный паттерн при правильном использовании :)

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

Эту ошибку я понял) 

Но теперь такая проблема((

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

А, разобрался. Теперь exe-шник просто не запускается. Огибку выдает и приложение закрыто(

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Нет метода RenderSystem::initialize, либо его нет в .cpp файле, либо .cpp файл не подключен в проект :)
показать ответы
1
Автор поста оценил этот комментарий

Спрошу на всякий) Как дела на работе?) А то я все жду возможности запилить своих героев с блекджеком)

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

Отлично, пост завершен на 60%, на выходных выложу, а если повезет, то раньше :)

показать ответы
1
Автор поста оценил этот комментарий
@Dansken, подтверждаю.
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Ого.. Постараюсь поскорее найти время для нового поста :D

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

Чего, не будет больше постов?(

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

А мне твои посты очень нравятся! Шикарные оформление и изложение! Если еще дополнительно почитывать какую-нибудь книженцию по си, то посты вообще на "ура" заходят)
Молодец автор, пили дальше, ждем)

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

Спасибо ^_^

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

А еще ты нам про viewport не рассказал. Тоже очень важная часть игростроя)

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

Да в игрострое полно важных частей ))) Я то пытаюсь только основы подать :) Может будет время - после этого курса еще какие-нибудь статьи выпущу :))

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

Планируешь продолжать?)
И если да, то намекни про что новая часть будет?

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

Ну вообще в планах еще две части :)

Девятая - про инкапсуляцию и полиморфизм

Десятая - про подключение графического движка


Как будет время - займусь :)

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

Я решил заморочиться и написал движок на основе твоих уроков. И назвал его Consolity :D

Исходники здесь: https://github.com/deadly-cat/Consolity


Так же создал на его основе игру Galaxy Warrior

Исходники здесь: https://github.com/deadly-cat/cpp-galaxy-warrior
Exe тут: https://drive.google.com/file/d/0B-5kzMyUwusIaGhKd0Y2eTRrSGc...


Управление:

Игрок 1: стрелки - движение, 0 на нампаде стрелять.

Игрок 2: wasd - движение, space стрелять.


Скрины:

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

Силен! ))) Хардкорная игра, враги очень шустрые ))

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

У меня вопрос по архитектуре есть.

Как реализовывать логику объектов и их взаимодействие с миром?
Вот например сейчас у меня в Game большой метод апдейт с кучей кейсов в свиче. Логичнее кажется вынести эту логику в конкретные классы объектов. Но при этом в них помимо дельты придется передавать еще и объект мира, что выглядит не слишком красиво. Хотя как по мне здоровенный свич выглядит менее красивым.

Тот же вопрос касается и взаимодействия пользователя с объектом. Где лучше хранить обработку действий пользователя (нажатия кнопок, движения мыши и т.д)?


Хотя бы вкратце проясни этот момент, пожалуйста.

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

Конечно логичнее :) Для этого используется наследование :)

От GameObject наследуемся классами Ship, Bullet и Alien и у каждого в update будет своя логика :)

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

А еще такой вопрос, который мучает на протяжении третьего урока.

При движении персонажа(корабль, марио, герой) вправо остается шлейф. Как бы от него избавиться? В консоли надо шрифт какой-то выставить или что?


http://prntscr.com/7x7l2t

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Хм, да это какой-то глюк консоли со шрифтом =\
Поставьте в свойствах консоли "Точечные шрифты" и размер шрифта 8x12
показать ответы
1
Автор поста оценил этот комментарий

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

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

Добрый день! Об этом как раз рассказывается в следующем уроке:
https://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_...

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

Добрый вечер, Tinaynox. Было сложно, но я смог (правда только первые четыре дз)! Вот https://yadi.sk/d/caLopD6d3SqqY7  .

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

Весьма достойно! Продолжай в том же духе! :D

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

А вот еще вопрос, почему когда мы создаем класс Game, в нем мы два раза пишем private: , почему одного не достаточно?

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

Охх, без обид, но либо я такой тупой, либо вы слишком косвенно подали ООП.
Сорян

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

Вот иллюстрация почему:
Слева - процедурное программирование
Справа - ООП

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

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

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Ээээ.. Так это все есть в уроках - например, в GameObject передается указатель на Game.
показать ответы
1
Автор поста оценил этот комментарий

Хорошо, тогда к какому модулю мне отнести остатки от класса GameObject?

Совсем торможу уже - вроде все ок получается, и правда. Спасибо за пояснение.

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

остатки от класса GameObject

Что значит "остатки"? GameObject не нужно трогать, нужно просто чтоб все объекты теперь жили в классе Model, который бы в свою очередь находился в Controller

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

Так у меня не укладывается пока в голове, как это аргументировать, что в одном сегменте model or view or controller будет несколько классов.

И как эти классы должны быть друг с другом связаны.

Наследованием?

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

Да как угодно :)) MVC предполагает разделение на Модули, а не на Классы :)) А в Модуле может столько классов, сколько нужно

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

Тогда у меня будет в итоге четыре класса. А это уже сложнее упорядочить в MVC...

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

MVC и не подразумевает как бы что будет всего три класса ))))

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

Но более насущным является то, что преподавателя не устроила

инициализация в Contoller (а я принял за него класс Game)

void Game::initialize() должно производиться в каком-то доп.классе или же в самой Model (касс GameObject). Можешь что посоветовать, а то прям горит...

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

Просто создай класс Model и туда сгрузи массив объектов и все методы работы с ними

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

А, точно, совсем забыл. Спасибо за разъяснение. Вместо контейнера можно обычным массивом воспользоваться?

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

Спасибо. Но это уже чисто для своего развития.

А по курсовому преподаватель сказал,

что никаких лишних "ххх.h" быть не должно.

Чисто MVC. То есть даже файл "level.h" частично

отправить во View, а частично в Model.

А именно, если я правильно понял, то сам уровень

из символов и пробелов (массив срок) в модель GameObject,

а уже преобразование этих символов в символы, которые

будут отображены в консоли - во View - то есть renderSystem...

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

никаких лишних "ххх.h" быть не должно.

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

Не, я не про это. "&" разве не ссылку означает?

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

нет, "&" перед именем переменной или функции означает "адрес"

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

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

Когда while(1) в main() добавил - то появились лаги.

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

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

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

Хотелось бы вот что спросить, насколько я понимаю, "чужие" могут и выходить за рамки правой или левой границы, при этом отрисовываться они будут, дабы не выходить за рамки массива, в старых координатах. Считаю это не совсем честно, так как в этом случае мы просто напросто не сможем в них попасть (а возможен , наверное, и такой исход, что самый последний "чужой" как раз и уйдёт за границу). 

// к сожалению понятия не имею, как можно присылать скрины, так как сам понимаю, что объясняю на достаточно сложном языке)


Ну и хотелось бы лишний раз поблагодарить за то, что находите своё личное время на благо развития человеческой цивилизации )

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

Ну просто чудные новости) а то уже заждался новых постов)

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

Разрешите поинтересоваться: как там разборки с работой? :) Дело в том, что мне совершенно не интересно писать игры, но Вашу теорию С++ я читаю с большой охотой! 

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

Можешь ли ты рассказать как попасть в ГеймДев контору? Рассказать чуть детальнее чем именно вы там занимаетесь, и нужно ли в ГеймДев идти целеустремленно, или можно просто перепрыгнуть например с .net разработки, или с низкоуровневой разработки на С

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

Геймдев направление делится на несколько веток:

1. ААА-игры - всякие там ХалфЛайфы, Варкрафты, Доты, Лиги Легенд :) Качество игр - высокое. Соответственно как и уровень программистов. :)

2. Бизнес-игры - трешовые игры вроде Веселого Фермера или какие-нибудь социальные "стратегии", призванные выкачать все бабло из пользователя :) Качество игр, как правило - посредственное. В такие компании берут и джуниоров и мидлов - устроится на работу плюс-минус легко, особенно с любым программистским опытом работы. :)

3. Детские-игры - очень узкая, низкооплачеваемая сфера геймдева. Самое сложное - это найти такую контору :) Устроится в принципе легко :)

4. Инди-игры - тут полный хаос и неопределенность :) Повезет найти хорошего инвестора или написать гениальную игру - значит повезло :)


Ну для новичка соответственно подходят варианты 2, 3 и 4 :)

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

Наткнулся на данный пост несколько дней назад и хочу задать пару вопросов перед тем как создавать игру по данным урокам, надеюсь на ваши ответы.

Программированием увлекся не так давно (опыта никакого). Есть поверхностные знания по C. Сейчас решил изучить С++. В качестве базового изучения выбрал "Принципы и практика использования c++" автор Бьёрн Страуструп.

Собственно сами вопросы:

1. Хорош ли выбранный мною автор?

2. Хотел бы узнать ваше мнение о том, книги каких авторов следует принять во внимание в начальном ознакомлении с С++ и последующем укреплении знаний?

3. Ну и при каком наборе знаний можно приступить к созданию игры по вашему курсу?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
1. Автор хорош, но не для новичков :) Лучше найти что-то попроще :)

2. Да вот не знаю даже, в основном новичкам рекоммендуют Шилдта :)

3. При нулевом :) Главное - желание и энтузиазм ))

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

Да, но только на шарп) Мне в ваших постах гораздо интереснее система построения игровой механики в коде

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

Ну следующая часть пока не знаю когда )) У меня тут подработка на фрилансе появилась, поэтому пока времени нет =\

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

Огромное спасибо за труд!

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


p.s.

Кто считает, что это всё азбучные истины, и слишком легкие примеры: вам никто не запрещает делать намного сложнее и эффектнее. 

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

Хей! А когда будут следующие части?

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

Скажи, а ты бы не мог скинуть все посты одним архивом? Или поделить все предыдущие уроки на страницы и засунуть в pdf`ку? Думаю, было бы круто)

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

Цикл уроков же еще не закончен :)

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

Коммент получился в стиле сам спросил сам ответил, оказалось нужно просто заполнять пустые элементы пробелами, это вероятно просто условности новых версий VS ?

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

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

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

То есть, надо просто до посинения бомбить корабль?

У меня тут идея: лучше, если будут уязвимыми определенные сектора определенное время, например квадрат 3х3 или 2х2, ну с ответным огнем будет интересно по ним стрелять. 

С этой приблудой можно будет изменять лвл (сложнее - время уязвимости меньше). 


П.С. Перечитываю коммент.. Это я щас как супир-ультра-стартапер выгляжу?

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

Dansken, спасибо за новую часть! Довольно большое количество вопросов появляется и чтоб не разводить здесь ток-шоу "Вопрос - ответ" прошу посоветовать пару-тройку книг/учебников для новичков. Уверен, что 90% вопросов отпадут.

P.S. Реально хочу научиться =)

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

Вот так чтоб читать как книгу - не подскажу.. На своем веку именно "интересных" книг "для чтения" по C++ я не видел.. А если как технический справочник, то любая известная думаю подойдет - Страуструп, Шилдт и т. п.

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

Круто) Буду очень ждать.

А пока не подскажешь на какой движок стоило бы обратить внимание, чтобы попробовать свои силы?

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