SFML и C++ Уроки \ Разработка игр › Форумы › Домашние задания › Домашнее задание 1 и 2 к уроку 25
В этой теме 1 ответ, 2 участника, последнее обновление vazonov11 7 года/лет, 10 мес. назад.
-
АвторСообщения
-
Задание 1:
Хотел использовать класс Time, но не успел разобраться с ним, поэтому сделал по-другому.
В начале мейна определяю задержку до старта таймера смены направления.
C++1for (i = 0; i < NUMBER_OF_EasyEnemy; ++i) Freeze[i] = (double)((rand() % 200 + 10 ) / 10);Изменил задание врагов, добавляя к ним задержку
C++12for (int i = 0; i < e.size(); i++)//проходимся по элементам этого вектора(а именно по врагам)entities.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, e[i].rect.left, e[i].rect.top, 200, 97, Freeze[i] ));И добавил это в update врага
C++123456789101112131415161718192021222324if (Freeze < 0){if (FlagToStartTimer){RandTime = (double)((rand() % 10 + 70) / 10);startTimer = (double)clock();FlagToStartTimer = false;}else{endTimer = (double)clock();if ((endTimer - startTimer) / CLOCKS_PER_SEC >= RandTime){sprite.scale(-1, 1);dx = -dx;FlagToStartTimer = true;std::cout << "It's works!!!" << std::endl;}}}else{Freeze -= 0.005;}Freeze пришлось добавлять из-за того, что иначе таймеры стартуют практически одновременно, и значения переменных RandTime у всего врагов практически одинаковые. А из-за это они меняют направление движения одновременно.
Задание 2:
Завёл массив флагов для проверки, находится ли игрок в зоне каждого врага и лист указателей на врагов, к которым игрок подошёл слишком близко.
C++12bool flag[3] = { false, false, false };std::list<Entity*>::iterator it, b[3];Проходимся в цикле по врагам. Если игрок слишком близко, то заносим указатель на этого врага в лист b, изменяем скорость врага и направляем в сторону игрока, поднимаем флаг нахождения игрока в радиусе данного врага. Проверяем пересечение врага с solid и если пересекаются, то останавливаем его.
Если игрок далеко от врага и флаг данного врага поднят (то есть игрок подошёл к врагу, а затем отошёл), то возвращаем ему старое ускорение (но в противоположную сторону) и опускаем флаг.
C++123456789101112131415161718192021222324252627282930313233k = i = 0;for (it = entities.begin(); it != entities.end(); it++){if (sqrt(step2(abs((*it)->x - p.x)) + step2(abs((*it)->x - p.x))) <= 200 && abs((*it)->y - p.y) < 400 ){b[k] = it;k++;(*it)->dx = 0.18; //+= 0.01;if (p.x > (*it)->x) (*it)->dx = abs((*it)->dx);else (*it)->dx = -abs((*it)->dx);flag[i] = true;for (int i = 0; i<p.obj.size(); i++)//проходимся по объектамif ((*it)->getRect().intersects(p.obj[i].rect) && p.obj[i].name == "solid")//проверяем пересечение врага с объектом solid{(*it)->dx = 0;}text2.setString("Задавлю!!!");}else if (flag[i]){if (p.dx > 0) (*it)->dx = 0.1;else (*it)->dx = -0.1;flag[i] = false;std::cout << "1";}(*it)->update(time);++i;}Ну а в конце, если нашёлся хотя бы один враг рядом с игроком, то проходимся по всем найденным врагам и выводим над ними надписи.
C++12345678910if (k){for (i = 0; i < k; ++i){text2.setPosition((*(b[i]))->x + 28, (*(b[i]))->y - 34);//позиция всего этого текстового блокаs_dialog.setPosition((*(b[i]))->x + 15, (*(b[i]))->y - 32);//позиция фона для блокаwindow.draw(s_dialog); window.draw(text2);}}Познавательный пост.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.