User Tag List

Показано с 1 по 10 из 228

Тема: Портирование игр с PC на БК

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #9

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Написал вывод спрайта с произвольными координатами.
    Образ .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

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Портирование Lode Runner БК->УКНЦ
    от nzeemin в разделе ДВК, УКНЦ
    Ответов: 103
    Последнее: 12.12.2020, 04:04
  2. Ответов: 21
    Последнее: 04.10.2019, 18:03
  3. Портирование Stop the Express
    от nzeemin в разделе ДВК, УКНЦ
    Ответов: 90
    Последнее: 21.11.2018, 09:46
  4. Ответов: 38
    Последнее: 23.11.2014, 16:00

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •