Hola,
Cual es la mejor manera para detectar sobre que caracter esta un sprite ?
ayer entube haciendo pruebas en CM pero no encuentro ninguna manera que me convenza
aquí posteo mi ultimo código, a ver si alguien me sabe dar una solución mejor, ahora estaba pensando en almacenar en la ram la posición de cada carácter pero en alta resolucion (ej caracter 1 en 100,128 caracter 2 108,128,etc,etc)
; check collision
;---------------------------------------------------------
; CONSTANTS
;---------------------------------------------------------
; VRAM addresses
CHRTBL equ 0000h ; Pattern table
NAMTBL equ 1800h ; Name table
CLRTBL equ 2000h ; Colour table
SPRTBL equ 3800h ; Sprite pattern table
SPRATR equ 1b00h ; Sprite attributtes
; System variables
CLIKSW equ 0f3dbh ; Keyboard sound
FORCLR equ 0f3e9h ; Foreground colour
;---------------------------------------------------------
; ASSEMBLER DIRECTIVES (asMSX)
;---------------------------------------------------------
.bios ; Defines MSX BIOS routines
.page 2 ; Assembly starts at 8000h
.rom ; Selected format
.db "CheckCollision",1Ah
; Text header - not MSX standard
.start INIT ; Program start
;---------------------------------------------------------
;---------------------------------------------------------
INIT:
; Program start
;---------------------------------------------------------
call INIT_GRAPHICS
call DEFINE_SPRITES
call INITVARS
ld de,NAMTBL
ld hl,MAPA1
ld bc,912
call LDIRVM
buc:
call DRAW_PROTA
call MOVE_PROTA
ld a,[protatny]
ld b,a
ld a,[protatnx]
ld c,a
call GET_POS
ld a,65
call WRTVRM
halt
ld a,[protatny]
ld b,a
ld a,[protatnx]
ld c,a
ld a,32
call DRAW_CHAR
jp buc
;---------------------------------------------------------
INIT_GRAPHICS:
; Initialise the graphic mode and define graphic elements
;---------------------------------------------------------
; Set proper colours
; BASIC: COLOR 15,0,0
ld hl,FORCLR
ld [hl],15
inc hl
ld [hl],0
inc hl
ld [hl],0
; Set text mode II
; BASIC: SCREEN 1
call INIT32
; Erase all sprite data
call CLRSPR
; 16x16 Sprite mode
; BASIC: SCREEN ,2
ld bc,0e201h
call WRTVDP
ret
;---------------------------------------------------------
MOVE_PROTA:
; Mueve la raqueta
;---------------------------------------------------------
ld a,0
call GTSTCK
cp 1
jp nz,@@PRSDOWN
;-- desplaza el muñeco
ld a,[protay]
dec a
ld [protay],a
;--
ld a,[offsety] ; decrementa offsety
dec a
ld [offsety],a
;--
cp 255
ret nz ; if offsety=255 then offsety=7:protatny-- else ret
ld a,7
ld [offsety],a
ld a,[protatny]
dec a
ld [protatny],a
ret
@@PRSDOWN:
cp 5
jp nz,@@PRSLEFT
ld a,[protay] ; incrementa protay
inc a
ld [protay],a
;--
ld a,[offsety] ; incrementa el offsety
inc a
ld [offsety],a
;--
cp 8 ; if offsety=8 then offsety=0:protatny++ else ret
ret nz
ld a,0
ld [offsety],a
ld a,[protatny]
inc a
ld [protatny],a
ret
@@PRSLEFT:
cp 7
jp nz,@@PRSRIGHT
ld a,[protax]
dec a
ld [protax],a
;--
ld a,[offsetx] ; decrementa offsetx
dec a
ld [offsetx],a
;--
cp 255
ret nz ; if offsetx=255 then offsetx=7:protatnx-- else ret
ld a,7
ld [offsetx],a
ld a,[protatnx]
dec a
ld [protatnx],a
ret
@@PRSRIGHT:
cp 3
ret nz
;-- comprueba que no haya ningun caracter a la derecha
ld a,[protatnx]
inc a
inc a
ld c,a
ld a,[protatny]
ld b,a
call GET_POS
call RDVRM
cp '0'
ret z
;-- desplaza el muñeco
ld a,[protax]
inc a
ld [protax],a
;--
ld a,[offsetx] ;incrementa offsetx
inc a
ld [offsetx],a
;--
cp 8 ; if offsetx=8 then offsetx=0:protatnx++ else ret
ret nz
ld a,0
ld [offsetx],a
ld a,[protatnx]
inc a
ld [protatnx],a
ret
ret
;---------------------------------------------------------
DRAW_PROTA:
; Inicializa las variables
;---------------------------------------------------------
ld hl,SPRATR
ld a,[protay]
call WRTVRM
ld hl,SPRATR+1
ld a,[protax]
call WRTVRM
ld hl,SPRATR+2
ld a,0
call WRTVRM
ld a,15
ld hl,SPRATR+3
call WRTVRM
ret
;---------------------------------------------------------
INITVARS:
; Inicializa las variables
;---------------------------------------------------------
; posiciona el sprite del prota
ld a,88
ld [protax],a
dec a
ld [protay],a
; posiciona el prota en relacion a la pantalla de texto
ld a,11
ld [protatnx],a
ld [protatny],a
; pone los offsets a 0
ld a,4
ld [offsetx],a
ld [offsety],a
ret
;---------------------------------------------------------
DEFINE_SPRITES:
; define los sprites
;---------------------------------------------------------
; -Bat
ld hl,SPRTBL
ld bc,32
ld a,129
call FILVRM
ret
;---------------------------------------------------------
GET_POS:
; retorna la direccion de la tabla de nombre seleccionada en X e Y
; B=Y
; C=X
; hl= direccion
;---------------------------------------------------------
ld a,b
and 11111000b ; pilla los 5 ultimos bytes de b
srl a
srl a
srl a ; los corre 3 posiciones a la derecha
ld h,a ; lo deposita el H
ld a,b
and 00000111b ; pilla los 3 primeros bytes de b
rl a
rl a
rl a
rl a
rl a ; los corre 5 posiciones a la izquierda
or c ; lo mezcla con C
ld l,a ; lo deposita el L
ld bc,NAMTBL ; suma la direccion de la tabla de patrones
add hl,bc
ret
;---------------------------------------------------------
; MAPAS
;---------------------------------------------------------
MAPA1:
db "00000000000000000000000000000000"
db "0 0"
db "0 0"
db "0 0"
db "0 0"
db "0 0"
db "0 0"
db "0 0"
db "0 0 0"
db "0 0 0"
db "0 0 0"
db "0 0 0"
db "0 0 0"
db "0 0 0"
db "0 0 0"
db "0 0"
db "0 0"
db "0 0"
db "0 0"
db "0 0"
db "00000000000000000000000000000000"
;---------------------------------------------------------
; VARIABLES
;---------------------------------------------------------
.page 3
; posicion prota
protax:
.ds 1
protay:
.ds 1
; posicion del prota en la tabla de nombres
protatnx:
.ds 1
protatny:
.ds 1
offsetx:
.ds 1
offsety:
.ds 1
Viejo, podrias explicarme como lo haces en Phantomas Saga?
gracias compeñeros