
Сообщение от
hippiman
Это тебе нужно либо мудрить с рейкастингом
необязательно с ним мудить
можно сделать все в лоб и без злобного матана
и все будет не так плохо
примерно таким алгоритмом
Код:
hl player_x
hl' player y
de ray_vector_x ;тупо таблицы синусов\косинусов
de' ray_vector_y
;сам сканер
add hl,de ;11
ld a,h ;4
exx ;4
add hl,de ;11
ld b.h ;4
ld c,a ;4
ld a,(bc) ;7
cp $xx ;7
jr nz,dist1 ;7\12
add hl,de ;11
ld a,h ;4
exx ;4
add hl,de ;11
ld b.a ;4
ld c,h ;4
ld a,(bc) ;7
cp $xx ;7
jr nz,dist2 ;7\12
...
...
...
jr nz,dist30 ;7\12
dist1
ld h,a ;тип объекта
ld a,l ;младший адрес координат столкновения по Y
ld l,$xx ;растояние от игрока до объекта
push hl
exx
ld h,a ;в l младший адрес координат столкновения по X
push hl
ret
dist2
ld h,a ;тип объекта
ld a,l ;младший адрес координат столкновения по x
ld l,$xx ;растояние от игрока до объекта
push hl
exx
ld l,h
ld h,a ;в l младший адрес координат столкновения по y
push hl
ret
... итд
итого 59 тактов на шаг
нужно порядка 64(угол обзора лучей) * 25 (максимальная глубина сканирования при грубом шаге)
1600 циклов по 59
94400 такта на полное сканирование в пустом пространстве
в готовой комнате это число будет меньшим
+можно для каждого столбца экрана сделать свою развернутую процедуру
в которой будут заносится значения с уже скорректированными от закругления камеры расстояниями
далее из стека выдергиваем готовое расстояние
номер текстуры
грубые координаты столкновения
из которых можно попытаться вычислить координаты на текстуре
(скорей то что большее то и координата)
линейно интерполяцией можно добавить промежуточные столбцы
на основе начального угла запуска луча
можно попытаться определить координаты текстуры и по точнее
при столкновении
можно не сразу заносить расстояние
можно запустить луч в обратном направлении с меньшим шагом (поделить на 2 на 4 шаг и поменять знак)
и уточнить расстояние (сильно прям много ресурса это не сожрет 15к тактов и меньше)
3Ы
это имеет мало общего с тем безобразием что я недавно выложил
тут не должно быть такой низкой дискретности перемещения
и таких сильных искажений пространства
хотя с наложением текстур тут несколько плоховато