Суббота, 20 Августа 2022, 05:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум игроделов » Ваши проекты » Разработка движков и сред разработки » 2D Sapphire (Мой двухмерный игровой движок)
2D Sapphire
warzesДата: Четверг, 22 Марта 2012, 04:40 | Сообщение # 21
участник
Сейчас нет на сайте
Вероятно IOS (если один человек согласится) И возможно от меня Android.

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

Добавлено (22.03.2012, 04:40)
---------------------------------------------
Quote (Tikara)
Хотелось бы поподробней узнать как это реализовано.

Есть возможность отказаться от штатного рендера и писать на чистом OpenGL используя движок как каркас.
Code

#include "SapphireCore.h"

Image *img;

// Задаем начальные настройки OpenGL
void InitOGL()
{
   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
   // Очистка экрана в черный цвет
   glClearDepth(1.0);  // Разрешить очистку буфера глубины
   glDepthFunc(GL_LESS);    // Тип теста глубины
   glEnable(GL_DEPTH_TEST);// разрешить тест глубины
   glShadeModel(GL_SMOOTH);// разрешить плавное цветовое сглаживание
   glMatrixMode(GL_PROJECTION);// Выбор матрицы проекции
   glLoadIdentity();  // Сброс матрицы проекции
   gluPerspective(45.0f,(GLfloat)640/(GLfloat)480,0.1f,100.0f);
   // Вычислить соотношение геометрических размеров для окна
   glMatrixMode(GL_MODELVIEW);// Выбор матрицы просмотра модели
}

bool Run()
{
   Gfx_Clear();    // чистим кадр

   glLoadIdentity();
   glEnable(GL_TEXTURE_2D);
   // Сброс просмотра
   glTranslatef(-1.5f,0.0f,-6.0f);    // Сдвинемся влево на 1.5 единицы и в экран на 6.0
     
   glBindTexture(GL_TEXTURE_2D, img->GetIdTex()); // подключаем текстуру
     
   glBegin(GL_QUADS);   

   // Передняя грань
   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Низ лево
   glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Низ право
   glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Верх право
   glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Верх лево

   // Задняя грань
   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Низ право
   glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Верх право
   glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Верх лево
   glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Низ лево

   // Верхняя грань
   glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Верх лево
   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Низ лево
   glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Низ право
   glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Верх право

   // Нижняя грань
   glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Верх право
   glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Верх лево
   glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Низ лево
   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Низ право

   // Правая грань
   glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Низ право
   glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Верх право
   glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Верх лево
   glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Низ лево

   // Левая грань
   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Низ лево
   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Низ право
   glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Верх право
   glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Верх лево

   glEnd();

   return true;
}

int main(int argc, char *argv[])
{
   SetGLInit(InitOGL); //отключаем настройки OpenGL от движка, вместо них используем свои

   if (InitEngine(640, 480, "Minimal") == false)
    return 1;

   img = new Image("data/dragon.png");
     
   RunEngine(Run);
     

   return 0;
}


Вот такой кубик выведет -

И ведь всего лишь написали одну функцию и вместо штатных средств рисования используем свои

Я вообщем-то пренебрегал такой фичей. Но в новой ветке собираюсь в том числе и ей уделить внимание.


Мой блог
Вики DirectX


Сообщение отредактировал warzes - Четверг, 22 Марта 2012, 04:42
AIДата: Четверг, 22 Марта 2012, 12:28 | Сообщение # 22
был не раз
Сейчас нет на сайте
Исходный код будет в открытом доступе? Если нет, будет ли версия рендера Direct3D?

Сообщение отредактировал AI - Четверг, 22 Марта 2012, 12:28
warzesДата: Четверг, 22 Марта 2012, 13:53 | Сообщение # 23
участник
Сейчас нет на сайте
Исходный код движкаи так в открытом доступе и до версии 1.0, так и будет. Потом скорее всего так и останется, а вот редактор игр который я начну делать с версии 1.0 - уже будет закрытым

Мой блог
Вики DirectX
AIДата: Четверг, 22 Марта 2012, 13:57 | Сообщение # 24
был не раз
Сейчас нет на сайте
А что на счет поддержки рендера Direct3D? Будит ли данная версия или останется OpenGl?
warzesДата: Четверг, 22 Марта 2012, 14:23 | Сообщение # 25
участник
Сейчас нет на сайте
Quote (AI)
А что на счет поддержки рендера Direct3D? Будит ли данная версия или останется OpenGl?

останется OpenGL, так как движок создается мультиплатформенным

Создаю фиче-лист для новой ветки:


Кому не сложно подкиньте десяток идей что должно быть в 2D движке


Мой блог
Вики DirectX
BASSДата: Четверг, 22 Марта 2012, 14:37 | Сообщение # 26
independent developer
Сейчас нет на сайте
А не поясните, как модификаторы для изображений собираетесь делать?

Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
warzesДата: Четверг, 22 Марта 2012, 14:46 | Сообщение # 27
участник
Сейчас нет на сайте
Quote (BASS)
А не поясните, как модификаторы для изображений собираетесь делать?

Я имел ввиду - движение, вращение, масштабирование. Там опечатка (не модификаторы а модификации)


Мой блог
Вики DirectX
BASSДата: Четверг, 22 Марта 2012, 14:54 | Сообщение # 28
independent developer
Сейчас нет на сайте
Я понял, что модификации, меня интересуют технические подробности - как именно это будет осуществлено.
Если не секрет, конечно.


Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
warzesДата: Четверг, 22 Марта 2012, 15:43 | Сообщение # 29
участник
Сейчас нет на сайте
Ну как, я даже не знаю как ответить. Изображение это квад, масштабирование, вращение и движение делаются средствами OpenGl к этому кваду - все стандартно

Мой блог
Вики DirectX
BASSДата: Четверг, 22 Марта 2012, 15:58 | Сообщение # 30
independent developer
Сейчас нет на сайте
Ага, понял. Просто мало ли, может Вы изобрели какой-нибудь свой алгоритм на этот счёт.

Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
НохчиДата: Четверг, 22 Марта 2012, 20:23 | Сообщение # 31
заслуженный участник
Сейчас нет на сайте
Товарищи, а там с системами частиц как?

Многие вопросы по Windows отпадут, если посмотреть тут
warzesДата: Понедельник, 07 Мая 2012, 09:22 | Сообщение # 32
участник
Сейчас нет на сайте
пока нет. Будет написан враппер http://astralax.ru/projects/particles/dev (для некомерческого бесплатно)
Кроме того сделаю можно набить хардкорно самому)

Добавлено (07.05.2012, 09:22)
---------------------------------------------
Quote (AI)
А что на счет поддержки рендера Direct3D? Будит ли данная версия или останется OpenGl?

Сегодня было принято важное решение:) Описывать пока не буду - все равно на словах сложно объяснить. Но я отвяжу движок от OpenGL. Пользователь при желании сможет использовать любой GAPI написав свою обертку на низким уровнем. В документации я покажу как написать обертку под DirectX. Это позволит сделать движок мультиплатформенным за счет пользователя (то есть пользователь просто переделывает несколько команд полиморфируя их и юзает нужные ему платформы) Сам я просто не смогу одновремено поддерживать несколько платформ, так что на мой згляд это единственное решение в результате которого пользователь сможет сам выбирать нужные платформы, и при этом ему не нужно будет ковыряться в коде движка, или что-то там переписывать.

Ну и сегодня стал изучать box2d. Вот простенький код (может кому интересно)
Code

#include "SapphireCore.h"
#include <Box2D\Box2D.h>

#define FPS 60
/*
библиотека box2d требует использования масштабирования, т.к. работает лишь с определённым диапазоном размеров
в нашем случае 1 единице длины box2 будет соотв. 50 пикселей
*/
#define BOX2D_SCALE 32
#define FORCE 1000

int main(int argc, char *argv[])
{
     EngineDescription desc;
     desc.caption = "Magnet Game";
     desc.fullscreen = false;
     desc.width = 640;
     desc.height = 480;
     desc.resize = false;
     desc.vsync = true;
     if (!InitEngine(desc))
      return 1;

     b2Vec2 gravity(0.0, 15.0f); // устанавливаем вектор гравитации, учитываем направление координат - положительное направление вниз
     bool sleep = true;

     b2World world(gravity); // создаём "мир" box2d

     // пол
     b2BodyDef ground_body_def; // определение тела
     ground_body_def.position.Set(10.0f, 15.0f); // положение центра (320:480)

     b2Body* ground_body = world.CreateBody(&ground_body_def); // создаём тело

     b2PolygonShape ground_box; // создаём бокс (прямоугольник :)) )
     ground_box.SetAsBox(10.0f, 0.5f);  // размеры бокса (x2 каждой стороны) - 20x1 м (640 на 32 в пиксельном выражении)
     ground_body->CreateFixture(&ground_box, 1.0f); // накладываем связь на ground_body. второй параметр - плотность.

     // левая граница
     b2BodyDef left_def;
     left_def.position.Set(0, 7.5f);

     b2Body* left_body = world.CreateBody(&left_def);
     b2PolygonShape left_box;
     left_box.SetAsBox(0.5f, 7.5f);
     left_body->CreateFixture(&left_box, 1.0f);

     // правая граница
     b2BodyDef right_def;
     right_def.position.Set(20.0f, 7.5f); // 20*32 = 640.

     b2Body* right_body = world.CreateBody(&right_def);
     b2PolygonShape right_box;
     right_box.SetAsBox(0.5f, 7.5f);
     right_body->CreateFixture(&right_box, 1.0f);

     // потолок
     b2BodyDef top_def;
     top_def.position.Set(10, 0);

     b2Body* top_body = world.CreateBody(&top_def);
     b2PolygonShape top_box;
     top_box.SetAsBox(10.0f, 0.5f);
     top_body->CreateFixture(&top_box, 1.0f);

     /// Динамическое тело
     b2BodyDef dynamic_body_def;
     dynamic_body_def.type = b2_dynamicBody; // ставим тип "динамическое", чтобы тело смогло отвечать на прилагаемые усилия
     dynamic_body_def.position.Set(5.0f, 1.0f);  // устанавливаем позицию от нуля: 5 метров по горизонтали, 1 метр по вертикали (1 метр ~ 32 пикселя)

     b2Body* dynamic_body = world.CreateBody(&dynamic_body_def);

     // форма
     b2PolygonShape dynamic_box;
     dynamic_box.SetAsBox(1.0f, 1.0f); // размеры бокса

     // связка
     b2FixtureDef fixture_def;
     fixture_def.shape = &dynamic_box; // назначение формы
     fixture_def.density = 1.0f;  // плотность
     fixture_def.restitution = 0.2f; // упругость. 1.0 - максимальное значение, тело является абсолютно упругим.
     fixture_def.friction = 0.3f; // коэфф. трения

     // соединение связкой
     dynamic_body->CreateFixture(&fixture_def);

     // параметры симуляции физики
     int32 velocity_iterations = 6;
     int32 position_iterations = 2;

     float32 time_step = 1.0f/60.0f;

     // вектор силы, прилагаемой к объекту
     b2Vec2 vec;
     vec.x = 0;
     vec.y = 0;

     // точка приложения силы
     b2Vec2 world_point;
     world_point.x = 0;
     world_point.y = 0;

         
     while (true)
     {
      Gfx_Clear();

      vec.x *= FORCE;
      vec.y *= FORCE;

      //      dynamic_body->ApplyForce(vec, world_point); // для создания эффекта вращения вокруг своей оси
      dynamic_body->ApplyForce(vec, dynamic_body->GetPosition());
      // обнуляем вектор силы, чтобы не провоцировать глюки
      vec.x = 0;
      vec.y = 0;

      world.Step(time_step, velocity_iterations, position_iterations); // совершаем шаг физической симуляции
      b2Vec2 position = dynamic_body->GetPosition(); // получаем позицию объекта
      float32 angle = -1 * 180/3.14 * dynamic_body->GetAngle(); // получаем угол

      DrawQuad(position.x * BOX2D_SCALE - 64/2,
       position.y * BOX2D_SCALE - 64/2,
       64,
       64,
       Color(WHITE),
       Alpha);

      if (KeyDown(KEY_UP))
       vec.y = -1.0;
      if (KeyDown(KEY_DOWN))
       vec.y = 1.0;
      if (KeyDown(KEY_LEFT))
       vec.x = -1.0;
      if (KeyDown(KEY_RIGHT))
       vec.x = 1.0;
          
      if (KeyUp(KEY_UP))
       vec.x = 0;
      if (KeyUp(KEY_DOWN))
       vec.x = 0;
      if (KeyUp(KEY_LEFT))
       vec.x = 0;
      if (KeyUp(KEY_RIGHT))
       vec.x = 0;

      if (!FrameEngine())
       break;
     }     

     QuitEngine();     
     return 0;
}

Основано на вот этом примере - http://technoid-labs.com/2012/simulatsya-fiziki-urok-box2d/

Просто падающий кубик. Но вроде все работает (а почему бы и нет, для разнообразия biggrin ).

В следующей версии движка возможно будет интеграция box2d (чтобы не писать эти непонятные строки кода happy )


Мой блог
Вики DirectX


Сообщение отредактировал warzes - Понедельник, 07 Мая 2012, 09:25
НохчиДата: Воскресенье, 13 Мая 2012, 15:52 | Сообщение # 33
заслуженный участник
Сейчас нет на сайте
Радует, что двиг процедурный. С частицами продвижения есть?

Многие вопросы по Windows отпадут, если посмотреть тут

Сообщение отредактировал Нохчи - Воскресенье, 13 Мая 2012, 21:36
warzesДата: Понедельник, 02 Июля 2012, 06:37 | Сообщение # 34
участник
Сейчас нет на сайте
пока даже не начинал, сейчас смотрю на совместимость с физикой (box2d), затем уже прикручу частицы

Добавлено (02.07.2012, 06:37)
---------------------------------------------
Так, в ветке 0.6 есть один баг - Font не работает так как надо (то есть тупо не вывоится). Баг древний (я о нем знаю более 6 месяцев) и судя по тому что никто об нем не написал я могу оценить "популярность" моего движка cool

Вообщем если кому надо - скину фикс на быструю руку... Перекладывать движок не буду, так как сейчас идет работа над 0.7, а там полностью движок с нуля переписывается, кроме того мне не нравится текущая реализация шрифта - слишком тормозная... Поэтому фиксить 0.6 не вижу смысла - скоро будет публичная 0.7 а там все по другому работает.

Кста, 0.7 будет считаться официально рабочей и вполне функциональной для создания игр. Также я ее внесу в базу движков.

И как обычно - жду идей и предложений по движку.

p.s. физика (box2d) нормально взаимодействует с движком (собственно а почему бы и нет). Частицы пока не прикручивал, буду думать в 0.8-0.9 версии. Также попробую с 0.8 поприкручивать GUI


Мой блог
Вики DirectX
DemeronДата: Понедельник, 02 Июля 2012, 12:07 | Сообщение # 35
User created in C++
Сейчас нет на сайте
Движок не "умер" часом? Как обрабатываются столкновения в движке? Или Box2D просто будет идти в комплекте и "лепите как хотите"? Насчет GUI - могу помочь, пиши в ЛС ( Что-то типо такого ).

Сообщение отредактировал Demeron - Понедельник, 02 Июля 2012, 12:08
НохчиДата: Понедельник, 02 Июля 2012, 12:12 | Сообщение # 36
заслуженный участник
Сейчас нет на сайте
Quote (warzes)
Так, в ветке 0.6 есть один баг - Font не работает так как надо (то есть тупо не вывоится).

Нарывался на него, после чего двигло тихо отправилось в корзину ))


Многие вопросы по Windows отпадут, если посмотреть тут
warzesДата: Понедельник, 02 Июля 2012, 18:48 | Сообщение # 37
участник
Сейчас нет на сайте
Quote (Demeron)
Движок не "умер" часом?

нет. идет работа над 0.7

Quote (Demeron)
ак обрабатываются столкновения в движке? Или Box2D просто будет идти в комплекте и "лепите как хотите"?

пока так. потом будет встроено в движок

Quote (Demeron)
Насчет GUI

будет использоваться готовое (MyGUI к примеру)

Quote (Нохчи)
Нарывался на него, после чего двигло тихо отправилось в корзину ))

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


Мой блог
Вики DirectX
НохчиДата: Понедельник, 02 Июля 2012, 19:31 | Сообщение # 38
заслуженный участник
Сейчас нет на сайте
В то время как раз выбирал между GEGE, HGE и Sapphire, и подумал, ну... не работает.. ну и черт с ним, пойду остальные тестить.
Я все так же жду системы частиц. Имхо, это намного важнее чем бокс2д и автору стоило бы обратить на это внимания.


Многие вопросы по Windows отпадут, если посмотреть тут
warzesДата: Вторник, 03 Июля 2012, 04:27 | Сообщение # 39
участник
Сейчас нет на сайте
Quote (Нохчи)
Я все так же жду системы частиц. Имхо, это намного важнее чем бокс2д и автору стоило бы обратить на это внимания.

тогда подумаю.


Мой блог
Вики DirectX
НохчиДата: Понедельник, 10 Сентября 2012, 16:44 | Сообщение # 40
заслуженный участник
Сейчас нет на сайте
Двиг обновляется?

Многие вопросы по Windows отпадут, если посмотреть тут
Форум игроделов » Ваши проекты » Разработка движков и сред разработки » 2D Sapphire (Мой двухмерный игровой движок)
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг