SFML и C++ Уроки \ Разработка игр › Форумы › Домашние задания › Урок 24 ДЗ (1-4)
В этой теме 2 ответа, 2 участника, последнее обновление Sinsinmin 7 года/лет, 3 мес. назад.
-
АвторСообщения
-
1)
C++12345if (b->life == false){it = entities.erase(it); delete b;entities.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, 1200, 750, 200, 97));}Если прыгнуть на врага в месте его появления, то он будет исчезать и сразу появляться в том же месте. Получится такой абуз убийства врага))
2)
C++12345678if ((p.y + p.h-1 < (*it)->y) && (p.dy >0)){(*it)->dx = 0; p.dy = -0.2; (*it)->health = 0;}else{p.health -= 5;}Пересечение игрока и врага происходит когда пересечение уже произошло, то есть не когда линии p.y = enemy.y, а чуть позже. Когда p.y > enemy.y на p.dy. Ведь за один такт p проходит по Y растояние равно его dy.
Если бы такого не было то можно было написать
C++1p.y + p.h >= (*it)->y)Но…есть ещё один момент. Что отрисовка игрока ещё не произошла. То есть нижний Y игрока уже пересёк верхний Y врага, а на экране хоть это и не видно игрок ещё чуть выше и пересечение как такого ещё нет. Поэтому в логике алгоритма, пересечение происходит чуть раньше на ~dy. А ежели копнуть глубже, то расстояние пройденное игроком по Y при пересечении <=dy. То есть какую то часть игрок пройдёт до пересечения, и какую то часть после пересечения. Соответственно разница будет равна тому расстоянию которое пройдено после пересечения верхнего Y врага. А именно p.dy-(enemy.y-p.y) за один такт до пересечения.
Но так как это всё вычислять долго))) и глупо))
То можно просто из верхнего Y игрока вычесть p.dy. Он у нас максимум равен 0.6. И уменьшается с каждым тактом. Поэтому можно смело ставить 0.61. Но я делал условие до всех этих размышлений, поэтому поставил 1. Так как посчитал что 1 пиксель не будет виден в столкновении на экране. )))
3)
C++12345678910111213141516171819202122232425262728list<Entity*>::iterator itNew;if (b->life == false){it = entities.erase(it); delete b;if (p.x > 650){entities.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, 100, 750, 200, 97));itNew = entities.end();itNew--;Entity *bnew = *itNew;bnew->health = 100;bnew->speed = 100;}else{entities.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, 1300, 750, 200, 97));itNew = entities.end();itNew--;Entity *bnew = *itNew;bnew->dx = -0.2;bnew->health = 100;bnew->speed = 100;}}Если позиция игрока правый край карты, то враг появляется в левом краю карты и наоборот.
4)
C++12345678910111213141516171819202122232425if (b->life == false){it = entities.erase(it); delete b;if (p.x > 650) {entities.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, rand() % 100 + 60, 750, 200, 97));itNew = entities.end();itNew--;Entity *bnew = *itNew;bnew->health = 100;bnew->speed = 100;}else{entities.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, rand() % 500 + 800, 750, 200, 97));itNew = entities.end();itNew--;Entity *bnew = *itNew;bnew->dx = -0.2;bnew->health = 100;bnew->speed = 100;}}Не совсем я понял как работает функция rand(), но насколько хватило моего английского))
rand() % 100 – случайное число от 0 до 100-1, то есть от 0 до 99.
Почему то вначале числа всегда одинаковые, но каждый последующий проход даёт новое случайное число.
Наверное нужно где то рандомайз прописать)) но это не знаю уж
привет, молодец, что выполнил:) держи 5
рандом вначале одинаков скорее всего потому, что отталкивается от системного времени , в начале оно одинаковое, потом программа выполняться может на мгновенье быстрее или медленнее и рандом новый. думаю так.
ДЗ после уроков позволяют попрактиковаться самому, получить ошибки и опыт. Поразмыслить самому.
Поэтому ДЗ после уроков очень хороши. Мне пришлось искать дополнительную инфу по SFML.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.