Спустя неделю все же наконец доделал урок и все домашние задания. В процессе ловил невероятное количество багов по самым наиглупейшим причинам и испытывал невероятное удовлетворение когда наконец удавалось их пофиксить. За это время накопилось немного вопросов:
1. Почему в вашей игре около 30к фпс, а в моей всего 7к?
2. Я наверное дурачок, но я абсолютно не понял часть кода в предпоследнем слайде, а именно "unitType==UnitType_None", объясните пожалуйста, зачем нужна эта проверка.
Ну и конечно прошу оценить то что получилось, в игре всего 2 уровня и большинство выполненных ДЗ находятся именно во втором. https://yadi.sk/d/TheKvhuDjXp0LA
По уровню хардкорности эта игра явно соперничает с Dark Souls...
Тут определенно не хватает счетчика смертей :D
Ответы:
- хз, производительность процессора, версия консоли, все что угодно )) Когда фпс измеряется тысячами это не имеет значения )
- Это проверка, что препятствие сбоку - это не юнит, а значит нет смысла идти на него( атаковать ) и нужно развернуться в другую сторону
блин( голову себе сломал, но не смог заставить двигаться спрятавшуюся черепаху. Точнее могу ее заставить двигаться, но тогда все они (если их больше 1ой на экране) начинают гонять и УБИВАТЬ (меняю характеристику скорости в описании существа).
https://yadi.sk/d/_rJA8rd6sFfRp
Автор, если не сложно, подскажи, как это можно реализовать?
Вот мой самый первый черновой вариант с перевернутыми черепахами, чисто для ознакомления:
https://drive.google.com/file/d/0B3_Edi1DQIOhOVhvdG5jU0diTnM...
:)
P.S.
@Dansken, вот моя "Go, рубль, go!" версия :)
Только не понял куда там вставлять условие, чтобы мертвая черепаха сначала на месте стояла. Но она и так убивает все на своем пути.
Спасибо за твои старания, если нужна будет какая-нибудь помощь, обращайся. Деньгами сильно помочь не могу(т.к. студент неработающий еще), но небольшую сумму скинуть могу. Или там, например, помочь с поиском информации в нэте и т.п..
Вот тут лайк можешь поставить, если Стим аккаунт есть:
http://steamcommunity.com/sharedfiles/filedetails/?id=619492...
;)
P.S. Оригинальная графика ))))
P.P.S. Еще и столько скрытых блоков - зачет вообще )))
deltaSpeed = gravitySpeed * deltaTime; (dv = v*dt) - физики не одобрят. Но это не страшно, длиннопост отличный, как и предыдущие. Продолжай в том же духе!
Я кажется понял в чем дело. Вы говорили о цепочке проверок
if ...
else if ...
else if ...
...
А я вас понял так словно вы говорили о вложенных проверках, когда внутри блока if или else используется еще if.
В таком случае я снимаю свои претензии, так как действительно существует много паттеронов чтобы уменьшить такие проверки, более того, сами такие проверки это источник потенциальных багов, так как они жестко связаны между собой и изменение одной, влечет изменение всех остальных.
Но мне кажется, что на данной стадии уроков не стоит грузить учеников паттернами, для них даже такие простые вещи на С++ это уже огромный шаг. Паттерны они потом сами освоят по книжкам, это не сложно на самом деле, когда есть интерес. Именно поэтому сейчас важно не перегрузить, чтобы не отбить весь интерес заниматься этим.
Уважаемый @Dansken, могу ли я поинтересоваться, когда выйдет следующий длиннопост по этой тематике?
Лови, набросал за полчасика, может сгодится на что-то :)
https://drive.google.com/file/d/0B-jUIcoflGh7djlvNUtsQXVoMXc...
https://drive.google.com/file/d/0B-5kzMyUwusIUTJ1S29BdFRGX3c...
Сорцы в топовом комменте этой ветки :)
Выбиваем гриб и сразу же выбиваем кристалл => получаем ездящий кристалл! :)
P.S. Сложно когда даже героем нельзя касаться врагов - очень хадкорно особенно против прыгающих ))
P.P.S. Гуси совсем бессмертные?
P.P.P.S. А не, в бездне умирают )))
Постройка по вершинам и повороты.Мы даже на бумаге не можем реализовать это.Есть версия про соединение четырёх точек попарно линиями(Первая-со второй и четвёртой,2 - с 1 и 3 и т.д),а вот с поворотом сложнее,так как матричный способ мы не осилили.
эээ? А чем вас учили графику то выводить? :)
Формула поворота точки на на угол angle вокруг начала координат:
newX = x*cos(angle) - y*sin(angle);
newY = x*sin(angle) + y*cos(angle);
Добрый вечер Tinaynox . Дз сделаны не полностью, зато я добавил стрельбу на пробел=))
https://yadi.sk/d/ZtmRha8Y3QSyTp
п.с. вносить изменения в такую структуру кода, как у вас, одно удовольствие, никаких тебе непонятных int x, и т.д.
Ну просто надо было несколько уровней сделать, а придумывать новые уровни было лень. Поэтому придумал так, и механика перехода уровней есть, и уровней самих нет.
С прыжками очень долго мучился. В итоге сделал так, что при прыжке герой получает отрицательную скорость и каждый цикл эта скорость увеличивается на какую-то величину (зависит от времени), пока не станет равной величине гравитации. И каждый цикл на всех действует эта вертикальная скорость, но твердая поверхность не дает им провалится.
Была еще проблема, что персонаж мог прыгать, даже если поверхность находилась через клетку от него, что выглядело убого. Но это тоже исправил, я просто после каждого прыжка ставлю персонажа на клетку Номер_клетки + 0.999, а при прыжке проверяю есть ли в клетке +0.001 от герой поверхность или нет.
Ну из явного дискомфорта ощущается то, что скорость по Y не обнуляется при столкновении башкой с блоком сверху :) И почему-то очки не начисляются :)
Я смог наконец-то сделать ее. Правда я писал ее почти с нуля. На твой код почти не смотрел взял только задания. Есть пара мелочей, которые надо бы допилить, но в целом оно вроде работает.
http://wdfiles.ru/1FH7
Также по ходу разбора кода заметил, что блок "// Only monsters actions" в MoveToUnit() можно полностью убрать, если немного модернизировать блок "// Can not move cell left" и аналогичный "...right" в UpdateAI() -- ведь монстры отталкиваются от всего, кроме пустоты -- остается только добавить нанесение урона при встрече с героем:
@Dansken, небольшой вопрос по поводу отрывка из функции UpdateUnit():
зачем локальной переменной row обновлять свои данные, если последующий блок кода в котором упоминается row не выполнится из условия if-else, или это ради эстетики? Аналогичный отрывок и с X: column = int(pointerToUnitData->x);
Пардон, я там изначально как-то алгоритм с последующим использованием row и column строил, но потом упростил и забыл это убрать :))
Во первых не увеличиваешь unitsCount:
unitsCount++
А во вторых там еще куча багов ))) Короче попробуй построчно сравнить с моим кодом :)
https://yadi.sk/i/_rwGpbJ8nRXYc Посмотри пожалуйста что не так, почему-то "марио" не ходит.
Спасибо за урок, сделал всё, кроме прыгающих гусей, как только не пробовал сделать, но что-то всё не выходит( Потому есть только обычные гуси) Было бы неплохо, если бы вы направили меня что ли, пока пробовал в UpdateAI сделать отлов того, что это JumpKoopa и если он, то order указываем Backward, но не работает(
п.с. второй игрок включается на шифт, там сверху написано будет)
https://drive.google.com/file/d/0ByEaJ3u-v31md1FkTlB1TXNNZ28...
Отличная игра, даже пришлось попотеть над вторым уровнем )))
А по поводу JumpKoopa - так по идее и нужно делать, нужно дебажить, искать ошибку :)
Спасибо,но увы,мы не можем это открыть и использовать.Делать необходимо в CodBlocks,а к визуалке нам запрещено подходить.
Ну принцип тот же самый :) Смотри внутренности файла main.cxx :)
А в сети валяются мануалы как эту либу прикрутить к чему угодно:
https://www.youtube.com/watch?v=FxCdMM9H66I
Раз уж ты все еще не выпустил новый урок, решил пофиксить баги))
Изменения:
* исправлен баг, когда марио умирал запрыгивая на противников
* добавлен туман войны
* добавлен рестарт уровня по клавише 'R'
https://drive.google.com/file/d/0B-5kzMyUwusIajUwUmFCbVUyTm8...
разыменование указателя и доступ к полю структуры одновременно.
(*pointerToSomeStruct).field = 10;
и
pointerToSomeStruct->field = 10;
это одно и тоже
Чувак, ты крут )
Напоминает то, чем я занимался в 10-летнем возрасте )
Один вопрос: почему Купы -- это гуси? :D
В посте назвал на автомате ))
У меня вопрос, Я вообще .net'чик. Просто залез посмотреть. Для меня все эти многоуровневые if - else'ы выглядят как жуткий говнокод. Но подозреваю что это специфика языков С\С++? Так вот вопрос, сколько лет опыта работы с языками у тебя? Или это ты учишься и выкладываешь?
В посте назвал на автомате ))
А в том то всё и дело,не было у нас графики весь семестр,дальше загрузки текста из файла не ушли.Зато практику дали по графике.На первой паре препод не смог библиотеку графическую залить себе.А как будет выглядеть кусок с рисованием вершин?
А препод - большой оригинал... Консольный вывод его насколько понимаю не устроит? А что за графическая библиотека?
А можно вопрос не совсем по игре,но так же по C++?Дали задание:Пользователь вводит координаты вершин(не более 4 точек) и полученную фигуру мы должны перемещать или поворачивать по\против часовой стрелке при нажатии на соответствующие клавиши\кнопки.Мы с другом уже 4 день не можем реализовать первую половину задания.Можете помочь?
Никак не могу понять где у меня ошибка.
https://github.com/deadly-cat/cpp-mario-console
Грибы двигаются только влево и ни в какую не хотят менять направление.
Возможно программа попадает в бесконечный цикл или проблема в самом апдейте, ставь точку останова внутри Update, запускай и смотри как там идет выполнение, или не идет :)
Если не доходит до Update, то нужно отдебажить SetupSystem и инициализацию.
https://yadi.sk/i/3g8kzZyLhnaAk main.cpp
https://yadi.sk/i/C4t_Y-KQhsvYK generator.h
https://yadi.sk/d/4Amh3LsChsvb6 game_6
Я придумал генератор уровней, но всё перестало двигаться как можно это исправить?
А что конкретно значит "все перестало двигаться"? Попробуй выполнить пошаговую отладку программы с точками останова :)
if( pointerToUnitData->ySpeed > 0.0 )
pointerToUnitData->ySpeed = 0.0;
if( pointerToUnitData->ySpeed < 0.0 )
pointerToUnitData->ySpeed = 0.0;
Ну это логично, судя по тематике твоих постов)
Еще вопрос, а есть возможность генерации уровня, всмысле не самому забивать массив, а делать автоматически это все?
И еще, жду очень постов с графикой, ты их будешь следующими пилить?
P.S. Не следующими, но буду :)
http://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_n...
А еще посмотри Часть 5.5:
http://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_n...
Ну что более графическое. Я в этом не очень разбираюсь, но какое-нибудь создание проектов-игр при помощи OpenGL. Я как-то написал там кубик Рубика, но не очень хорошо разобрался с интерфейсом некоторых классов и прочим. И что-то менее сухое, чем маны))
Спасибо огромное) думал, что поломал что-то) И еще вопрос, примеры с добавлением таких рисунков как у тебя в постах, будут еще? Очень хотелсь бы запилить что-то типа героев вторых)
Народ, такой вопрос, фигня с visual, нормально работал. Потом комп перезагрузился, и теперь при компиляции пишет что не может открыть source файл. Переустанавливал visual-не помогло. Кто знает как бороться?
Продолжение будут? Если нет, то где об этом всяком можно почитать? Я не профан в программировании, если что
Не читал предыдущие части, как и эту, но всё же интересно, как реализована отрисовка. Это просто вывод разноцветных символов в определённом месте?
Если будет не лень, то исправлю, чтобы касание снизу-вверх не считалось))
Гусей которые спрятались в панцирь убить никак нельзя. Только остановить, но это уже очень крутой скилл нужен. У меня не получилось )))
Летающие и бегающие вполне смертные)
Well done... До последнего ждал в начальном запертом боксе какую-нибудь пасхалку, а там всего-лишь еще один гриб :)
Это еще что. Иногда возникает баг, что сам персонаж становится гумбой и ездит туда-сюда. :D Не смог отловить почему так происходит.
Я сделал простые уровни(потому что меня раздражало падать на первом уровне или убив гумбу не мог запрыгнуть на трубу), поэтому надо было добавить хардкора)))
https://drive.google.com/file/d/0B-5kzMyUwusIUTJ1S29BdFRGX3c...
Сорцы в топовом комменте этой ветки :)
У кого будет требовать dll-ку, скачайте и поставьте vc_redist.x86 отсюда:
https://www.microsoft.com/en-us/download/details.aspx?id=468...
Игра - супер ))) А перезапуска для безвыходных ситуаций нет? )))
Потратил два дня, но реализовал все задания :)
Теперь у меня свой марио с луиджи и гусями.