Предположим, вас устраивает достаточно небольшое количество выходных направлений, проще всего это сделать с помощью таблицы поиска. Например. для 64 выходных направлений возьмите вектор (x, y)
от источника к месту назначения, и, если оба положительны, сдвиньте оба влево, пока одно из них не заполнит знаковый бит, затем сформируйте четырехбитный индекс таблицы из двух верхних битов каждого и посмотрите выходной вектор.
Предполагая, что у вас 160x200, я думаю, вам нужно отбросить немного точности, прежде чем войти.
Отражайте соответствующим образом, чтобы иметь дело с другими квадрантами. Предполагая фиксированную точку 8,8 для местоположений объектов и скорость пули 1, тогда это 32-байтовая таблица поиска.
Итак, наивно, что-то вроде:
xPosYPos:
; assuming ($00) has the positive x difference
; and ($01) has the positive y difference
lda $00
ora $01
shiftLoop:
asl $00
asl $01
asl a
bpl shiftLoop
; load A with table index
lda #$00
rol $00
rol a
rol $00
rol a
rol $01
rol a
rol $01
rol a
; look up vector
tax
lda xVec, x
; ... put somewhere ...
lda yVec, x
; ... put somewhere ...
... с более разумным решением, вероятно, включающим что-то вроде:
lda $00
ora $01
asl a
bmi shift1
asl a
bmi shift2
... etc ...
shift1:
... etc, but you can shift directly to form
the table index rather than going to all the work
of shifting the vector then piecing together from
the top bits ...
Или вы можете создать 256-байтовую таблицу поиска для поиска подпрограммного адреса на основе x|y
(который всегда будет не более 127, потому что они оба положительны) и перейти непосредственно к сдвигу без подсчета битов.
Учебник по расположению объектов и фиксированной точке:
Предполагая, что вы находитесь в режиме 160x200, вы можете сохранить каждый компонент местоположения объекта в виде одного байта. Итак, один байт для x, один байт для y. Вместо этого многие игры сохраняют каждое местоположение в виде двух байтов. Всего четыре байта для x и y.
Один из этих байтов такой же, как и в однобайтовом формате — это целочисленная позиция. Другая - дробная часть. Итак, если у вас есть положение и скорость (и интегрирование по Эйлеру), вы делаете 16-битное добавление скорости к положению. Затем вы просто используете верхний байт для позиции.
Обычно это называется арифметикой с фиксированной точкой. В отличие от числа с плавающей запятой, место в целом числе, где находится десятичная точка, фиксировано. В описанной здесь схеме всегда восемь бит.
Так, например. чтобы добавить смещение только с количеством байтов:
clc
lda xPosition
adc xVelocity
sta xPosition
sta SomeHardwareRegisterForSpritePosition
Чтобы добавить смещение со схемой с фиксированной точкой:
clc
lda xFractionalPosition
adc xFractionalVelocity
sta xFractionalPosition
lda xPosition
adc xVelocity
sta xPosition
sta SomeHardwareRegisterForSpritePosition
Преимущество в том, что ваш вектор скорости теперь может быть всего 1/256 пикселя в любом направлении. Так, например. вы можете сохранить скорость, которая говорит о том, что в каждом кадре ваша пуля будет перемещаться на один пиксель влево и на 32/256 пикселя вниз. И все, что нужно для перемещения этой пули с субпиксельной точностью, — это дополнительная пара байтов памяти на вектор и дополнительная пара АЦП.
С приведенным выше предложением вы получите вектор от источника к месту назначения, вычитая один байт одного из одного байта другого. Результатом будут два одиночных байта, оба из которых будут дробными частями вывода. Так, например. вы можете решить выстрелить пулей с вектором (87/256, 239/256), то есть под углом 20 градусов.
person
Tommy
schedule
28.10.2015