Разработка и ромхакинг > Ромхакинг и программирование
SGDK
<< < (26/40) > >>
Sharpnull:
ALKOSHA, немного дилетантских мыслей.
Здесь уже обсуждалось, если нужно 256x256 тайлов (2048x2048 пикселей), rescomp должен съесть как Image. После в начале уровня (этой карты) из Image подгружается TileSet, палитры. Когда персонаж движется, на границы 1-2 тайлов подгружается полоска карты впереди через VDP_setMapEx() и подобные. Я не знаю какое ограничение на размер Image, если используется сжатие, то всё упрётся в RAM, и кроме того будет медленный скроллинг.

Если хотите только уникальные тайлы на всю игру, то чтобы использовать сжатие для тайлов, можно загрузить их как TileSet. Карту придётся сгенерировать, как Map и использовать VDP_setMapEx() или как обычный массив u16 с VDP_setTileMapDataRectEx(). Эти функции позволят подгружать вертикальные полоски без лишних циклов. Отдельно придётся позаботиться о палитре.

Генерацию карты можно сделать из Tiled (там вроде свой формат есть). На каждый уровень (где, допустим, 256x256 тайлов) будет свой Map или массив u16. Сложность с TileSet: VDP_loadTileSet() подгружает все тайлы, а чтобы выбрать некоторые со сжатием, придётся самому распаковывать и подгружать через VDP_loadTileData(). По карте невозможно узнать какие тайлы нужны. Значит придётся хранить для каждого уровня данные об используемых TileSet'ах (будут трудности, если используется сжатие, если нет, то можно хранить один TileSet на все уровни). Фактически, для каждого используемого тайла на уровне нужен индекс в VRAM, который находится в карте (Map, u16), и где его брать. Например:

--- Код: ---struct TileZ {
    u16 indexTileSet; // Индекс/смещение из TileSet
    u16 tileSetID;    // Какой TileSet
};
TileZ level1[] = { {1, 0}, {3, 0} };
--- Конец кода ---
Будем считать индекс в VRAM индексом массива level1, тогда идём по массиву и подгружаем подряд в VRAM (начиная с какой-нибудь позиции, TILE_USERINDEX например). indexTileSet нужно умножать на 32 в байтах или 8 если по u32.

Если вы будете изменять карту, прежде чем загружать, это придётся делать во время скроллинга, что создаст доп. нагрузку. Это и не должно потребоваться, если сразу сгенерировать карту правильно.

Конечно, чтобы уровни были красочными, нужно умело жонглировать палитрами в разных областях.
Segaman, не знал, что спецификация от SMD есть на русском, забавно.
Yoti:

--- Цитата: ALKOSHA от 16 Апрель 2019, 21:07:00 ---А следовательно разрешаю вести свободное общение на любые темы
--- Конец цитаты ---
Кто на аве? :lol:
worm:
Чет гуано плюсы...

--- Код: ---#include <iostream>
using namespace std;

int main()
{
    cout << "Hello, World!";
    return 0;
}
--- Конец кода ---

--- Код: ---__cxx_global_var_init:                  # @__cxx_global_var_init
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        movabs  rdi, offset std::__ioinit
        call    std::ios_base::Init::Init() [complete object constructor]
        movabs  rdi, offset std::ios_base::Init::~Init() [complete object destructor]
        movabs  rsi, offset std::__ioinit
        movabs  rdx, offset __dso_handle
        call    __cxa_atexit
        mov     dword ptr [rbp - 4], eax # 4-byte Spill
        add     rsp, 16
        pop     rbp
        ret
main:                                   # @main
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     dword ptr [rbp - 4], 0
        movabs  rdi, offset std::cout
        movabs  rsi, offset .L.str
        call    std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
        xor     ecx, ecx
        mov     qword ptr [rbp - 16], rax # 8-byte Spill
        mov     eax, ecx
        add     rsp, 16
        pop     rbp
        ret
_GLOBAL__sub_I_example.cpp:             # @_GLOBAL__sub_I_example.cpp
        push    rbp
        mov     rbp, rsp
        call    __cxx_global_var_init
        pop     rbp
        ret
.L.str:
        .asciz  "Hello, World!"
--- Конец кода ---


--- Код: ---#include <stdio.h>
int main()
{
   printf("Hello, World!");
   return 0;
}
--- Конец кода ---

--- Код: ---main:                                   # @main
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     dword ptr [rbp - 4], 0
        movabs  rdi, offset .L.str
        mov     al, 0
        call    printf
        xor     ecx, ecx
        mov     dword ptr [rbp - 8], eax # 4-byte Spill
        mov     eax, ecx
        add     rsp, 16
        pop     rbp
        ret
.L.str:
        .asciz  "Hello, World!"
--- Конец кода ---


--- Код: ---#include <stdio.h>
int main()
{
   printf("Hello, World!");
   return 0;
}
--- Конец кода ---

--- Код: ---.LC0:
        .string "Hello, World!"
main:
        push    rbp
        mov     rbp, rsp
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, 0
        pop     rbp
        ret
--- Конец кода ---

Либо С не включает в код нужную для вывода библиотеку, либо я дурак, либо плюсы кал. Не надо их в сгдк :lol:
вангую, сейчас мегавольт вылезет, чтобы вставить свои 3 копейки xD
Skay:
Да.. тест супер. взять рандомно бездумно сделать что то. А потом говорить плюсы кал  <_<

--- Цитата: worm от 20 Апрель 2019, 13:13:54 ---Либо С не включает в код нужную для вывода библиотеку
--- Конец цитаты ---
серьезно? разнциы не видишь в том что написал? ну удачи. дальше продолжай сравнивать библиотеки  :lol: про "C++ C-style" вообще молчу
Sharpnull:
worm, странно, у меня https://godbolt.org/ выдаёт одинаковый код примера printf("Hello, World!"); для C и C++.
Segaman:
worm, юзая стандартные библиотеки ты всегда будешь что-то среднее получать.
мне вот пришлось даже оператор new с delete определять вручную, так как на сежке нет стандартов С++
что несомненно я считаю огромным плюсом (хорошая игра слов  :) )

кстати столкнулся с проблемой. код вида:

--- Код: ---const ObjectName * const objList [] = {
  &object1,
  &object2
};
--- Конец кода ---
почему-то вопреки всему хранит список указателей на обьекты в ПЗУ, которые указывают в ОЗУ, где они указывают в ПЗУ.

--- Код: ---ROM 00000DF0: 0x00FF0004,0x00FF0008
RAM 00FF0004: 0x00000E1C, 0x00000E20
--- Конец кода ---
т.е. всё что заключено в скобки попадает в ОЗУ.
может кто-то знает, как отправить содержимое скобок (так как оно константно! вон я кconst два раза даже указал) в ПЗУ? :)

Добавлено позже:
в ообщем классы с виртальными методами, как ни крути, а константными и хранящимися в роме сделать никак не выходит.
переделал в структуры с указателями на функции, отказавшись тем самым от прелестей С++  :-\
worm:

--- Цитата: Skay от 20 Апрель 2019, 23:36:07 ---серьезно? разнциы не видишь в том что написал? ну удачи.
--- Конец цитаты ---
Начинать надо было с "дальше продолжай сравнивать библиотеки" - аргумент. Но когда полыхает, аргументы - не главное, правда?) К тому же, я написал о своем предположении, что дело в библиотеке.


--- Цитата: Skay от 20 Апрель 2019, 23:36:07 ---про "C++ C-style" вообще молчу

--- Конец цитаты ---
когда в районе ниже поясницы повышена температура, придирайся к словам - ведь для некоторых это единственная возможность почувствовать себя умным перед собеседником)
Лайфхак: 1) отсеиваешь все признаки прожженного стула, оставляешь только аргументы 2) профит - собеседник чувствует себя идиотом. (иначе просто наоборот получается)


--- Цитата: Sharpnull от 21 Апрель 2019, 00:42:42 ---странно, у меня https://godbolt.org/ выдаёт одинаковый код примера printf("Hello, World!"); для C и C++
--- Конец цитаты ---
Действительно, проверил - без инклудов код одинаковый. написал тестовую программку со сложением и массивом, 0 отличий :neznayu:


--- Цитата: Segaman от 21 Апрель 2019, 12:47:18 ---юзая стандартные библиотеки ты всегда будешь что-то среднее получать
--- Конец цитаты ---
Ну пока у меня рука не набита свои писать - приходится использовать что есть)


--- Цитата: Segaman от 21 Апрель 2019, 12:47:18 ---в ообщем классы с виртальными методами, как ни крути, а константными и хранящимися в роме сделать никак не выходит.
переделал в структуры с указателями на функции, отказавшись тем самым от прелестей С++
--- Конец цитаты ---
Ну Стеф не зря именно С выбрал - я, может, и невежда в этом плане, но он-то знает что делает... Более того, возможно вся оптимизация связана как раз с более новой версией GCC - ты не проверял?
Sharpnull:

--- Цитата: Segaman от 21 Апрель 2019, 12:47:18 ---в ообщем классы с виртальными методами, как ни крути, а константными и хранящимися в роме сделать никак не выходит.
--- Конец цитаты ---
Может потому что это не POD и объекты всё равно придётся создавать во время выполнения, вызывать конструктор.
Skay:
worm, как удобно всех кто фейспалмит от твоих действия обвинять в полыхании  :lol: но ты же выучил новое слово и по другому не умеешь, во всех темах где тебя тыкают носом в лужу, ты обвиняешь что у других полыхает  :lol:

--- Цитата: Sharpnull от 21 Апрель 2019, 00:42:42 ---printf("Hello, World!"); для C и C++.
--- Конец цитаты ---
так с чего им отличаться если printf это функция из сишной библиотеки.
Плюсы плюсов не только в библиотеках, но ив новых возможностях, а сравнивать как будет отличаться код при печати строки, рисовании вектора и тд - глупо же. ну ей богу %)
megavolt85:

--- Цитата: worm от 22 Апрель 2019, 06:29:42 ---Более того, возможно вся оптимизация связана как раз с более новой версией GCC
--- Конец цитаты ---

неужели хоть одна умная мысль пытается пробиться в твою голову. отмотай на страницу назад и перечитай ещё разок пост MetalliC'a, он тебе это неделю назад ещё сказал
новые копиляторы для старых процов помимо оптимизации приносят новые глюки, так что я бы 10 раз подумал использовать новые компиляторы или не стоит
MetalliC:

--- Цитата: worm от 20 Апрель 2019, 13:13:54 ---Чет гуано плюсы...
--- Конец цитаты ---
ты случайно не забыл в графе Compiler Options прописать -O2 ? то есть включить оптимизацию, иначе по-умолчанию генерируется "отладочный" код с кучей всякого говнища.

когда я говорил о "С++ подходе" имелось в виду активное использование STL.
к примеру возьмем банальную задачу - сделать функцию суммирующую массив чисел. на С++ это будет выглядеть примерно так:

--- Код: ---#include <vector>
#include <numeric>
int test(std::vector<int> v)
{
    return std::accumulate(v.begin(), v.end(), 0);
}
--- Конец кода ---

и не смотря на использование вектора, темплейтов, итераторов, и прочих страшных слов это компилируется (с -O2) в компактный и эффективный код:

--- Код: ---test(std::vector<int, std::allocator<int> >):
        mov     rcx, QWORD PTR [rdi+8]
        mov     rdx, QWORD PTR [rdi]
        xor     eax, eax
        cmp     rdx, rcx
        je      .L4
.L3:
        add     eax, DWORD PTR [rdx]
        add     rdx, 4
        cmp     rcx, rdx
        jne     .L3
        ret
.L4:
        ret
--- Конец кода ---

короче аж никак не хуже того, во что скомпилируется C-шное навроде

--- Код: ---int sum;
for (int i = 0; i < xxx; i++)
  sum+= v[i];
return sum;

--- Конец кода ---

также, ради интереса можете скомпилировать С++ вариант без оптимизации, чтоб понимать сколько кода было выпилено оптимизатором c -O2.
worm:

--- Цитата: MetalliC от 22 Апрель 2019, 15:17:56 ---ты случайно не забыл в графе Compiler Options прописать -O2 ? то есть включить оптимизацию, иначе по-умолчанию генерируется "отладочный" код с кучей всякого говнища.

--- Конец цитаты ---
Я не знал о существовании этого флага, спасибо за информацию)


--- Цитата: megavolt85 от 22 Апрель 2019, 13:57:37 ---неужели хоть одна умная мысль пытается пробиться в твою голову
--- Конец цитаты ---
тебе показалось :lol:


--- Цитата: Skay от 22 Апрель 2019, 09:45:36 ---worm, как удобно всех кто фейспалмит от твоих действия обвинять в полыхании   но ты же выучил новое слово и по другому не умеешь, во всех темах где тебя тыкают носом в лужу, ты обвиняешь что у других полыхает 
--- Конец цитаты ---
Как раз таки я признаю свои ошибки, если осознаю это) И не перевожу стрелки, в отличие от некоторых)
Segaman:
спасибо за помощь.
недогадался бы, что компилятор всегда думает, что класс с виртальными методами должен всегда создаваться.
заменил на структуры :wow:
MetalliC:

--- Цитата: Segaman от 22 Апрель 2019, 23:29:42 --- класс с виртальными методами должен всегда создаваться.
--- Конец цитаты ---
с виртуальными методами не всё просто
https://wikipedia.org/wiki/Таблица виртуальных методов
и не бесплатно, что может быть ощутимо на слабеньких процессорах типа 68000
ALKOSHA:
Чё там по 3д ? Как показывает демка Овердрайв 2, сижка таки могёт 3д не хуже чем 32х.
В SGDK полный боекомплект процедурок работы с модельно-видовыми матрицами.
Я даже откопал некропост, где питоновый скрипт конвертит OBJ в хедер mesh.h.
Увы, но ссылки ныне мертвы...

Я ж это к чему. Знаете такой люто тормозной, но всё же движок-конструктор https://ru.wikipedia.org/wiki/Freescape ? Так вот. Он обошёл все компы, от ДОСа до амиги. Даже спектрума посетил. А вот сегу обошёл стороной. Хотя у сеги тот же проц, что и у амиги. В чём сложность портировать? Непонятно. Там переделать адресацию пикселей видео-памяти для тру-кодера дело на вечер. Ну да ладно. Я вот мечтаю увидеть подобие этого движка на СМД.

Конечно можно взять за основу уже готовый набор ф-ций SGDK для работы в 3д. Но тут возникают Unreal-ные для меня задачи. Во-первых, реализовать FPS-камеру я вряд ли смогу.
Во-вторых, забивать вручную массив mesh.h - довольно муторное занятие (один лишь кубик выходит довольно громоздким, пока распишешь каждый вертекс, каждую грань, каждую нормаль), без конвертера из распространённых форматов - никак. В-третьих, коллизии - тоже штука колдовская для меня.

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

Входные данные - набор точек XY рёбер на карте. Высота потолка сектора. XY угол поворота камеры.
Как на основе этих данных расставить отрезки на проекции ? В идеале бы ещё отсечение бэкфейсов сделать. Тут, скорее всего, для каждого отрезка на 2д-карте надо ещё направление нормали указывать.

SeregaZ:
а ты в дискорде сгдк поспрашивай у буржуев. там вроде чото они трындят, активные короче :)
Sharpnull:

--- Цитата: ALKOSHA от 30 Июнь 2019, 23:03:05 ---Я даже откопал некропост, где питоновый скрипт конвертит OBJ в хедер mesh.h.
Увы, но ссылки ныне мертвы...
--- Конец цитаты ---
Вы о 3D format conversion? Здесь нажимаете Download.
--------
А Overdrive 2 не показатель возможностей игры, там же катсцена, для реальной игры нужны ещё вычисления столкновений и прочего.
Проще сделать пошаговую как Might and Magic или Doom RPG, но у вас цель, полагаю, сделать не игру, а техническую демку.
ALKOSHA:

--- Цитата: Sharpnull от 01 Июль 2019, 00:00:12 ---как Might and Magic или Doom RPG
--- Конец цитаты ---
Если первое сделано банальным набором картинок, что элементарно, то ДумРПГ как раз процедурными искажениями текстур (не то рейкастинг, не то афинные преобразования по типу Зеро-толераста/Бладшота).

Я прост хотел малость вникнуть в полигональный графон на сеге. Для начала хотя бы проволочный (с отсечением невидимых линий).

Добавлено позже:

--- Цитата: Sharpnull от 01 Июль 2019, 00:00:12 ---Вы о 3D format conversion? Здесь нажимаете Download.
--- Конец цитаты ---
Да, оно... А чёрт! Проклятый гугель! Снова 403-ья ошибка. Это значит сцанкции на крым. Опять ВПН расчехлять!
*ругается по-крымски*
megavolt85:

--- Цитата: ALKOSHA от 01 Июль 2019, 00:17:18 ---Снова 403-ья ошибка. Это значит сцанкции на крым. Опять ВПН расчехлять!
--- Конец цитаты ---

попробуй отсюда
Ogr:

--- Цитата: ALKOSHA от 30 Июнь 2019, 23:03:05 ---Как показывает демка Овердрайв 2, сижка таки могёт 3д не хуже чем 32х.
--- Конец цитаты ---
ну да, а если эти 10 полигонов обтянуть текстурами как на 32х, 15фпс на "сижке" превратятся в 5фпс, если не меньше. ;)
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии