Как стать автором
Обновить

Комментарии 37

Интересно.


Добавьте пожалуйста GitHub релиз с бинарником.

Релиз добавил. GitHub'ом пользуюсь всего неделю, по этому что такое «бинарник» не знаю. Если объясните что это такое, постараюсь обязательно добавить.

К релизу часто добавляют бинарный (исполняемый) файл — скомпилированную программу. В данном случае это exe и dll которые выдаёт Visual Studio.

Все прикрепил, вот ссылка на релиз.
Это называется процедурная графика. Ещё немного, и получится kkrieger.
Попробуйте поиграться с реймаршингом на шейдертое, думаю вам очень понравится
Для генерации текстур и объектов также можно использовать клеточные автоматы.
Достаточно интересная идея, возможно в будущем реализую её.
Простите за наивный вопрос. Во втором абзаце читаю: «а пули похожи на два симметричных графика корня из 2.» А как он выглядит, график корня из 2?
как он выглядит, график корня из 2

По идее, как горизонтальная прямая. Ну или две.

Упс… Помилуйте, сударь, а вторая-то откуда?
А, понял, кажись — это которая «симметричная».
Все равно — на пулю как-то не очень.
Вообще-то, все это для автора статьи пишется, чтобы поправил. Ау?
Симметричная, ага. Квадрат отрицательного аргумента тоже квадрат…
А где в выражении y = sqrt(2) отрицательный аргумент?
В строгом смысле sqrt(2)=±1.4142… Потому что (-1.4142...)²=2. Отсюда «Ну или две».
Спасибо что указали на мою ошибку. Я имел ввиду график квадратного корня из x.
Помню советскую книгу. Там был пример из нескольких уравнений. Если по всем ним построить графики, получалась улыбающаяся рожа.
НЛО прилетело и опубликовало эту надпись здесь
Достаточно интересная идея, но проблема в том, что FPS на планете и так не достаточно высокий из-за фрактальных деревьев. Также, для NPC нужны будут анимации, которые, боюсь, не смогу выразить через графики различных формул. Спасибо за идею, задумаюсь над её реализацией.
Попробуйте алгоритмы кеширования использовать. По сути все объекты, которые у вас рисуются по формулам можно сделать одним и тем же классом. Формулу задавать в виде функции обратного вызова (указатель на функцию или сигнал). Отрисовку делать в отдельную карту пикселей, которую затем и рисовать при перемещении.

Поначалу карту пикселей можно генерировать при первой отрисовке объекта. Будут фризы, но потом это обходится.

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

Так Вы сможете значительно увеличить FPS, загрузив все ядра процессора. А потом можно уже экспериментировать и с GPU.

Спасибо большое за советы! Постараюсь пояснить, какие возникают сложности с SFML.


У меня была следующая идея по оптимизации игры: я заметил что низкий FPS вызван отрисовкой фрактальных деревьев, так как отрисовать ~20-30 веток разных размеров и толщины не простая задача. Я настроил генерацию деревьев так, чтобы в кадре помещалось максимум 3 дерева(при таком количестве был достаточно стабильный FPS). Но вот какая идея мне пришла в голову: что если просто каждому дереву выдать свой спрайт, текстура для которого будет генерироваться при создании дерева? В таком случае, просадка FPS была бы только при генерации планеты. Но когда я решил реализовать это, я столкнулся с проблемой SFML: чтобы сгенерировать текстуру, я использовал RenderTexture. Если функцию, в которой объявляется RenderTexture вызывать из функции main, все отлично работает. Но если же вызывать непосредственно из конструктора класса выскакивает исключение. Я пытался бороться с ним, но увы, решения не нашел. Я пошел другим путем: я создал массив текстур, который хранил текстуры всех деревьев. Но опять же, SFML меня и тут удивил: при попытке загрузить текстуру из массива, загружалась абсолютно пустая текстура. Из-за вот таких проблем, FPS в игре достаточно низкий, а например текстур планет в космосе всего 12(опять же, генерация текстур при входе в сектор не может быть произведена, выскакивает исключение).


Из-за таких неудобных моментов я и подумываю перенести проект на какой-нибудь движок.


В c++ с потоками я не работал, но например на java я реализовывал потоки. Раньше, когда я создавал игры на Яве, мне нужны были 2-3 потока. Чаще всего первый отвечал за логику, второй за отрисовку, а третий за музыку. При создании же данной игры я хотел создать отдельный поток для отрисовки деревьев, но решил оставить это на потом.


Ещё раз спасибо большое за Ваши советы, обязательно посмотрю видеоуроки про на c++.

Спрайт и есть пиксельная карта, только встроенная в SFML, так что идея верная.

Под спрайтом понимается sf::Sprite? Можете кусок кода, выкидывающий исключение сюда скинуть. Я сейчас спешу, как буду свободен, посмотрю, может смогу помочь.
Данный вопрос я задал на stackoverflow, но ответа не дождался. Если вы мне поможете я буду несказанно благодарен.

P.S. Там вы найдете и пример кода в котором выскакивает исключение, и скриншот с самим исключением.
Версия SFML какая? В таких вопросах всегда требуется указывать версию, если задаёте вопрос, т. к. ошибки в популярных фреймворках бывают, исправляется обычно в новых версиях.
Версия 2.4.2
У меня в репозиториях версия 2.1, на ней креш не воспроизводится. Предполагаю, что дело в версии. Попробуйте обновиться до 2.5.0 или откатиться до 2.1. Так можно проверить, в версии ли дело.

Ещё у Вас пример неполный. Всегда давайте людям готовый протестированный пример, который можно просто запустить, иначе можно предположить, что причина ошибки сегментирования в той части, которая была опущена. Полный пример должен был быть таким:
#include <SFML/Graphics.hpp>

using namespace sf;

class A {
public:
  A() {
    rend();
  }

  void rend() {
    RenderTexture r; // исключение возникает в этом месте
  }
};

int main() {
  A a = A();
  return 0;
}


Для облегчения задачи тестирования желательно ещё указывать команды для компиляции, например, в моём случае:
g++ test.cpp -fsanitize=address `pkg-config --libs sfml-all` && ./a.out && echo Ok


Ещё можете провести тест в виртуальной машине с Ubuntu/Debian, если есть сложность в установке библиотек под Windows. Команды для установки:
sudo apt-get update &&
sudo apt-get install -y libsfml-dev build-essential
Спасибо Вам за помощь!

Я обновил Visual Studio, после обновил SFML до версии 2.5.0. Насколько я понял, проблема была не в версии SFML, а в настройке его. Я допустил несколько ошибок при установке SFML, но теперь все нормально и исключение больше не выскакивает.

Еще раз спасибо Вам за советы!
Пожалуйста. Сразу ещё совет дам, как будущему разработчику. Никакая серьёзная разработка не может проводиться без модульных тестов. Вот и повод написать первый тест, пример выше прекрасно подходит. В качестве фреймворка можно использовать Google Test. В тесте указать комментарий о возможной причине провала теста с пояснениями к исправлению.

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

И ещё момент, в документации сказано, что после вызова конструктора RenderTexture объект становится невалидным, пока не будет вызван метод create. Не может быть ошибка в том, что забыли этот метод вызвать?


Пока это всё, чем могу помочь.

Метод create вызывался сразу после объявления RenderTexture, но так как исключение выскакивало именно на строке объявления RenderTexture, в вопрос его не писал.
НЛО прилетело и опубликовало эту надпись здесь
Я подумывал реализовать все немного по-другому. С помощью графиков функций построить отдельные части тела(голову, ноги, туловище) и потом, с помощью поворота и передвижения данных текстур создать иллюзию передвижения NPC.
Показалось, что подобные игры как артхаусное кино — интересны прежде всего автору, а не зрителю. Т.е. процесс написания такой игры удовольствия приносит куда больше, чем собственно игра.
Это очень хороший способ научиться программировать, т. к. сильно затягивает. Сам начинал с формул и графики, только это ещё под ДОСом было. А эта статья с объяснениями может мотивировать других людей, поэтому, да, тут суть в процессе, а не в игре.
… я учусь в школе и только недавно узнал о том, что такое синусоида и как она выглядит...

Не останавливайтесь! Вы на верном пути. Желаю творческих успехов, но не забывайте успевать по остальным дисциплинам.
Спасибо!
Узнать о фрактале и о программировании раньше, чем о синусоиде. Да и литературный язык у вас совсем как у взрослого, и это в том возрасте, в котором впервые узнают о синусоиде. Двадцать первый век как он есть.
Раньше, когда я создавал игры на Яве, мне нужны были 2-3 потока…
Сначала создавал многопоточные игры на Яве, а потом в школе узнал о синусах ))) Не ну всякое бывает, я вот тоже позавчера холодный ядерный синтез домашнего изготовления успешно протестировал!
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории