Созданные ответы форума
-
АвторСообщения
-
Кодировка на коментариях…. Явно не UTF-8, а кракозябры не читаемы и переводить каждую строку – лень. Собственно потому я если и пишу аннотации – то на английском. Если хочешь – могу выложить свои наработки на C#, может чего интересного там найдёшь (если знаешь плюсы то в шарпе всё будет интуитивно понятно, единственное но что плюсы не поддерживают рефлексию ). Кстати есть детектор коллизии основаный на SAT для наклонных поверхностей и т.д.
У тебя только два варианта – либо просчитывать всю коллизию в одной плоскости и под одним углом, либо делать лоигку столкновений основываясь на SAT (Separated Axis Theorem aka Теорема разделённых осей кординат). В последнем – все прямоугольники будут заменены на вектора точек описывающих контур, но его беда в том что он не может просчитывать поднутрения у контура (Т.е. если одна из точек окажется внутри контура – коллизия будет просчитыватся через соседние в списке точки – ушедшая во внутрь просто выпадает.) Box2D использует именно этот способ просчёта столкновений и нахождения Minimal Translation Vector (Минимальный вектор смещения для вывода одного контура из другого по направлению вектора нормали (Перпендекуляр к отрезку))
Ну, могу только вытащить из недр системы реализацию анимации, хотя я её вроде выкладывал уже сюда кому-то. Сам уже перекочевал на C#, плюсы более менее понял – пусть дальше идут лесом, мозговыжигалку я уже прошёл
Учти что для использования изомтерии тебе придётся делать имплементацию для этого. Столкновения не происходит ибо проверка вида сбоку и сверху НЕ подходит для изометрии: Картинка
21.09.2017 в 23:23 в ответ на: кто знает как исправить такую проблему подскажите пожалуйста ?? #4887Некропстингом занимаешсья, Sanya_drug?
28.08.2017 в 08:00 в ответ на: Помогите.. не могу заставить работать цикл взаимодействия с картой. Урок 11 #4870+1Вобще для кода на сайте есть специальный модуль – пожалуйста, пользуйся им а не сливай свои файлы – хидеры.
Вылетает ошибка – скриншот с содержимым приложить?
В каком месте ты вызываешь этот метод? Точно ли ты передаёшь в качестве аргумента ссылку на игрока в момент вызова?Поправочка. в строке vec = vectorRotate(sf::Vector2f(1,0),360 angle) должно быть не 360 а 180. Ночью котелок порой варит вообще не в ту сторону
Помоему в разы проще чем делать коллизию на SAT. Берёшь вектора цетров окружностей и проверяешь дистанцию между ними – если дистанция меньше чем сумма радиусов – выталкивай вектора центров в противоположных направлениях на велечину пересечения.
Будет примерно такC++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647struct Circle{float r = 10;sf::Vector2f center = sf::Vector2f(0,0);}//Угол между двумя векторами//Возвращает градусы!float getAngle(sf::Vector2f start, sf::Vector2f end){return atan2((start - end).y, (start - end).x) * 180 / 3.14159265;}//Длинна вектораfloat getVDistance(sf::Vector2f start, sf::Vector2f end){return std::sqrt((abs((start - end).x)*abs((start - end).x)) + (abs((start - end).y)*abs((start - end).y)));}//Поворот вектораsf::Vector2f vectorRotate(sf::Vector2f& vec, const double deg){double theta = deg * mRad;auto cs = cos(theta);auto sn = sin(theta);sf::Vector2f p = vec;return vec = Vector2f(cs * p.x - sn * p.y, sn * p.x + cs * p.y);}void foo(Circle fi, Circle se){float dist = getVDistance(fi.center, se.center);if ( dist < (fi.r + se.r)){float angle = getAngle(fi.center, se.center);float delta = (fi.r + se.r) + dist;delta /= 2;sf::Vector2f vec = vectorRotate(sf::Vector2f(1, 0), angle)vec.x *= delta;vec.y *= delta;fi.center += vec;vec = vectorRotate(sf::Vector2f(1, 0),360 - angle)vec.x *= delta;vec.y *= delta;se.center += vec;}//Код набросан на вскидку ибо давно уже (больше 2 лет ибо мне хватает SAT) не задумывался о движке коллизии.}idris070, Некропостинг. А вобще эта проблема отпадает если правильно переписать весь код (Буржуй чёт нахимичил лишнего в коде на видео а остальные неглядя код скатали).
Если делать привязку к globalRect тебе будет удобнее работать так как при рескайлинге/повороте изображения ты будешь получать прямоугольник описывающий всё изображение. И можно сразу работать с альфа каналом в редакторе изображений – не придётся мучатся с масками в коде (Я использую .Net Paint).
Тогда я привёл метод поворота вектора. Учти что поворот производится вокруг вектора [0, 0] так что не забудь вычесть из вращаемого вектора точку вращения.
Про блоки: я имел в виду что текстукри одинаковых размеров и имеют Origin Point по середине этого “кубика”.
То что ты изменяешь текстурку для подгона – плохая затея. Делай подгон позиции башни под танк (Всё тот же приведённый мною метод в помощь – вращение даст тебе круг. Ну а где центр этого круга надеюсь рассказывать не нужно)
И зачем ты делаешь лишний шаг с Image -> Texture? Ты собираешься прямо в игре как либо перерисовывать пиксели на текстурке? Если нет то используцй сразу Texture минуя Image (Учитывая что мы работаем с C++ память лишней не будет).
Ну и в чём проблема с нужным направлением? На сайте был же уже тутор как заставить картинку поворачиваться в сторону курсора и перемещатся при зажатии кнопки. Метод который даст тебе возможность получить угол между двумя векторами. Если нужно получить угол относительно системы кординат то в качестве первого аргумента передай Vector2f(1, 0)C++1234float getAngle(Vector2f start, Vector2f end){return atan2((start - end).y, (start - end).x) * 180 / 3.14159265;}Ну и можешь из этого получить угол поворота башни и снаряда передав в первом аргументе центр башни и второго – позицию мыши с применённым оффсетом View(Верхний левый угол поля зрения)
Хм, хотя с краем ствола всё же тебе нужно смотреть как ты вращаешь спрайт, где у него Origin Point и как у тебя вобще выполнен спрайт(Я думал что у тебя и танк и пушка размером 1×1 блок. В твоём случае это может не сработать в том виде в котором я описал но думаю ты понял суть).
Просто смотри расстояние от Origin Point до края ствола в исходном положении и когда повернёшь единичный вектор (длинна которого всегда == 1) просто умнож его на эту длинну. Как исходный единичный вектор принимай Vector2f(1, 0) (Поворот 0 deg == 0 rad)Массштаб: а вы смотрели в класс View? Там же есть такие нужные тебе методы setSize и zoom(Насчёт последнего: он просто делает рескайлнг относительно текущего Size и похоже не сохраняет своих результатов)
С краем ствола всё легко: Для начала делаем вектор длинной половины спрайта пушки и поворрачиваем его на угол поворота ствола. Позже берём вектор находящийся по центру спрайта пушки и прибавляем к нему первый – задача выполнена
C++12345678910const float mPi = 3.14159265f;const float mRad = mPi / 180.f;Vector2f vectorRotate(Vector2f& vec, const double deg){double theta = deg * mRad;auto cs = cos(theta);auto sn = sin(theta);Vector2f p = vec;return vec = Vector2f(cs * p.x - sn * p.y, sn * p.x + cs * p.y);}Ну и полёт снаряда: просто сделай некую переменную в классе пули которая будет вычитатся каждый игровой тик и при достижении условия var <= 0 пуля будет удалена из массива.
Дк Tiled предоставляет возможность выставялть дополнительныйе параметры к объектам. Через TinyXML как либо сделай считывание этих параметров либо найди в интернете TMX Parser для SFML
Глянь в соседнюю тему с OriginPoint в реализацию AnimatedSprite::update(sf::Time frameTime) и Animation::update(sf::frameTime)
-
АвторСообщения