Созданные ответы форума
-
АвторСообщения
-
Под остановкой возле стены, вы имеете ввиду обнуление переменных-ускорений по осям?
Почему-то обнуление не работает, в том смысле, что персонаж не останавливается. Я проверял – сами переменные обнуляются а персонаж двигается. Пробовал размещать вызов апдейта для стен, и до, и после апдейт для героя, разницы нет.
Не подскажете в чем может быть причина?
Спасибо, попробую.
Можешь попробовать записать в переменную заранее начальный цвет с помошью getColor. А потом когда надо передать его спрайту обратно.
Спасибо, отчасти работает, но почему то при ходьбе по диагонали вверх-вправо и вверх-влево и стрельбе, он идет просто вверх. При ходьбе аналогично по диагонали вниз все нормально.
Сначала я попробовал запихнуть эту конструкцию в обработчик событий:
C++12345678910111213if (event.type == Event::MouseButtonPressed)if (event.key.code == Mouse::Left){if (timer_Bullet > 150.f){Bullet.push_back(new TBullet(weaponsSprite, "MachineBullet", hero.x, hero.y, hero.anim.anim.sprite.getTextureRect().width, hero.anim.anim.sprite.getTextureRect().height, hero.STATE));--(static_cast<TWeapons*>(Inventory.inventory[2])->ammo);timer_Bullet = 0.f;}}}else{hero.shoot = false;if (hero.onHandM) static_cast<TWeapons*>(Inventory.inventory[2])->reloadWeap(hero);}Но так пули стали вылетать только по одной за одно нажатие.
Потом я попробовал реализовать ваш вариант, и пули вообще перестали вылетать.
Я отследил ход обработки кода, и если во время стрельбы начать двигаться, то прерывается это условие
C++12345if (timer_Bullet > 150.f){Bullet.push_back(new TBullet(weaponsSprite, "MachineBullet", hero.x, hero.y, hero.anim.anim.sprite.getTextureRect().width, hero.anim.anim.sprite.getTextureRect().height, hero.STATE));--(static_cast<TWeapons*>(Inventory.inventory[2])->ammo);timer_Bullet = 0.f;}и соответственно стрельба прекращается((
Как я предполагаю условие выше нужно обрабатывать параллельно с ходьбой. Это случайно не в сторону потоков надо копать?
Или я уже не туда полез?
You’re God damn right. ))
Вот упрощенная версия кода:main.cpp
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354while (window.isOpen()){timer_Bullet += time;while (window.pollEvent(event)){.....}for (it = Bullet.begin(); it != Bullet.end(); it++){if (!((*it)->isMove)){(*it)->mouseCoord.x = pos.x;(*it)->mouseCoord.y = pos.y;(*it)->rotBull = atan2f(pos.x - hero.x, hero.y - pos.y) * 180.0 / M_PI;}(*it)->isMove = true;}for (it = Bullet.begin(); it != Bullet.end(); it++){if ((*it)->isMove){distanceBull = sqrt(pow(((*it)->mouseCoord.x - (*it)->x), 2) + pow(((*it)->mouseCoord.y - (*it)->y), 2));if (distanceBull > 100){(*it)->x += (*it)->speed*time*((*it)->mouseCoord.x - (*it)->x) / distanceBull;(*it)->y += (*it)->speed*time*((*it)->mouseCoord.y - (*it)->y) / distanceBull;}else{(*it)->isMove = false;(*it)->life = false;}}}for (it = Bullet.begin(); it != Bullet.end();){(*it)->update(time);if ((*it)->life == false){it = Bullet.erase(it);}else it++;}if (event.type == Event::MouseButtonPressed)if (event.key.code == Mouse::Left){if (timer_Bullet > 150.f){Bullet.push_back(new TBullet(weaponsSprite, "MachineBullet", hero.x, hero.y, hero.anim.anim.sprite.getTextureRect().width, hero.anim.anim.sprite.getTextureRect().height, hero.STATE));--(static_cast<TWeapons*>(Inventory.inventory[2])->ammo);timer_Bullet = 0.f;}}}else{hero.shoot = false;if (hero.onHandM) static_cast<TWeapons*>(Inventory.inventory[2])->reloadWeap(hero);}for (it = Bullet.begin(); it != Bullet.end(); it++)if ((*it)->life)window.draw((*it)->sprite);}Спасибо. В “стационарном” положение работает. Но если стрелять “на ходу”, то по какой-то причине, при зажатой клавише стрельбы, он стреляет один – два раза и прекращает. Не подскажете где искать ошибку. Если надо скинуть какой-то сегмент кода – говорите.
Спасибо, но как насчет общей структуры инвентаря? Стоит ли вообще дальше развивать эту структуру, или есть более удобные (или попросту лучшие) варианты для реализации инвентаря?
Спасибо, по вашему совету, получилось сделать.
персонаж у меня так и поворачивается, как вы говорите)) И действительно там в две строчки.
А вот соответственно в нужное место ставить начало вылета “пули” получилось так. Визуально устраивает, но вот с точки зрения правильности кода – нет)) Но поскольку работает, то пока оставлю и в будущем возможно переделаю.
Я решил проблему по вашему совету так:
добавил в функцию апдейт такой код:C++12345678910111213141516171819202122232425262728293031323334if (rotBull > -22.5 && rotBull < 22.5){sprite.setPosition(x + 21, y - 40);sprite.setRotation(rotBull);}if (rotBull > 22.5 && rotBull < 67.5){sprite.setPosition(x + 42, y - 13);sprite.setRotation(rotBull);}if (rotBull > 67.5 && rotBull < 112.5){sprite.setPosition(x + 40, y + 21);sprite.setRotation(rotBull);}if (rotBull > 112.5 && rotBull < 157.5){sprite.setPosition(x + 13, y + 42);sprite.setRotation(rotBull);}if (rotBull > 157.5 || rotBull < -157.5){sprite.setPosition(x - 21, y + 40);sprite.setRotation(rotBull);}if (rotBull < -22.5 && rotBull > -67.5){sprite.setPosition(x - 12, y - 42);sprite.setRotation(rotBull);}if (rotBull < -67.5 && rotBull > -112.5){sprite.setPosition(x - 40, y - 21);sprite.setRotation(rotBull);}if (rotBull < -112.5 && rotBull > -157.5){sprite.setPosition(x - 42, y + 13);sprite.setRotation(rotBull);}}и при нажатии кнопки стрельбы считывал координаты персонажа и угол.
Работает вроде бы корректно, визуально выгладит правильно.Это ли вы имели ввиду, или что-то другое, а я просто не правильно понял?
спасибо, попробую. Отпишусь как получится.
То бишь, разбить 360 градусов на 8 сегментов по 45 и в зависимости от отклонения мыши от 0, в setPosition спрайта “пули” вводить 8 разных позиций?
У меня персонаж поворачивается в сторону курсора мыши на все 360. Так же пуля – летит в место клика мыши. И направление пули и персонажа нигде не сохраняется.
Может надо каким то образом определять направление? Если да, то не подскажете каким?Я сделал, но все равно конечная точка изменялась.
Я добавил проверку условия, чтобы координаты считывались, только в случае, когда “пуля” не двигается, то есть в самом начале, и все заработало.
Все равно спасибо.
-
АвторСообщения