Сканер сделал, завтра рендер примитивный накидаю можно будет заценить.
Вид для печати
Сканер сделал, завтра рендер примитивный накидаю можно будет заценить.
Дописал рендер, рейкастинг в максимуме получился ~70к, рендер 25к. Буду думать, есть что из предвычеслений по табличкам раскинуть, думаю во фрейм можно уложится. Пока еще есть мелкие глюки и нет нормального движения, но мне нравится :)
Рано :) надо сделать что бы можно было побегать посмотреть, еще не решил делать ли коррекцию перспективы. Первоначальная цель в принципе выяснить можно ли уложится в фрейм, пока вроде можно, осталось немного облагородить. Хорошо то что мои опасения относительно дискретности не подтвердились, с таким форматом поработать можно.
- - - Добавлено - - -
Нашел небольшой глючек, посему наверное можно выложить Вложение 57478
Что есть:
Рейкастинг по 64 лучам на fov 90.
Рендер 64*22
Примитивная управлялка (вправо/влево/вперед)
Карта
Чего катастрофически не хватает:
Оптимизации обвязки
Коррекции перспективы и нормальной таблицы высот
Минимально удобного управления
Что по моему можно изменить
Сделать 32 луча (реально 64 не к чему)
Подумать пусть не о текстурах но хоть разноцветные сделать
В общем первоначальная моя цель проверить пиксельную карту, а не блочную по моему выполнена. Спасибо Destr'у за идею. На досуге попробую подопиливать.
Вам надо понимать несколько очень важных вещей.
- окружность в 256 типа градусов вам большой точности в расчётах не даст. У Алония 1024 градуса на окружность.
- сканировать каждый "градус" не обязательно, но нужно делать другие проверки, а вместо пропущенных элементов карты производить интерполяции.
- пытаться уложиться во фрейм или хотя бы 2 фрейма - это утопия.
Стараться нужно делать не просто фреймовость, но ещё и достигнуть "красивой" точночти, а не лесенку как сейчас или в прошлом варианте у Дестра. На сях я тоже пробовал, в том числе по методу который сам же и описал, на выходе получил страшенную лесенку.
Дестр, чтобы не пилить килобайты монотонных процедур, запили один раз генератор таких процедур. Возьми в пример подобный генератор у Алонгия из исходника его Вольфа под экран АТМ. Там процедурка не большая, но на выходе даёт много кб кода, который производит масштабирование. Т.е. одна процедура = 1 масштаб и таких процедур там 64. Всё автоматизировано. Такая процедура легко адаптируется (например, уже подбита под Спринтера).
Файл Geatm3 в исходниках Алоновской демки the board 2.
Можно взять за основу сканер Алония, а рендер запилить свой.
Ну я и пытался придумать такой генератор, но не на уровне zx-асма, а на уровне компиляции.
Ну по типу
(Конечно это не рабочий кусок, а просто как-бы наглядный пример генерирования некой абстрактной таблички. Так-же можно генерить любой код, но есть ньюансы, о которые я и споткнулся).Код:L=1
REPT 8
REPT 8
DB L
L=L+1
ENDR
L=L/2
ENDR
Destr,
не проверял, но попробуй (подобные конструкции я засунул в порт Алоновского Вольфа)
Не проверял. С другой стороны, есть скриптинг на Lua прям в основном коде (или можно вынести в include).Код:L=1
REPT 8
REPT 8
db {L+1}
ENDM
{L=L/2}
ENDM
Ну вот "программист" подключился посему тема скатывается в пустую болтовню как это нынче у нас водится. Удачи.
про какую пустую болтовню речь? пример кода даже привёл для Дестра, чтобы он понимал, как можно разруливать подобные "преобразования". Луа или вот такими фигурными скобками.Цитата:
в пустую болтовню
А вот пример рабочего кода из вольфа48 с такими скобками:
можно сказать. что некоторые аласмовые финты ужасм легко переваривает либо с некоторыми допилами.Код:tcorrlogd:
REPT 256
db {wascorrlogd+$-tcorrlogd} & 0xff
EDUP
; LUA ALLPASS
; for i=1,256,1 do
; l_wascorrlogd = sj.get_label("wascorrlogd")
; l_tcorrlogd = sj.get_label("tcorrlogd")
; addr = l_wascorrlogd+sj.current_address-l_tcorrlogd
; byte = sj.get_byte(addr)
; --byte = word % 256
; sj.insert_define("_t", byte)
; _pc("db _t")
; end
; ENDLUA
tcos: INCBIN "cos.bin"
tlogcos: INCBIN "pluslcos.bin"
tda:
REPT 256
db {wasda+$-tda} & 0xff
ENDM
; LUA ALLPASS
; for i=1,256,1 do
; l_wasda = sj.get_label("wasda")
; l_tda = sj.get_label("tda")
; addr = l_wasda+sj.current_address-l_tda
; byte = sj.get_byte(addr)
; sj.insert_define("_e", byte)
; _pc("db _e")
; end
; ENDLUA
tctg: INCBIN "plusctg.bin"
tsin: INCBIN "sin.bin"
tscaljps: INCBIN "scaljps.bin"
DISPLAY "tID:=",$
tID:
MACRO wall arg0, arg1
db -arg0, arg1
ENDM
; REPT 64+16
; wall 0,0
; ENDM
ds 160,0
tID2:
MACRO pgwall arg0 ;4 текстуры в 1 ряд
wall arg0, 0x0 ;всего 4096 байт на 1 текстуру...
wall arg0, 0x10 ;а тут переходы на новую (след.) текстуру.
wall arg0, 0x20 ;для переходя на след.строку в текстуре
wall arg0, 0x30 ;сделать +256 от текущей позиции в текстуре.
ENDM
pgwall 0
pgwall 0
pgwall 0
pgwall 0
pgwall 0