Fortaleza Reznor
¡Bienvenido a Fortaleza Reznor!
¿Que es Fortaleza Reznor?
Fortaleza Reznor es un foro de SMWH (Super Mario World Hacking) Aquí modificamos (hackeamos) el juego de Mario World a nuestro gusto y enseñamos a otros a saber a manejar el hacking de SMW usando la famosa herramienta "Lunar Magic".

¡Regístrate!
Únete a nuestra comunidad!, te ayudaremos en cada duda que tengas respecto al SMWH. Aparte podrás participar en eventos que hay en el foro y descargar los recursos que crean nuestros usuarios.

¡ANÍMATE! ¡Te divertirás en nuestro foro!

Atte:
La administracion.


¡Super Mario World Hacking en español! ¡Ayuda, tips, diversión y más!
 
ÍndiceMiembrosRegistrarseConectarseCalendarioFAQBuscar

Comparte | .
 

 Tutorial de Bosses

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
anonimzwx
Mecha Koopa
Mecha Koopa
avatar

Posts Posts : 1108


MensajeTema: Tutorial de Bosses   Sáb Feb 02, 2013 4:12 pm

Bueno este es un tutorial que iniciare hoy, espero avanzarlo a medida que yo aprenda más y luego poder enseñar mi conocimiento
a todos ustedes, espero sea de su agrado y les sea de utilidad.

Objetivos del Tutorial:

-Aprender tanto a hacer sprites más complejos y bosses

-Aprender a mover sprites con facilidad

-Aprender a jugar con los atributos de mario para predecir sus movimientos

-Aprender a hacer sprites clustes

-Aprender a hacer sprites dinamicos

-Aprender a hacer sprites de cualquier tamaño

-Aprender a hacer rutinas de colision flexibles

-Aprender a dañar a un boss de diferentes formas

-Aprender la estructura basica de un boss

-Aprender a manejar sonido y SFX

-Aprender a manejar rutinas de salida de niveles

-Aprender a hacer diferentes ataques

-Aprender a usar el random del juego

-Aprender a usar los distintos modos de la snes


como yo aun no se todo eso, les enseñare en esta primera parte del tutorial las cosas mas basicas, a medida que valla aprendiendo mas les enseñare todo lo demas.

Requisitos del tutorial:

-Mucha paciencia

-Haber leido un tutorial de asm basico

-Haber leido un tutorial de sprites basico yo recomiendo el de ice guy ya que es muy bueno. aca dejo el link: [Tienes que estar registrado y conectado para ver este vínculo]


dividire el tutorial en 3 zonas:

Manual basico

Manual medio

Manual avanzado

Todo el conocimiento que no esta en los requisitos sera explicado en el tutorial.

Indice:

Manual basico:

-Estructura de un boss

-Hit points

-Como dañar al sprite (salto vertical y lanzamiento de objetos)

-Fases

-¿Que es un ataque? y ¿Como los elijo? (eleccion randomica y eleccion inteligente)

-¿Como muevo un boss de diferentes formas?

-Juguemos con los atributos de un sprite

-Sistema grafico basico, ¿como asignamos todos los frames correctamente?

-Sistema de colision via clipping

-Sistema de colision flexible

-Layer 2 basico

Manual Medio:

-introduccion al clustering

-introduccion a los sprites dinamicos

-introduccion a hdma

-introduccion a los modos

Manual avanzado:

-Clusters avanzados

-Dinamicos avanzados

-HDMA avanzado

-Layer 2 Avanzado

-Modos avanzados


Cada manual se separara en una respuesta distinta de este tutorial.

EL TUTORIAL TARDARA VARIOS MESES EN TERMINARSE, SEA PACIENTE. A MEDIDA QUE APRENDA MAS LO RELLENARE MÁS.
Volver arriba Ir abajo
anonimzwx
Mecha Koopa
Mecha Koopa
avatar

Posts Posts : 1108


MensajeTema: Re: Tutorial de Bosses   Sáb Feb 02, 2013 5:05 pm

antes de empezar el tutorial pondre un set de varias direcciones utiles que necesitaran.

Aca dejo un archivo base para cualquier sprite: [Tienes que estar registrado y conectado para ver este vínculo]

todo lo que se explique en el tutorial estara pensado con ese archivo base.

Atributos de sprites:

velocidad en x : $B6,x
velocidad en y : $AA,x

Posicion alta en x: $14E0,x (numero de screen en x)
posicion baja en x: $E4,x (numero del pixel dentro de una screen en x)

posicion alta en y: $14D4,x
posicion baja en y: $D8,x

estado del sprite: $14C8,x (se usa para saber si el sprite esta vivo o esta muriendo de alguna forma o bien no existe)

sprite bloqueado: $9D (si esta en 0 significa que apretaron start y que el sprite no debe hacer nada)

revisar si estoy colisionando con un bloque: $1588,x (esta direccion se trabaja asi:
#% asb?udlr

a = toca layer 2 por arriba
s = toca layer 2 por abajo
b = toca layer 2 por los laterales
? = ni idea
u= toca un bloque por arriba
d= toca un bloque por abajo
l=toca un bloque por la izquierda
r=toca un bloqe por la derecha)

direccion del sprite: $157C,x (cuidado que ahi una rutina que aplica movimiento que al usarla si colisionas lateralmente te cambia la direccion)

atributos de mario:

velocidad en x: $7B
velocidad en y: $7D

posicion alta en x: $95
posicion baja en x: $94

posicion alta en y: $97
posicion baja en y: $96

powerup de mario actual: $19

revisar que bloque esta tocando: $77 (similar a la $1588)

Direcciones de sprite vacias utiles:

- $1528,x
- $1534,x
- $1510,x
- $1504,x
- $1594,x
- $1540,x
- $1558,x
- $163E,x <- decrementa en 1 en cada frame
- $C2,x
[Tienes que estar registrado y conectado para ver este vínculo]




Manual Basico


Estructura de un boss

Un boss basicamente podemos definirlo en 4 partes.

Sistema de dañado: La forma en que sera dañado el boss y sus cambios a medida que tiene menos vida

Sistema de ataques: La forma en que elegira sus ataques y cuales ataques seran

Sistema de colision: La colision con otros sprites o con mario, ademas de que partes de el son dañables realmente o que partes son las que dañan a mario

Sistema grafico: La forma en que elige los frames que usara y como usarlos


Hitpoints

Los hit points es la vida del boss, a medida que es dañado pierde hit points y al llegar a 0 el sprite muere.

Para simular esto lo que usamos es usar una direccion vacia de sprite, tal como es la $1528,x, tambien puedes usar una direccion scratch pero no es recomendable por que a veces son usadas por algunos parches o por generadores, asi que recomiendo usar una direccion especifica de sprite que no se use (ver mas arriba).

¿Que es lo que hacemos?

(los codigos expresados seran puestos en trasm ya que xkas es muy mañoso y me cae mal)

lo que hacemos es inicializar el sprite con una cantidad de hit points para esto primero eligiremos que direccion usaremos para los hitpoints. Yo por mi parte usare la $1528,x

ahora en el sector entre

dcb "INIT"
RTL

y el sector

dcb "MAIN"

pondremos lo siguiente

LDA #$numero de hit point del sprite (08,06,03 o lo que se te ocurra recuerda que es Hexa)
STA $1528,x (o bien la direccion que elegiste)

ya echo esto, nuestro sprite iniciara con la cantidad de hit points que deseamos.

Ahora como hacemos que estos bajen pues en la parte que dañaremos al sprite le ponemos esto:

LDA $1528,x
DEC A
STA $1528,x

o bien

LDA $1528,x
CLC (limpia el carry para que no reste 2 algunas veces)
SBC #$01
STA $1528,x

Como ven es muy facil nomas es codigo muy simple.

Yo recomiendo crear la subrutina dañar en el sector del archivo base que dice ;aca es un buen lugar para poner subrutinas.

seria lo siguiente.

dañar:

LDA $1528,x
DEC A
STA $1528,x

RTS

o bien


dañar:

LDA $1528,x
CLC (limpia el carry para que no reste 2 algunas veces)
SBC #$01
STA $1528,x

RTS

Luego (como asumo que saben asm) simplemente llamas la subrutina cuando quieras usando el comando JSR dañar y listo.


Colisiones

En esta parte se explicara todo lo referente al sistema de colision del sprite.

En el mundo de los videojuegos existen 3 tipos de colisiones que son los mas usados.

Colision por caja: es simplemente asumir que el sprite es un rectangulo en la pantalla y que cuando otro sprite toca ese rectangulo entonces existe colision

Colision circular: es asumir que el sprite se asemeja más bien a un circulo y cuando otro sprite esta dentro del radio de otro sprite se asume que ahi colision.

Colision Perfecta: es una colision en la cual se revisa el perimetro completo del sprite y si colisiona con el perimetro de otro sprite
entonces existe colision.

En el super mario world la colision es por caja, aunque tambien se puede simular colision circular, la unica que es inaplicable en el smw es la colision perfecta ya que por la forma que esta echo el juego seria extremadamente largo de hacer y probablemente no valdra la pena.

Nosotros nos centraremos especialmente en las primeras 2 formas.

Colision por caja:

El juego en si tiene su propio sistema de colision que es por clipping, pero este sistema es muy rigido y no muy preciso por lo
que a menos que tu sprite no sea de un tamaño comun como 16X16, 32X32 o 16X32 no recomiendo usarlo.

El codigo de esta forma de colision es este:



Ahora les enseñare mi forma de hacer colision que es más flexible y te permite crear colision de cualquier tipo de figura compuesta por rectangulos.

Como funciona este, bueno lo primero que hacemos es asignarle al sprite un clipping que sea mayor o igual al largo del sprite, Suponte si el sprite tiene 22 pixeles de largo le asignas un clipping que tenga 32 pixeles de largo, si suena raro ¿22 pixeles de largo? este tipo debe estar loco eso no es multiplo de 8 ,pero si señores se pueden hacer sprites de cualquier tamaño y adaptar la caja a ese tamaño, solo ahi problemas con sprites demasiado grandes por que no existe un clipping que pueda abarcarlos y ademas que producen una serie de problemas graficos y necesitarias parches para usarlos.

Bueno continuemos, imaginense tenemos nuestro sprite de 22X29 (22 de largo y 29 de alto) pero nuestro clipping es de 32X32.
Digamos que la imagen del sprite de forma lateral parte en el pixel 5 del clipping y termina en el pixel 27, ademas de forma vertical parte en el pixel 0 y termina en el pixel 29.

¿Que hacemos para saber si colisiona?

A nosotros del clipping solo nos interesa su tamaño y el pixel inferior izquierdo. En mario es lo mismo, nos interesa solo el pixel inferior izquierdo.

mario es de 16X32 cuando es grande y de 16X16 cuando es pequeño.

Podemos saber la posicion del pixel inferior izquierdo de mario con las direcciones de posicion que puse arriba en el tutorial, lo mismo con un sprite.

Si la posicion en x de mario le sumas 16 estaras en el pixel mas a la derecha y si a la posicion de mario le sumas 32 (cuando es grande) o 16 (cuando es pequeño) estaras en el pixel de mas arriba (esto es analogo para el sprite).

Si el pixel mas a la derecha de mario esta tocando con el pixel mas a la izquierda del sprite entonces ahi colision por la izquierda analogamente si el pixel de mas a la izquirda de mario esta tocando el pixel mas a la derecha del sprite entonces ahi colision por la derecha. Esto es analogo en forma vertical.

Pero que sucede, nuestro sprite parte en el pixel 5 por lo tanto si quiero que choque contra el pixel mas a la derecha de mario exactamente no debo sumarle 16 a la posicion de mario tendria que sumarle 11, porque si le sumo 16 estaria chocando contra el pixel mas a la izquierda del clipping no del sprite. Analogamente si quiero que el pixel mas a la derecha del sprite choque contra el pixel mas a la izquierda de mario no debo sumarle 32, debo sumarle 27.

Ahora vamos al codigo.

Yo recomiendo usar una direccion especifica para las colisiones yo por mi parte usare la $1510,x

La usare de esta forma $1510,x = 1 existe colision, sino no existe colision.

Recomiendo para la flexibilidad del sistema de colision separar en 2 rutinas

lateralcrash y verticalcrash.

Ademas otra ventaja de esto que dependiendo el frame que estes usando del sprite, puedes alterar el sistema de colision para que se adapte a ese frame pero lo explicare más adelante.

lateralcrash:

LDA $E4,x
CLC (limpia el carry para qu no haga problmas con la suma)
ADC #$pixel donde termina el sprite (puede saberse viendo el GFX)
CMP $94
BPL addlc

LDA $94
CLC (limpia el carry para qu no haga problmas con la suma)
ADC #$ (aca poner 16 - pixel donde empieza el sprite)
CMP $E4,x
BPL addlc

JMP retlc
addlc:

LDA #$01
STA $1510,x

retlc:
RTS

este codigo esta simplificado para que se entienda mas menos la idea. pero la verdad tiene un par de detalles, primero que pasa si ¿ mario esta en otra screen que el sprite ? entonces este codigo te dira que esta colisionando con mario pero en la otra screen por lo qu ahi un problema. Ademas que sucede si esta el sprite al borde de la screen? o mario esta al borde de la screen? entonces causara un overflow y la suma se ira al carajo. Para arreglar estos problemas debemos hacer lo siguiente:

(continuara... ya me dio flojera).
Volver arriba Ir abajo
 

Tutorial de Bosses

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» Rayman Gold/Designer Pequeño tutorial sobre qué son los EVE.
» TUTORIAL "Como rellenar la ficha"
» TUTORIAL Para el uso del Chatbox
» Tutorial de cabinas
» TUTORIAL : NUEVA ANIMADORA HUMANA

Permisos de este foro:No puedes responder a temas en este foro.
Fortaleza Reznor ::  Archivero Reznor :: Basurero-