makish

Созданные ответы форума

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Автор
    Сообщения
  • в ответ на: Отображение окна #4956

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    1. Окно не реагирует ни на что т.к. в функции main нет обработчика Event’ов (или есть, но находится он после функции menu())

    2. Создавать для каждого игрового состояния(меню, настройки, игра и т.д.) собственную функцию с циклом while внутри неправильно, дальше это может привести к большим проблемам. Цикл while желательно иметь один на всю игру.

    Для этого лучше использовать паттерн State(состояние). Можешь загуглить полную его реализацию, я лишь вкратце опишу как он работает.

    Для начала нужно создать класс Game для всей игры:

    Далее нужно создать базовый класс для состояний:

    Теперь для каждого состояния игры можно делать свой класс. Покажу на примере меню:

    И так для каждого состояния игры.

    После этого функция main будет выглядеть следующим образом:

     

    в ответ на: Текст #4943
    +1

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Возможно, игра подтормаживает из-за того, что для каждого экземпляра “текста” выделяется его личный шрифт. В конструкторе класса текста ты предаешь шрифт как аргумент по значению, соответственно хранишь в каждом тексте копию шрифта. Так делать не обязательно, достаточно передать его по ссылке.

     

    в ответ на: Итераторы #4940
    +1

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Ну начнем с того, что возможно ты делаешь что-то неправильно, если тебе нужен текст в отдельном списке. Ведь твоя задача так и звучит: “Нужно чтобы у каждого врага был свой текст со своим здоровьем”, а как минимум это уже значит, что текст должен быть в классе врага.
    Но если вдруг возникла такая необходимость, то можно попробовать следующие варианты:

    1. Вместо std::list использовать std::deque. В нем можно получать доступ к элементам по их номеру, а значит можно сделать так:

      Но нужно знать, что в этом массиве доступ к элементу по оператору [i] происходит долго, а значит при большом количестве врагов и текста игра начнет тормозить.

    2. Использовать контейнер ключ-значение, в твоем случае подойдет std::unordered_map<Entity*, Up*>. Но циклы по этому контейнеру также очень медленные.
    3. Хранить в каждом объекте текста указатель на его врага(или наоборот). Например:

      тогда можно будет создать простой цикл:

      Такой вариант на производительность никак не повлияет, но мало чем отличается от простого хранения текста в классе врага. И нужно подумать как присвоить тексту его врага при создании.

    в ответ на: Вертикальные белые полосы #4696

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Дело в том, что на каждом кадре игры ты в цикле заново присваиваешь единственному(!) спрайту TextureRect, после чего сразу же его отрисовываешь. Гораздо правильнее было бы создать массив этих спрайтов, присвоить им TextureRect’ы и позицию до главного цикла while, а во время выполнения приложения просто отрисовывать каждый спрайт по очереди.


    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Одинаковые переменные. Компилятор не может решить, каким из них присваивать значения.

    в ответ на: sf::Thread в цикле #4485

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    А что именно ты хочешь сделать, какой должен быть результат? Потоки работают так, как должны: запускаются, выполняются, завершаются. Одновременно, лично у меня, запускается максимум 5 потоков, больше просто не успевает запуститься. А тормозит по большей части из-за Visual Studio во время отладки, т.к. она не успевает сообщать обо всех завершенных потоках. Если запустить приложение через .exe, тормозов не будет.

    в ответ на: Поток sf::Thread #4456

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Попробуй перед удалением переменных, или прямо в деструкторе выполнить следующие команды:

     

     

    в ответ на: Направление полёта снаряда #4443

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Не уверен, что понял поставленную задачу, но предположу, что Вам нужно найти направление полета снаряда по углу поворота башни танка. Вообще решение у этой задачи довольно простое, если вспомнить тригонометрию и линейную алгебру. Рекомендую данную статью:

    Линейная алгебра для разработчиков игр

    в ответ на: Вершина RectangleShape #4442
    +2

    makish
    Участник
    Сообщений:14

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

    Репутация:6

     


    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Если речь идет о чем-то наподобие интерфейса, который всегда привязан к окну, то можно сделать следующим образом:

     

    в ответ на: Как оптимизировать сохранение #4145

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Вообще, нет ничего плохого в том, чтобы записывать в файл сохранения все динамические объекты. Только вот в XML это вряд ли получится сделать. Записывать все придется в бинарный файл, т.к. в него можно записать не только конкретные переменные объекта, но и вообще сам объект таким, какой он есть на данный момент. Ну или группу объектов:)

    Для этого придется изучить работу с бинарными файлами в C++, а это к SFML уже не относится:)

    в ответ на: Рисование линий #4143
    +1

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Здесь полный туториал о том, как можно рисовать различные линии и фигуры (на английском).
    Для конкретно твоего случая подойдет следующий код:

     

    в ответ на: Отпускание клавиши #3793

    makish
    Участник
    Сообщений:14

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

    Репутация:6

     

    в ответ на: Время игры #3101

    makish
    Участник
    Сообщений:14

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

    Репутация:6

    Переменная time (получающая время из clock) хранит в себе количество времени, проходящего между тактами процессора. Далее в цикле программы на это число умножаются все переменные, которые так или иначе зависят от прошедшего времени (dx, dy и т.д.). И как результат – одинаковая скорость работы программы как на мощных, так и на слабых компьютерах.
    Если же присвоить time конкретное константное число, то на него также будут умножаться эти переменные, с той разницей, что на мощных процессорах это будет происходить в разы чаще, чем на слабых.

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