Не могу допереть как с помощью алгоритма перевертывания вывести спрайт в произвольный X,Y.. если заполнять буфер последовательно то все более менее понятно, но если нужно вывести спрайт в произвольную точку как вычислить адрес и все равно нужно будет делать сдвиг?
Я немного выпал из процесса - другие дела были.
Попробую завтра написать процедуру вывода спрайта по произвольным координатам.
manwe.pdp-11.ru
Кстати в порте для Win очень подходящая фоновая музычка:
https://yadi.sk/d/Vk0wZ7VkJ1a1RQ
только она ogg, для AY можно будет что-нибудь подобное сделать? Я слышал, что музыкой вы тоже увлекаетесь..
Уж больно по стилю подобная музыка подходит для такой игры.. обычно для AY делают забойные трели и бульканье, которое быстро напрягать начинает.
Жаль, спектрумисты вряд ли заинтересуются.. почему-то у них стойкая неприязнь ко всему что связано с БК
Да и мотивации не будет..
Последний раз редактировалось S_V_B; 28.09.2018 в 19:13.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Написал вывод спрайта с произвольными координатами.
Образ .bkd
Платформу поджал в пропорциях 5:8 и подрисовал чтобы красиво было:
Процедура XY - преобразование координат в адрес экрана и маску начального пикселя.
Процедура DRAWSPRITE16 - вывод спрайта 16 точек высотой. Ну или можно такие высокие спрайты разбивать на два (по 8 точек в высоту каждый), тогда процедура немного упростится.
SCREEN - начальный адрес игрового поля (у меня 47402). То бишь координаты не абсолютные для всего экрана, а относительные внутри игровой области.
Ещё для оптимизации можно подумать вот над чем:Код:MOV #45.,R1 ; x coord MOV #19.,R2 ; y coord CALL XY ; get screen address and pencil mask MOV #PLATFORM,R1 ; sprite address MOV #25.,R5 ; sprite width in pixels CALL DRAWSPRITE16 HALT ; subroutine: calculate address from x (R1) and y (R2) ; returns screen addres in R2 and pencil mask in R0 XY: SWAB R2 MOV R1,R0 BIC #7,R0 BIS R0,R2 ASR R2 ASR R2 ADD #SCREEN,R2 ; screen address BIC #177770,R1 ASL R1 MOV DOTS(R1),R0 ; pencil mask RET DOTS: .WORD 2,10,40,200,1000,4000,20000,100000 ; subroutine: draw sprite 16 pixels high ; input: ; R0 - pencil mask, R1 - sprite address, ; R2 - screen address, R5 - sprite width in pixels DRAWSPRITE16: 1: MOV R2,-(SP) ; save screen address MOV #100,R4 2: MOV (R1)+,R3 ; word to rotate CLC ; draw a column of points 3: ROL R3 BCC 31 ; if zero skip next command BIS R0,(R2) ; draw 1st bit of dot CLC 31: ROL R3 BCC 32 CLC ROR R0 BIS R0,(R2) ; draw 2nd bit of dot ASL R0 32: ADD R4,R2 ; next row of the screen TST R3 ; no more dots? BNE 3 MOV (SP),R2 ADD #1000,R2 INC PC ; repeat twice BR 2 MOV (SP)+,R2 ; column is drawn, restore screen address ASL R0 ; move pencil ASL R0 BNE 4 MOV #2,R0 ; set pencil to the first point ADD #2,R2 ; increase screen address 4: DEC R5 ; switch to the next column BNE 1 ; all columns are drawn? RET PLATFORM: insert_file "sprites/platform01.raw" .EVEN
платформа состоит из верхней неизменной части и нижней анимированной. Действительно тогда стоит разбить платформу на 2 спрайта и выводить их разными процедурами. Если на каждом кадре объекты могут сдвигаться только на 1 пиксель, то неанимированные спрайты можно не перерисовывать целиком, а просто сдвигом на экране обновлять. А вот с анимированными сложней: придётся стирать старый спрайт и рисовать поверх новый. Благо, это можно делать поточечно, то есть мерцания из-за стирания старого спрайта не будет.
Последний раз редактировалось Manwe; 29.09.2018 в 19:55.
manwe.pdp-11.ru
ксттати не заметил особо вывода поточечно
во всяком случае на спеке выглядит как вывод до 4 точек
С уважением,
Jerri / Red Triangle.
/* ксттати не заметил особо вывода поточечно */
Потому что на спеке однобитная графика, а на БК двух.
- - - Добавлено - - -
/*Процедура XY - преобразование координат в адрес экрана и маску начального пикселя.*/
Класс, т.е. смысл выставить начальную позицию карандаша..
есть над чем подумать.. сделать базовую для всех процедуру и к ней уже.. вывод тайла, спрайта, символа и строки.
Теперь уже можно запаковать лабиринт. Пробовал сжимать спрайты - некрасиво получается. Сейчас доделаю перевод спрайтов в текст, чтобы вставлять их в исходник, так будет удобней с указателями работать.
Последний раз редактировалось S_V_B; 30.09.2018 в 08:51.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)