SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Место вылета пули по отношению к спраюту персонажа
В этой теме 12 ответов, 4 участника, последнее обновление saxartom 7 года/лет, 3 мес. назад.
-
АвторСообщения
-
Здравствуйте, вопрос состоит в том, как узнать координат точки на спрайте по отношению к окну игры, для того чтобы “пуля” вылетал из нужного места, при повороте спрайта на 180. На рисунка, что прилагается визуально отображена проблема.
Красным обозначено координата в одном положении, а желтым как должно изменится.
Вложения:
You must be logged in to view attached files.Привет.
У тебя ведь есть направление игрока. оно у тебя равно направлению пули, при направлении игрока вниз пуле можно задать смещение по x и y
У меня персонаж поворачивается в сторону курсора мыши на все 360. Так же пуля – летит в место клика мыши. И направление пули и персонажа нигде не сохраняется.
Может надо каким то образом определять направление? Если да, то не подскажете каким?В голове теоретически вижу так: поворачиваешь героя – это угол. Есть начальное состояние (смотрит вверх например, пуля слева вверху справа, угол =0 ), думаю можно “появлять” пулю с каким – то смещением в зависимости от самого угла.
“Может надо каким то образом определять направление? Если да, то не подскажете каким?”
Когда то была такая проблема, но я решил “влоб” введя направление движения, но оно мне и нужно было. Просто было около 8 условий, которые давали 8 направлений в зависимости от угла )) от 0 до 45 одно направление, ну и тд.
То бишь, разбить 360 градусов на 8 сегментов по 45 и в зависимости от отклонения мыши от 0, в setPosition спрайта “пули” вводить 8 разных позиций?
да, можно и так. в конце концов направления движения игрока часто должны быть. если игра раздуется , а у тебя враг бьёт сильнее в спину, то если у тебя есть направление движения – ты этот супер удар в спину от врага проверишь одним условием.
спасибо, попробую. Отпишусь как получится.
Я решил проблему по вашему совету так:
добавил в функцию апдейт такой код: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);}}и при нажатии кнопки стрельбы считывал координаты персонажа и угол.
Работает вроде бы корректно, визуально выгладит правильно.Это ли вы имели ввиду, или что-то другое, а я просто не правильно понял?
Да, это. ) ну самое простое и понятное решение. вобще я думал ты направления движения введёшь, но так если устраивает, то оставляй. )
Думаю должно быть решение по красивее и по короче – считать угол, на который ушёл курсор и на такой же угол поворачивать самого персонажа.
персонаж у меня так и поворачивается, как вы говорите)) И действительно там в две строчки.
А вот соответственно в нужное место ставить начало вылета “пули” получилось так. Визуально устраивает, но вот с точки зрения правильности кода – нет)) Но поскольку работает, то пока оставлю и в будущем возможно переделаю.
C++12345// const float DIST_SHOOT_GUN = Расстояние от центра спрайта до дула ружья, подбирается методом тыка// Место появления пули будетfloat angle = atan2f(mousePos.y - hero.getPosition().y, mousePos.x - hero.getPosition().x) * 180/PI;sf::Vector2f dist_Shot_Position(cos(angle * PI/180.f) * DIST_SHOOT_GUN, sin(angle * PI/180.f) * DIST_SHOOT_GUN);CreateBullet(dist_Shot_Position, ....);Heisenberg, мне одному кажется что ты сначала умножаешь переменную angle на 180/PI, а затем на обратное число PI/180. Не лучше ли просто хранить угол в радианах?
C++12345// const float DIST_SHOOT_GUN = Расстояние от центра спрайта до дула ружья, подбирается методом тыка// Место появления пули будетfloat angle = atan2f(mousePos.y - hero.getPosition().y, mousePos.x - hero.getPosition().x);sf::Vector2f dist_Shot_Position(cos(angle) * DIST_SHOOT_GUN, sin(angle) * DIST_SHOOT_GUN);CreateBullet(dist_Shot_Position, ....);Спасибо, по вашему совету, получилось сделать.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.