Да. Я так делаю в проигрывателе трекерной музыки для каждого звукового канала.
Ой, не знаю - по мне так проще как я описал. Универсальней что ли.Цитата:
Может все таки проще иметь один счетчик циклов, и сравнивать с кол-вом пропусков в объекте..
Вид для печати
Не могу допереть как с помощью алгоритма перевертывания вывести спрайт в произвольный X,Y.. если заполнять буфер последовательно то все более менее понятно, но если нужно вывести спрайт в произвольную точку как вычислить адрес и все равно нужно будет делать сдвиг?
Я немного выпал из процесса - другие дела были.
Попробую завтра написать процедуру вывода спрайта по произвольным координатам.
Кстати в порте для Win очень подходящая фоновая музычка:
https://yadi.sk/d/Vk0wZ7VkJ1a1RQ
только она ogg, для AY можно будет что-нибудь подобное сделать? Я слышал, что музыкой вы тоже увлекаетесь..:)
Уж больно по стилю подобная музыка подходит для такой игры.. обычно для AY делают забойные трели и бульканье, которое быстро напрягать начинает.
Жаль, спектрумисты вряд ли заинтересуются.. почему-то у них стойкая неприязнь ко всему что связано с БК :)
Да и мотивации не будет..
Написал вывод спрайта с произвольными координатами.
Образ .bkd
Платформу поджал в пропорциях 5:8 и подрисовал чтобы красиво было:
http://thesands.ru/bk0010/temp/lastmis3.png
Процедура 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 пиксель, то неанимированные спрайты можно не перерисовывать целиком, а просто сдвигом на экране обновлять. А вот с анимированными сложней: придётся стирать старый спрайт и рисовать поверх новый. Благо, это можно делать поточечно, то есть мерцания из-за стирания старого спрайта не будет.
ксттати не заметил особо вывода поточечно
во всяком случае на спеке выглядит как вывод до 4 точек
/* ксттати не заметил особо вывода поточечно */
Потому что на спеке однобитная графика, а на БК двух.
- - - Добавлено - - -
/*Процедура XY - преобразование координат в адрес экрана и маску начального пикселя.*/
Класс, т.е. смысл выставить начальную позицию карандаша..
есть над чем подумать.. сделать базовую для всех процедуру и к ней уже.. вывод тайла, спрайта, символа и строки.
Теперь уже можно запаковать лабиринт. Пробовал сжимать спрайты - некрасиво получается. Сейчас доделаю перевод спрайтов в текст, чтобы вставлять их в исходник, так будет удобней с указателями работать.