Некоторые вопросы при создании игры.

SFML и C++ Уроки \ Разработка игр Форумы Логика игр Некоторые вопросы при создании игры.

В этой теме 6 ответов, 2 участника, последнее обновление  KindRedSand 3 мес. назад.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)
  • Автор
    Сообщения
  • #4839

    Masai
    Участник
    Сообщений:2

    Зарегистрирован:
    15.07.2017

    Репутация:0

    Всем привет. У меня не один вопрос, а 4-5, поэтому я не уточнял в заглавие о чём речь.

    Решил вот сделать плоскую 2д стрелялку танковую. Сам я новичок.

     

    Танк я делаю созданием двух составных частей (спрайтов): корпуса и башню цепляю по координатам в зависимость от корпуса.

    Башню могу поворачивать – setRotation(angle). Уже сделал класс снаряда, при нажатие на кнопку огонь создаётся снаряд, он поворачивается под углом под которым находится и башня. Тут всё гладко.

     

    А проблемы во-первых смотря в будущее – с масштабом. В будущем я хочу сделать танковые бои между танковыми группами (10 на 10 например). Следовательно надо будет уменьшать масштаб всего этого дела чтоб всё умещалось (не динамически, а просто одноразово, когда придёт необходимость, не в процессе игры). И вот тут я плаваю… Сейчас ли сразу в паинте уменьшить изначальные текстуры, или как-то гибко в процессе игры их менять? Дело в том, что setScale, как я понял, создаёт иллюзию визуальную, но не уменьшает реально объекты. Это может сыграть злую шутку.

    Не подсказали бы как тут лучше поступить?

     

    Второй момент связан с тем чтобы вычислить ту позицию – точку откуда должен вылетать снаряд (край ствола). При поворотах башни опять же, как я понял, фактическое положение прямоугольника, описывающего положение спрайта башни, остаётся первоначальным.

     

    Третий момент связан с направлением полёта снаряда. У автора сайта есть уроки которые немного об этом. Но там вроде как есть такая переменная как КОНЕЧНАЯ точка пути. А в моём случае танк бабахнет в каком-то направление и всё, без конечной конкретной точки.

     

    Очень был бы признателен за советы доступные для новичка.

     

    П.С Пункт 1 меня так волнует как раз из-за других пунктов.

    Вложения:
    You must be logged in to view attached files.
    #4841
    +1

    KindRedSand
    Участник
    Сообщений:71

    Зарегистрирован:
    05.04.2017

    Репутация:28

    Массштаб: а вы смотрели в класс View? Там же есть такие нужные тебе методы setSize и zoom(Насчёт последнего: он просто делает рескайлнг относительно текущего Size и похоже не сохраняет своих результатов)

    С краем ствола всё легко: Для начала делаем вектор длинной половины спрайта пушки и поворрачиваем его на угол поворота ствола. Позже берём вектор находящийся по центру спрайта пушки и прибавляем к нему первый – задача выполнена

    Ну и полёт снаряда: просто сделай некую переменную в классе пули которая будет вычитатся каждый игровой тик и при достижении условия var <= 0 пуля будет удалена из массива.

    #4842
    +1

    KindRedSand
    Участник
    Сообщений:71

    Зарегистрирован:
    05.04.2017

    Репутация:28

    Хм, хотя с краем ствола всё же тебе нужно смотреть как ты вращаешь спрайт, где у него Origin Point и как у тебя вобще выполнен спрайт(Я думал что у тебя и танк и пушка размером 1×1 блок. В твоём случае это может не сработать в том виде в котором я описал но думаю ты понял суть).
    Просто смотри расстояние от Origin Point до края ствола в исходном положении и когда повернёшь единичный вектор (длинна которого всегда == 1) просто умнож его на эту длинну. Как исходный единичный вектор принимай Vector2f(1, 0) (Поворот 0 deg == 0 rad)

    #4844

    Masai
    Участник
    Сообщений:2

    Зарегистрирован:
    15.07.2017

    Репутация:0

    Спасибо за ответы!

    Посмотрю класс View. И правда глупо, что я про него не подумал.

    “как у тебя вобще выполнен спрайт(Я думал что у тебя и танк и пушка размером 1×1 блок” – тут правда пока не понимаю про блоки.

    Я как делал: просто в паинте рисовал эти текстуры и в программе в Image их грузил, Image в Текстуру, а текстуру в Спрайт. И всё.

    Но сейчас смотрел видео в Ютубе, там человек создал Ректангл Body и в него сделал setTexture.

    И я запутался как правильней(!).

    Надеюсь, View мне поможет, так как когда я озадачился тем что бы уменьшить модельки, я полез в Паинт и там менял размеры изображения. Это неправильно. Плюс в программе всё равно небольшая подгонка была Башни под Корпус. Грубо говоря чтоб Башня встала ровненько на Корпус я башне дал координату Корпуса Х и прибавил 20 пикселей и по У прибавил пикселей 30 чтоб всё встало ровно. Но при изменение размера моделек эти цифры 20 и 30 неактуальны и приходится заново примерять.

    А Origin у меня и правда не там где он по дефолту, чтоб башня крутилась как у настоящего танка, Origin я сделал в районе люка куда садиться танкист. Тогда она крутится как надо. Вокруг себя.

    А с краем ствола всё понял. =) Тем более ты код привёл. Как я понял он именно об этом, не про полёт пули.

    А полёт снаряда… Я уже сделал этот вектор где идёт слежка чтоб снаряд удалялся при вылете из игрового поля, удаляется всё как надо и когда надо. Тут именно вопрос чтоб он летел в нужном направлении.) Т.е расчитать dx и dy в зависимости от направления пушки.

    У автора сайта всё это есть, но там фигурирует конечная точка которую он инициализирует нажатием мышки в любом месте игровой зоны…

    #4845
    +1

    KindRedSand
    Участник
    Сообщений:71

    Зарегистрирован:
    05.04.2017

    Репутация:28

    Тогда я привёл метод поворота вектора. Учти что поворот производится вокруг вектора [0, 0] так что не забудь вычесть из вращаемого вектора точку вращения.
    Про блоки: я имел в виду что текстукри одинаковых размеров и имеют Origin Point по середине этого “кубика”.
    То что ты изменяешь текстурку для подгона – плохая затея. Делай подгон позиции башни под танк (Всё тот же приведённый мною метод в помощь – вращение даст тебе круг. Ну а где центр этого круга надеюсь рассказывать не нужно)
    И зачем ты делаешь лишний шаг с Image -> Texture? Ты собираешься прямо в игре как либо перерисовывать пиксели на текстурке? Если нет то используцй сразу Texture минуя Image (Учитывая что мы работаем с C++ память лишней не будет).
    Ну и в чём проблема с нужным направлением? На сайте был же уже тутор как заставить картинку поворачиваться в сторону курсора и перемещатся при зажатии кнопки. Метод который даст тебе возможность получить угол между двумя векторами. Если нужно получить угол относительно системы кординат то в качестве первого аргумента передай Vector2f(1, 0)

    Ну и можешь из этого получить угол поворота башни и снаряда передав в первом аргументе центр башни и второго – позицию мыши с применённым оффсетом View(Верхний левый угол поля зрения)

    #4846

    Masai
    Участник
    Сообщений:2

    Зарегистрирован:
    15.07.2017

    Репутация:0

    Ещё раз огромное спасибо!

    Теперь смотря твои ответы и перечитывая буду знать как быть! Если что будет не получаться, отпишусь.) Пока мне надо всё обдумать и понять.

    “И зачем ты делаешь лишний шаг с Image -> Texture?”

    Понял, не буду. Я просто маску делаю на некоторые цвета, я думал иначе никак.

    И по этой теме всё таки уточняющий вопрос – правильно модель держать на спрайте или на ректангле?

    Потому что текстуру я могу загрузить и туда, и туда. Я заметил, что делая как тот западный ютубер в уроке (ректангл, без спрайта) – легче манипулировать всем этим.

     

    #4847
    +1

    KindRedSand
    Участник
    Сообщений:71

    Зарегистрирован:
    05.04.2017

    Репутация:28

    Если делать привязку к globalRect тебе будет удобнее работать так как при рескайлинге/повороте изображения ты будешь получать прямоугольник описывающий всё изображение. И можно сразу работать с альфа каналом в редакторе изображений – не придётся мучатся с масками в коде (Я использую .Net Paint).

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)

Для ответа в этой теме необходимо авторизоваться.