SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Некоторые вопросы при создании игры.
В этой теме 6 ответов, 2 участника, последнее обновление KindRedSand 6 года/лет, 9 мес. назад.
-
АвторСообщения
-
Всем привет. У меня не один вопрос, а 4-5, поэтому я не уточнял в заглавие о чём речь.
Решил вот сделать плоскую 2д стрелялку танковую. Сам я новичок.
Танк я делаю созданием двух составных частей (спрайтов): корпуса и башню цепляю по координатам в зависимость от корпуса.
Башню могу поворачивать – setRotation(angle). Уже сделал класс снаряда, при нажатие на кнопку огонь создаётся снаряд, он поворачивается под углом под которым находится и башня. Тут всё гладко.
А проблемы во-первых смотря в будущее – с масштабом. В будущем я хочу сделать танковые бои между танковыми группами (10 на 10 например). Следовательно надо будет уменьшать масштаб всего этого дела чтоб всё умещалось (не динамически, а просто одноразово, когда придёт необходимость, не в процессе игры). И вот тут я плаваю… Сейчас ли сразу в паинте уменьшить изначальные текстуры, или как-то гибко в процессе игры их менять? Дело в том, что setScale, как я понял, создаёт иллюзию визуальную, но не уменьшает реально объекты. Это может сыграть злую шутку.
Не подсказали бы как тут лучше поступить?
Второй момент связан с тем чтобы вычислить ту позицию – точку откуда должен вылетать снаряд (край ствола). При поворотах башни опять же, как я понял, фактическое положение прямоугольника, описывающего положение спрайта башни, остаётся первоначальным.
Третий момент связан с направлением полёта снаряда. У автора сайта есть уроки которые немного об этом. Но там вроде как есть такая переменная как КОНЕЧНАЯ точка пути. А в моём случае танк бабахнет в каком-то направление и всё, без конечной конкретной точки.
Очень был бы признателен за советы доступные для новичка.
П.С Пункт 1 меня так волнует как раз из-за других пунктов.
Вложения:
You must be logged in to view attached files.Массштаб: а вы смотрели в класс 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 пуля будет удалена из массива.
Хм, хотя с краем ствола всё же тебе нужно смотреть как ты вращаешь спрайт, где у него Origin Point и как у тебя вобще выполнен спрайт(Я думал что у тебя и танк и пушка размером 1×1 блок. В твоём случае это может не сработать в том виде в котором я описал но думаю ты понял суть).
Просто смотри расстояние от Origin Point до края ствола в исходном положении и когда повернёшь единичный вектор (длинна которого всегда == 1) просто умнож его на эту длинну. Как исходный единичный вектор принимай Vector2f(1, 0) (Поворот 0 deg == 0 rad)Спасибо за ответы!
Посмотрю класс View. И правда глупо, что я про него не подумал.
“как у тебя вобще выполнен спрайт(Я думал что у тебя и танк и пушка размером 1×1 блок” – тут правда пока не понимаю про блоки.
Я как делал: просто в паинте рисовал эти текстуры и в программе в Image их грузил, Image в Текстуру, а текстуру в Спрайт. И всё.
Но сейчас смотрел видео в Ютубе, там человек создал Ректангл Body и в него сделал setTexture.
И я запутался как правильней(!).
Надеюсь, View мне поможет, так как когда я озадачился тем что бы уменьшить модельки, я полез в Паинт и там менял размеры изображения. Это неправильно. Плюс в программе всё равно небольшая подгонка была Башни под Корпус. Грубо говоря чтоб Башня встала ровненько на Корпус я башне дал координату Корпуса Х и прибавил 20 пикселей и по У прибавил пикселей 30 чтоб всё встало ровно. Но при изменение размера моделек эти цифры 20 и 30 неактуальны и приходится заново примерять.
А Origin у меня и правда не там где он по дефолту, чтоб башня крутилась как у настоящего танка, Origin я сделал в районе люка куда садиться танкист. Тогда она крутится как надо. Вокруг себя.
А с краем ствола всё понял. =) Тем более ты код привёл. Как я понял он именно об этом, не про полёт пули.
А полёт снаряда… Я уже сделал этот вектор где идёт слежка чтоб снаряд удалялся при вылете из игрового поля, удаляется всё как надо и когда надо. Тут именно вопрос чтоб он летел в нужном направлении.) Т.е расчитать dx и dy в зависимости от направления пушки.
У автора сайта всё это есть, но там фигурирует конечная точка которую он инициализирует нажатием мышки в любом месте игровой зоны…
Тогда я привёл метод поворота вектора. Учти что поворот производится вокруг вектора [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(Верхний левый угол поля зрения)
Ещё раз огромное спасибо!
Теперь смотря твои ответы и перечитывая буду знать как быть! Если что будет не получаться, отпишусь.) Пока мне надо всё обдумать и понять.
“И зачем ты делаешь лишний шаг с Image -> Texture?”
Понял, не буду. Я просто маску делаю на некоторые цвета, я думал иначе никак.
И по этой теме всё таки уточняющий вопрос – правильно модель держать на спрайте или на ректангле?
Потому что текстуру я могу загрузить и туда, и туда. Я заметил, что делая как тот западный ютубер в уроке (ректангл, без спрайта) – легче манипулировать всем этим.
Если делать привязку к globalRect тебе будет удобнее работать так как при рескайлинге/повороте изображения ты будешь получать прямоугольник описывающий всё изображение. И можно сразу работать с альфа каналом в редакторе изображений – не придётся мучатся с масками в коде (Я использую .Net Paint).
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.