Descripcion: este es un WIP que ire complementando a medida que avance en mi hack. Contiene varias rutinas que facilitan el trabajo al momento de hacer sprites, ademas ahorras espacios porque las puedes utiliza en todos los sprites que hagas.
Descarga:
[Tienes que estar registrado y conectado para ver este vínculo]Uso general:
Como en muchos parches debes cambiar el freespace pero en este debes cambiar mas de 1 solo freespace:
El default es:
!Freespace = $3E8000
!colision = $3E8008
!GET_DRAW_INFO = $3E800C
!SUB_OFF_SCREEN_X0 = $3E8010
!detectarCercania = $3E8014
!RutinaGraficaOAM200 = $3E8018
!GETDRAWOAM200 = $3E801C
Pero si deseas cambiarlo debes cambiar los primeros 2 numeros de cada uno por el del que buscas por ejemplo
si quieres que el freespace quede en $2D8000 debes poner esto:
!Freespace = $2D8000
!colision = $2D8008
!GET_DRAW_INFO = $3E800C
!SUB_OFF_SCREEN_X0 = $2D8010
!detectarCercania = $2D8014
!RutinaGraficaOAM200 = $2D8018
!GETDRAWOAM200 = $2D801C
llamando las sub rutinas:
Para llamar cualquiera de las sub rutinas pones lo siguiente:
en la parte mas arriba pones algo como
!GET_DRAW_INFO = $3E800C
y luego para llamar esa rutina haces solamente esto:
JSL !GET_DRAW_INFO
Ahora cada sub rutina tiene sus propios parametros.
Como usar las sub rutinas:
Colision Flexible (!colision): Esta rutina te permite hace colision entre 2 sprites cualquieras (ya sean clusters, extended, sprites normales, mario, incluso sprites ficticios). Para usarla necesitamos los siguientes parametros:
$00 = posicion en x del primer sprite (low byte)
$01 = posicion en x del primer sprite (high byte)
$02 = posicion en y del primer sprite (low byte)
$03 = posicion en y del primer sprite (high byte)
$04 = posicion en x del segundo sprite (low byte)
$05 = posicion en x del segundo sprite (high byte)
$06 = posicion en y del segundo sprite (low byte)
$07 = posicion en y del segundo sprite (high byte)
$08 = ancho del primer sprite
$09 = alto del primer sprite
$0A = ancho del segundo sprite
$0B = alto del segundo sprite
$08,$09,$0A y $0B se sacan probando cuanto es lo adecuado, puedes estimarlos mentalmente pero no son tan obvios a veces recomiendo prueba y error para encontrar la colision adecuada .
Al terminar la rutina el carry estara prendido si hubo colision y estara apagado si no hubo colision.
Ejemplo de uso:
- Código:
-
LDA $E4,x
STA $00
LDA $14E0,x
STA $01
LDA $D8,x
STA $02
LDA $14D4,x
STA $03
LDA $94
STA $04
LDA $95
STA $05
LDA $96
STA $06
LDA $97
STA $07
LDA #$0A
STA $08
LDA #$0C
STA $09
LDA #$0A
STA $0A
LDA #$1E
STA $0B
JSL !colision
BCC retCol
JSR RutinaCuandoHayColision ;aca poner lo que sucede cuando los 2 sprites colisionan.
retCol:
RTS
NOTA importante: la rutina funciona bien ya esta probada, si no te funcona la colision es por que pusiste mal los valores $08,$09,$0A o $0B.
!GET_DRAW_INFO: el clasico GET_DRAW_INFO de casi todos los sprites solo que con una pequeña variacion. cuando un sprite no debe ser dibujado (por que esta fuera de la pantalla) la RAM $06 va estar en 1, si se debe dibujar estara en 0.
Ejemplo de uso:
- Código:
-
Frame1_Start:
JSL !GET_DRAW_INFO
LDA $06
BEQ contFrame1
RTS
contFrame1:
PHX
LDX #$1
Loop_Frame1:
LDA $00
CLC
ADC XDISP_Frame1,x
STA $0300,y
LDA $01
CLC
ADC YDISP_Frame1,x
STA $0301,y
LDA TILEMAP_Frame1,x
STA $0302,y
LDA PROPERTIES_Frame1,x
ORA $64
STA $0303,y
INY
INY
INY
INY
DEX
BPL Loop_Frame1
PLX
LDY #$02
LDA #$1
JSL $01B7B3
RTS
!SUB_OFF_SCREEN_X0: No utilizar por el momento.
!detectarCercania: esta rutina detecta que tan cerca esta un sprite de otro en una direccion especifica. Por ejemplo con esta rutina puedes saber si un sprite esta 5 tiles a la derecha o 5 tiles a la izquierda del otro sprite.
Esta rutina al igual que la de colision funciona con cualquier par de sprites (mario, sprites normales, clusters, extended, incluso sprites ficticios).
Para usarla debes llenar unos cuantos parametros que son los siguientes:
$00 = low byte en la dimension Escogida (x o y) del primer sprite
$01 = high byte en la dimension Escogida (x o y) del primer sprite
$04 = low byte en la dimension Escogida (x o y) del segundo sprite
$05 = high byte en la dimension Escogida (x o y) del segundo sprite
$08 = distancia hacia un lado
$09 = distancia hacia el otro lado
una ves que se hace esta rutina el carry se activara si el sprite estaba dntro del rango especificado y se desactivara si estaba fuera del rango.
ejemplo en codigo 1:
- Código:
-
LDA $D8,x
STA $00
LDA $14D4,x
STA $01
LDA $96
STA $04
LDA $97
STA $05
LDA #$08
STA $08
LDA #$08
STA $09
JSL !detectarCercania
BCC NoEsta en el rango
JSR LoQueDebeHacerCuandoEstaDentroDelRango ;aca poner la rutina con lo que dberia hacer si el sprite esta en el rango
NoEsta en el rango:
RTS
En este caso se vio un rango vertical (osea si esta mas arriba de tanto y mas abajo de tanto).
Nota: los valores $08 y $09 casi siempre seran iguales pero si deseas que detecte mas hacia un lado que el otro pueden ser distintos.
Rutina Grafica con OAM 200 (!RutinaGraficaOAM200): esta rutina te permite poner un Tile en una posicion especificada usando la OAM 200. Muy util para la rutina grafica de un extended sprite, un cluster, un sprite ficticio o efectos graficos. Tambien puede ser utilizada para poner tiles en posiciones fijas en la pantalla.
Para utilizar esta rutina debemos llenar los siguientes datos:
$00 = posicion X del tile (low byte)
$01 = posicion X del tile (high byte)
$02 = posicion Y del tile (low byte)
$03 = posicion Y del tile (high byte)
$04 = tamaño del Tile
$05 = desplazamiento en X del tile
$06 = desplazamiento en Y del tile
$07 = Tile
$08 = Propiedad
$0A = Y index
el desplazamiento del tile es para saber que tan desplazado esta el tile con respecto a la posicion especificada.
el tamaño del tile es #$00 si el tile es de 8X8 y #$02 si el tile es de 16X16
el Tile es sacable del lunarmagic usando el boton
.
La propiedad usa YXPPCCCT.
Y = si el tile esta flippeado en el eje Y.
X = si el tile esta flippeado en el eje X.
PP = Prioridad del tile (puede ser 00,01,10,11 donde 00 haria que fuera detras de todo el FG y 11 haria que fuera delante del FG) considerar que la prioridad no aplica para sprites solo para el layer 1 y layer 2.
CCC = paleta (000 = paleta 8,001 = paleta 9 ... 111 = paleta F)
T = si es 0 usara graficos de SP1 y SP2, si es 1 usara graficos de SP3 y SP4.
el Y index corresponde al valor en la tabla oam. quedara mas claro con el ejemplo.
Ejemplo de Uso para un Tile simple:
- Código:
-
Graphics:
OAMStuff: db $48,$4C,$50,$54,$58,$5C,$60,$64,$68,$6C,$70,$E0,$E4,$E8,$EC,$F0,$F4,$F8,$FC
LDA $1E16,y
STA $00
LDA $1E3E,y
STA $01
LDA $1E02,y
STA $02
LDA $1E2A,y
STA $03
LDA #$02
STA $04
LDA #$00
STA $05
LDA #$00
STA $06
LDA #$0E
STA $07
LDA #$3C
STA $08
PHY
LDA OAMStuff,y
STA $0A
JSL !RutinaGraficaOAM200
PLY
RTS
Esta rutina pone un Tile en la posicion de un cluster. Lo que podria ser la rutina grafica de un cluster de 16X16.
Ejemplo para una rutina que usa mas de un Tile.
- Código:
-
OAMStuff: db $48,$4C,$50,$54,$58,$5C,$60,$64,$68,$6C,$70,$E0,$E4,$E8,$EC,$F0,$F4,$F8,$FC
PROPERTIES_Frame: db $24,$64,$24,$64,$24,$24
TILEMAP_Frame: db $26,$26,$36,$36,$28,$38
XDISP_Frame: db $F0,$0F,$F0,$0F,$00,$00
YDISP_Frame: db $00,$00,$08,$08,$00,$08
rutinaGrafica:
LDX #$05 ;cantidad de tiles
LoopRutinaGrafica:
LDA $1E16,y
STA $00
LDA $1E3E,y
STA $01
LDA $1E02,y
STA $02
LDA $1E2A,y
STA $03
LDA #$02
STA $04
LDA XDISP_Frame,x
STA $05
LDA YDISP_Frame,x
STA $06
LDA TILEMAP_Frame,x
STA $07
LDA PROPERTIES_Frame,x
STA $08
PHY
LDA OAMStuff,x
STA $0A
JSL !RutinaGraficaOAM200
PLY
DEX
BMI salirRutinaGrafica
JMP LoopRutinaGrafica
salirRutinaGrafica:
RTS
Get Draw Info especial: Este es un get draw info especial que se puede utilizar para cualquier tile en pantalla. Para utilizarlo debes llenar lo siguiente:
$00 = posicion X del tile (low byte)
$01 = posicion X del tile (high byte)
$02 = posicion Y del tile (low byte)
$03 = posicion Y del tile (high byte)
$04 = tamaño del tile (00 = 8X8, 02 = 16X16)
una ves terminada la rutina tendras la siguiente informacion:
$00 = posicion X del tile relativa a la pantalla
$01 = posicion Y del tile relativa a la pantalla
$06 = dice si el tile es valido o no
$05 = dice la modalidad para ser dibujado el tile
si $06 es 1 entonces el tile no es valido por lo que no debes usarlo en la pantalla.
$05 te dira la "modalidad" con la que debe ser puesto el tile, 00 = tile normal de 8X8, 01 = tile cortado de 8X8 (se usa para los bordes de la pantalla), 02 = tile normal de 16X16 , 03 = tile cortado de 16X16 (se usa para los bordes).