[TUTORIAL] Programacion Megadrive - Basico

[TUTORIAL] Programacion Megadrive - Basico

Notapor theelf » Dom Feb 15, 2015 11:47 pm

Saludos

Este tutorial lo escribi en el 2010, y pocos cambios he echo desde entonces, mas que agregar algunas cosas

Estaba pensando, ya que he movido el tutorial a mi web, en seguirlo. Mi idea es postear el codigo del juego Octopus, y explicarlo paso a paso



Como indica el titulo, este es un tutorial básico de programación para Megadrive. Es un tutorial solo apto para novatos, ya que los contenidos serán muy simples. Ademas, quiero ser practico, aquí no dare un tutorial de “hola mundo”, si no, que ire directo a lo divertido los “sprites” XD

Ante todo gracias a Mairtrus por toda la ayuda prestada


TODO EL CONTENIDO ESTA MEJOR EXPLICADO EN MI WEB: http://theelf-megadev.com/






Para este tutorial escogí el lenguaje BASIC, por su simpleza, y porque existe un compilador muy bueno para Megadrive llamado Basiegaxorz

http://devster.monkeeh.com/sega/basiegaxorz/

Descargen e instalen la versión “Newest and Latest - BasiEgaXorz v1.37 Using the ASMX Assembler”

Nota muy importante, basiegaxor trae una ayuda brutal, y muchos ejemplos, USENLOS!!!!!!



Una característica muy buena del Basiegaxorz, es que se puede incluir codigo ASM, por lo que en realidad se convierte en una herramienta muy potente incluso para programadores avanzados, pero claro, asm escapa a este tutorial, si alguien le interesa , contacten conmigo, que ASM es una materia que se me da bien, y hago un tutorial



Asumo que ya al menos han leido algun tutorial de basic basico XD , por si no es el caso, echenle un vistazo el tutorial de Basic generico del link de abajo. Al menos necesitan saber lo que es un “for” “if” “end if” …etc etc

http://cfievalladolid2.net/tecno/cyr_01/control/lengua_BASIC/index.htm


Dicho esto, es recomendable que lean el tutorial que hice de trabajo con tiles, al final del post



TUTORIAL 1: MANEJO DE TILES Y SPRITES


Si leyeron mi tutorial de Trabajo tiles en megadrive, sabran que tiene 64k de video, muestra 64 colores en pantalla, en 4 paletas de 15 colores cada una, y normalmente se usa la resolución de 320x224 (entre otras)


También ya sabrán (no lo sabes? Es porque no leistes mi post de tiles!! }:/ ) que un tile es un cuadrado de 8x8 pixeles, y que la megadrive tiene memoria para almacenar 1344 tiles simultaneos (43008 bytes de VRAM), pero los primeros 256 estan reservados para texto, lo que deja 1088 tiles utiles.

Si usamos como resolucion 320x224, tendremos que hacer esta cuenta

1 tile: 8x8=64 pixeles
Pantalla: 320*224=71680/64= 1120


O sea se necesitan 1120 tiles para llenar la pantalla completa.En teoria no cabria una pantalla completa en la memoria, pero si pasamos de usar texto, podemos utilizar los 256 tiles reservados, lo que nos daría suficiente para llenar una pantalla, y además nos sobrarían 224 tiles para usarlos sabiamente….


Como dije, el “tile” es la unidad mas pequeña en la que se puede trabajar.Asi que todo estara generado por tiles.O sea la pantalla de la megadrive, no tiene 320x224 pixeles, si no 40x28 tiles

Vamos como primer intento de programación a poner un sprite, y un simple fondo. Bajen el siguiente pack con todo listo para usar XD




Lo primero necesitamos un buen programa para editar graficos, aconsejo el Paint Shop pro, ya que tiene un manejo de paletas increíble. En linux, se puede usar con wine.

Y lo mas importante, un programa para transformar gráficos en tiles, y ese es el imagenesis

http://devster.monkeeh.com/sega/imagenesis/

NOTA: X es la resolución horizontal, Y es la vertical


Imagenesis es simple de usar FILE->OPEN abrimos una imagen BMP a 16 colores, en Mode, tenemos dos opciones

En dirección X luego a Y, se usa para fondos por ejemplo
En dirección Y luego a X, se usa para Sprites

Abrimos la imagen fondo.bmp ,seleccionamos 15 colores,4bpp,1plane,8x8 tile, y le damos a ACTIONS->Quantize now

Imagen

Fijarse en los datos en la parte de abajo, muy importantes, 11 colors in 320 tiles.

Si vamos a a ACTIONS->EXPORT TILE DATA, nos aparecerá una ventana, donde si seleccionamos en Format BASIC, nos mostrara un montón de datos en este formato

DATALONG $11121112 ‘Tile #0

Si se fijan bien, cada tile esta formado por 64 caracteres, que representan los píxeles, y los números son el color de cada píxel (de 0 a 15)


En ACTIONS-> Export pallette data, veremos un dato en este formato

DATAINT $0EA0, $0EA0,…etc

Esos son los 16 colores de la paleta del grafico en el que estamos trabajando.

Todos los datos de este grafico estan en el archivo 1.bex


A continuación, abrimos el basiegaxorz, y cargamos el archivo 1.bex, veriamos esto

Imagen

Noten que al final del archivo, esta cargado el grafico, ya transformado a codigo BASIC

Aquí tenemos varios comandos muy utiles

loadtiles suelo,320,256: Este comando, lo que hace es cargar los tiles en memoria de video, carga el tile “suelo”, que tiene 320 tiles (recuerden del imagenesis), en la posición 256 (como explique la MD tiene 1344 espacios para tiles)


Pallettes suelo_pal,0,0,16 : Aquí cargamos la paleta de colores, en este caso “suelo_pal”. El primer 0 es porque cargamos la paleta como la primera de las 4 (0,1,2,3), el segundo 0 es para indicarle cuantos colores cargamos, lo dejamos en 0 porque los queremos todos, y el 16 final es para indicar cuantos colores tiene nuestra paleta.

Drawtilesinc 256,0,20,40,8: Muestra los tiles en pantalla, el comando seria

Drawtilesinc 256, X, Y, ancho, alto

256 es la posición de tiles donde empezara a leer, X en 0 porque comenzamos en la parte izquierda, Y es 40 porque nuestra imagen tiene 8 de alto, y 40x8 es el tamaño de nuestra imagen.[/quote]

Ahora si le damos TOOLS->Compile, nos generara un archivo basic.bin, en la carpeta del basiegaxorz, que podremos cargar con cualquier emulador de megadrive

Imagen


Ahora, cerramos el archivo, 1.bex, y abrimos el 2.bex, aquí ya carge el sprite “sonic.bmp”, que anteriormente transforme en imagenesis


Veremos nuevos comandos utiles:

sonic=addsprite(4,3): Aquí cargamos el sprite del sonic, donde le indicamos que tiene 4 tiles de alto, por 3 de ancho.

propsprite sonic,576,1: Aquí cargamos el sprite en memoria de video, donde 576 es el numero de tile de comienzo (256+320 del fondo), y el 1 es la paleta de colores a usar.

x=160: Le asignamos un valor a x para el movesprite

movesprite sonic,x,303: Finalmente movemos el sprite al sitio de pantalla que mas nos guste, en este caso a las coordenadas X=32, Y=175 (ACLARACION: tanto X como Y comienzan en 128 no en 0)




Cerramos el 2.bex, y abrimos el 3.bex, aquí hay varios comandos basicos de acceso al joystick, y un loop para que el programa este siempre leyendo el pad.

Do / loop: Todo lo que este dentro del Do/Loop se repetira por el infinito, es un bucle

J=joypad(): Asignamos el pad a una variable J para que sea mas facil de leer


if j.2 then
movesprite sonic, x,303
x--
end if


Aquí básicamente, le decimos que si se presiona el botón 2 del pad, mover el sprite x lugares en negativo. Como el comando esta dentro de un bucle, x—hace que mientras se mantenga presionado el botón 2, se reste 1 a x



El resultado final, es el sonic de Master System en nuestra megadrive XD

Imagen


TUTORIAL 2: ARCHIVOS BINARIOS


En un proyecto pequeño, tener los graficos trasformados en formato BASIC, no es molestia. Pero a medida que nuestro proyecto crece, nos damos cuenta que un archivo de codigo, con 80 o 90 mil lineas, como que no es muy saludable…

Imagen

Aquí se aprecia, el codigo y el tile grafico, si se ve bien, es lo mismo uno que otro


Asi que para evitar este problema, se cargan los datos en formato binario.Aqui un paso a paso para exportar a binario en el Imagenesis

1) Cargamos la imagen (bmp a 16colores)
2) Actions -> Quantize Now
3) Actions -> Export tile data
4) En FORMAT, cambiamos el valor por BINARY, y presionamos Save Data
5) Guardamos el archivo resultante en la misma carpeta donde esta el codigo, y le damos una extencion que nos resulte facil de recordar, por ejemplo, del sprite del sonic

Para graficos: sonic.img Para paleta: Sonic.pal


Una vez salvado el grafico, en el BasiEgaXorz, solo tenemos que suplantar el codigo de Basic por un comando que carge el archivo binario

Sonic:
DATALONG $00000000 ' Tile #0
DATALONG $00000000
.... etc


Sonic:
datafile sonic.img,BIN


Dejo para descargar un ejemplo practico, del sonic tambien, donde se carga los graficos desde un archivo binario

http://theelf-megadev.com/Ejemplos/Ejemplo_carga_binarios.zip

Mi opinión es que lo mejor es cargar los escenarios como binario, y los sprites como codigo Basic.

En este ejemplo, ademas de cargar archivos binarios, puse varios ejemplos de animacion de sprites, para el siguiente tutorial


TUTORIAL 3: CARGA Y DESCARGA DE SPRITES + ANIMACION


Como habrán visto en la descarga “Ejemplo carga binarios”, aquí el Sonic, ya camina con una pequeña animación, y también esta animado cuando se acerca al borde.

http://theelf-megadev.com/Ejemplos/Ejemplo_carga_binarios.zip

Imagen


En este ejemplo, 5.bex, solo use comandos simples que ya habíamos visto en el tutorial numero 1.

El codigo de la intro...

Código: Seleccionar todo
 dedo=addsprite(4,3)

 loadtiles introtile,240,1
 loadtiles dedo,12,241
 pallettes intro_pal,0,0,16
 pallettes dedo_pal,1,0,16
 Drawtilesinc 1,10,8,20,12
 propsprite dedo,241,1
 
 while joypad()=0:

     sleep 10
     movesprite dedo,295,205
    sleep 10
    movesprite dedo,0,0
     wend
    
     waitpadup 0   

 FreeAllSprites
 sleep 10



Para el intro, use una imagen de sonic que se carga con loadtiles intro tile,240,1, y se muestra con Drawtilesinc 1,10,8,20,12.

El dedo es un sprite de 4x3 pixeles, que se carga dentro de un bucle while. Básicamente este bucle lo que dice es:

while joypad()=0: > mientras no se presione un boton
sleep 10 > espero un tiempo
movesprite dedo,295,205 > muestro el sprite del dedo
sleep 10 > espero un tiempo
movesprite dedo,0,0 > y lo oculto llevándolo fuera de pantalla
wend > cierro el bucle
FreeAllSprites > descargo todos los sprites de pantalla antes de cargar el juego


Veamos la animacion al caminar de sonic

Código: Seleccionar todo
If j.2 Then
     x=x-2
       If FrameCount < 10 Then
             pallettes sonic_r_pal,1,0,16
             propsprite sonic_l1,1197,1
             movesprite sonic_l1,x,y
        ElseIf FrameCount < 20 Then
            propsprite sonic_l2,1209,1
             movesprite sonic_l2,x,y
         ElseIf FrameCount < 30 Then
             propsprite sonic_l3,1221,1
            movesprite sonic_l3,x,y
        Else
            FrameCount = -1
        End If   
        FrameCount++

En la animación de caminar, del ejempo de arriba, se crea una variable Framecount que va de 0 a 30, y cada 10, carga un nuevo frame del sonic, y lo mueve 2 pixeles en la direccion que se presione en el joystick, un codigo muy simple.


TUTORIAL 4: MAPAS DE TILES

Bueno, como muchos de ustedes se darian cuenta, de la forma que estamos trabajando actualmente, poco mas de una pantalla se puede hacer, ya que se nos acaba la memoria de video de la megadrive.

Como sabrán, la vram de la megadrive puede almacenar 1343 tiles, y una pantalla de 320x224 nos ocupa 1120 tiles, dejando solo 223 para los sprites, y eso sin usar texto claro.

La solucion a este problema, son los mapas. Y que son? Pues en cada pantalla, existen multitud de tiles repetidos. Pues lo que se hace es hacer un mapa de la pantalla, donde se especifica en que lugar esta cada tile, y si es repetido o no.

De esta forma con pocos tiles, se puede generar una pantalla completa. Es muy recomendable leer a este punto si hay dudas, mi post de trabajo con tiles.

Para este ejemplo, hice una pantalla con 68 tiles. (saque los tiles de uno de mis juegos favoritos de NES, el Shaterhand)


Para generar el mapa, se hace en el imagenesis, abrimos el bmp con el fondo a optimizar

Imagen


MODE-> 15color,4bpp,OPTIMIZED
Luego ACTION-> Quantize Now
Y ahora veremos una nueva opcion, ACTION -> EXPORT TILE MAP


Podemos salvar el mapa tanto en binario como en codigo Basic, es lo mismo.

Esta vez lo hare todo en codigo Basic asi es mas facil de ver


[url]http://theelf-megadev.com/Ejemplos/7_Ejemplo_mapas.zip[/url]

El codigo es muy simple, y esta bien explicado creo



Dim Map(39,27) as Integer 'Creamos un mapa de 40x28 tiles

pallettes fondo_pal,0,0,16 'Cargamos la paleta
loadtiles fondo,67,1 'Y cargamos los 67 tiles



reload fondo_map 'Cargamos el mapa

For Y=0 to 27 'la imagen tiene 40x28 tiles, asi que cargamos todos los tiles, del Y=0 al 27
For X=0 to 39 'al X=0 a 39
readint Map(X,Y) 'Y leemos el mapa
Next X
Next Y

For Y=0 to 27
For X=0 to 39
DrawTile Map(X,Y)+pallette(0)+1,X,Y 'Y dibujamos una pantalla completa, leyendo el mapa,
Next X 'usando la paleta 0, y comenzando del tile 1
Next Y 'Siempre en direccion primero X luego Y


En este codigo lo que se hace es crear un mapa del tamaño de la pantalla, o sea 40x28 tiles.
Luego, se carga el mapa generado por el imagenesis, y se lee desde X=0 a X=39 y de Y=0 a Y=27
Una vez leido, se vuelca en la vram, usando el mapa como guia, usando el comando DrawTile

Asi que en ralidad lo que vemos es la pantalla de arriba, pero la realidad son los tiles de abajo

Imagen


TUTORIAL 5: SCROLL


En el tutorial anterior, vimos los mapas, algo muy util para poder cargar una pantalla sin ocupar toda la VRAM de la Megadrive.
Esta tecnica es la base de este tutorial, ya que sin ella, no podriamos cargar mas que una pantalla a la vez.

Lo primero es entender las limitaciones de hardware. El tamaño maximo de pantalla que permite gestionar la Megadrive es de 512x512 pixeles o 64x64 tiles.

La megadrive permite dos planos de scroll (A,B) y un tercer plano fijo, (Window) que no permite scroll.

Saviendo esto, ya podemos ir al codigo.

Aqui dejo dos ejemplos. En el primero se crean dos planos de scroll, uno fijo, y el otro movil.

- Primer ejemplo

Aqui cargo un plano de scroll fijo, con una imagen en primer plano, scroll A,tomada prestada del LB2, y un plano B de scroll movil, que es un escenario completo tambien del LB2

http://theelf-megadev.com/Ejemplos/Ejemplo_scroll_1.zip


Imagen



Imagen



Lo nuevo del codigo son los siguientes comandos

settextplane <-- Define el plano de scroll donde se dibujaran los textos

setgfxplane <-- Define el plano de scroll para los comandos que dibujen tiles (DrawTile, DrawTiles)
Este comando permite tres opciones, SCROLL_A/SCROLL_B/WINDOW. Que define en que planos se dibujaran los tiles.

setscrollplane <-- Define el plano de scroll actual. Puede ser el A,B,o Window


Por ultimo el comando que hace el scroll en si mismo, los comandos basicos son

scroll permite UP/DOWN/LEFT/RIGHT (arriba,abajo,izquierda,derecha) y la cantidad de pixeles del scroll.

scroll left,1 <---- mueve el plano seleccionado de scroll, 1 pixel a la izquierda
scroll down,4 <---- mueve el plano seleccionado de scroll, 4 pixel hacia abajo



TUTORIAL 6: AUDIO

Bueno, ya tenemos mas o menos definida la parte grafica, scroll, sprites, tiles... pero nos falta la sonora.

Vamos a ver como usar el YMH2612, para reproducir un WAV.

Aqui un ejemplo, que carga un archivo "Segapcm.bin" de un tamaño de 27000 bytes, y lo reproduce

http://theelf-megadev.com/Ejemplos/Ejemplo%20Audio.zip

El codigo

Código: Seleccionar todo
 'Gracias Mairtrus por el codigo y las explicaciones
 
 Const #PCMLongitude = 27000  'Definimos el largo en bytes del archivo 26,3 KB = 27.000 bytes



   
 do
  ink 2
  locate 1,1
  Print "Ejemplo de sonido PCM"
  Print " El archivo sega.pcm es un WAV sin los primeros 52bytes"
  Print ""
  Print ""
  print " presionar A para reproducir"
 
SonidoSega:
 if JoyPad(0).6 then   
          enable INTERRUPTVBLANK
          on VBLANK gosub PlaySega 'llamamos a la funcion PlaySega
    end if      
 loop






PlaySEGA:
    while peek(&hA04000).7  ' espera hasta que se desocupe
    wend
    poke &hA04000,&h2B      ' en el registro $2B, si el bit más alto es 0, el*
    while peek(&hA04000).7  ' espera hasta que se desocupe
    wend
    poke &hA04001,&h80      '*canal 6 es un FM más, caso contrario es para DAC

    while peek(&hA04000).7  ' espera hasta que se desocupe
    wend
    poke &hA04002,&hB6      ' el registro $B4 es para poner en el parlante izquierdo, derecho o ambos (Pannig en ingles, Balance en español). Que sea $B6 es porque, al ser el canal FM 6 el canal 2 de la segunda parte, $B4+2=$B6
    while peek(&hA04000).7  'wait for busy
    wend
    poke &hA04003,&hC0      ' Al poner los 2 bits más altos, pone el canal izquierdo y derecho simultaneamente, o sea lo hace stereo (pone 80 o 40 y vas a ver se escucha por un solo parlante)
     
    while peek(&hA04000).7  ' espera hasta que se desocupe
    wend
    poke &hA04000,&h2A      ' esta es la direccion donde se escribe el dato de 8bits que conforma el sample PCM

    reload PCMData
    for i=1 to #PCMLongitude
        while peek(&hA04000).7  ' espera hasta que se desocupe
        wend
        read Nota
        poke &hA04001, Nota ' Y aqui escribe el dato que carga desde la muestra
        halt
    next i
 gosub SonidoSega


PCMData:
 DATAFILE segapcm.bin,BIN



Basicamente el archivo segapcm.bin, es un archivo wav de 8bits, 14khz, sin los primeros 52bytes, editado en un editor hexadecimal.

Si quieren reproducir archivos wav sin modificar, solo hay que cambiar una linea

Código: Seleccionar todo
reload PCMData


Por esta

reload PCMData,52


De esta forma, se carga el archivo desde el byte 52

Deveran experimentar diferentes tiempos de espera para diferentes calidades de wav (8khz,11khz,22khz..etc)




TUTORIAL 7: EJEMPLO DE JUEGO Y COLISIONES



Muy buenas, en este tutorial, posteare el codigo de un juego muy basico, el Pong

Este codigo, aunque no este totalmente finalizado, es un buen ejemplo de las siguientes cosas

1 - Un juego "terminado", hasta ahora solo teniamos ejemplos sueltos
2 - Colisiones



Imagen


En el zip, va el codigo + binario

http://akihabara-online.com/Megadrive/Ejemplos/pong.zip



Voy a explicar un poco lo de las colisiones, ya que es un tema que no he tocado hasta ahora


Código: Seleccionar todo
IF (X =< 142) then
           IF Y=> SPRITEPOSY(PLAYER1)-8 and  Y=<SPRITEPOSY(PLAYER1)+24 then      
                SENTIDOX--
              end if             
        ENDIF


Si se fijan en esa porcion de codigo, basicamente lo que sucede aqui es:

** NOTA: Le llamo paleta a nuestro sprite

IF (X =< 142) then - Este codigo detecta que la posicion X de la pelota es igual o inferior a 142, o sea, que esta a la misma altura que la paleta

Solo con este codigo, podriamos hacer "colision" lo que pasa es que la pelota chocaria con todo la posicion X, o sea, como si fuera un muro, y lo que queremos es que detecte, la posicion de la paleta para poder saber, si lo hicimos bien, o por el contrario fallamos


IF Y=> SPRITEPOSY(PLAYER1)-8 and Y=<SPRITEPOSY(PLAYER1)+24

Como la paleta mide 32pixeles de alto (4 tiles) una vez que la bola esta en la posicion X correcta, comprobaremos la posicion Y de la paleta

Para eso, simplemente comprobamos la posicion inicial de la paleta, y le sumamos los 32 pixeles, y sabemos la final. O sea, que si en ese momento el punto Y mas alto de la paleta es 100, sabemos que el Y mas bajo es 68

O sea, que entre X 142 y Y 68 a 100 tenemos colision


Creo que es lo unico a reseñar del codigo, lo demas, es facil de entender, si se leen la guia






TUTORIAL EXTRA: TRABAJO CON TILES



Buenas, hace ya como un mes me entretuve bastante leyendo un post sobre si era posible un port de un juego de arcade/neogeo por ejemplo a MD/SNES

En este caso estuve trabajando para Megadrive

Estuve muy ocupado este ultimo mes, pero como este fin de semana dispuse de algun tiempo, decidi al menos, intentar algunos graficos.

Seguro muchos ya saven que son los tiles, y como se trabajan.

Para los que no, los tiles son pequeñas unidades graficas, de 8x8 pixeles, en el que se divide la pantalla. Agarrando la calculadora, la megadrive tiene 320x224 pixeles de resolucion asi que:

1 Tile : 8x8 pixeles = 64 pixeles
Pantalla: 320x224 = 71680 pixeles
Cantidad de tiles necesarios para llenar la pantalla: 71680/64 = 1120 tiles


Basicamente, si queremos poner un fondo de pantalla en MD, simplemente agarramos cualquier imagen, redimensionamos a 320x224, le adaptamos los colores a la paleta de megadrive, y listo. Ocupamos los 1120 tiles.

Pero que pasa si, necesitamos mostrar, por ejemplo, un escenario de un juego de peleas? porque el escenario, es mas amplio que 320x224, basicamente, son como poco 2 pantallas de largo.

Ahi es donde viene el calvario, ya que hay que lograr que aunque el fondo sea mucho mas grande que la pantalla, no ocupe mas de los 1120 tiles.

Luego viene otro problema, querremos poner, los personajes, las barras de energia..etc

Asi que hice calculos: La megadrive puede guardar en memoria un maximo de 1344 tiles (43008 bytes de VRAM), pero los tiles 0 a 255 son reservados para fuentes (texto). Con un truco se pueden usar tiles a partir del numero 128. Asi que nos quedarian un total de 1216 tiles utiles.

Otro punto a tomar en cuenta son los colores. Megadrive puede mostrar en pantalla 64 colores, pero con condiciones. No se puede usar una paleta de 64 colores, si no 4 de 16 colores.Pero en cada paleta hay un color de fondo y otro de transparencia, lo que nos resta 8 colores, que nos da un total de 56 colores utiles. En caso de los sprites se puede usar el color de fondo.

Como muestro en el siguiente grafico, un personaje ocupan un promedio de unos 90-100 tiles cada uno
, y se podria decir que un maximo de 110 tiles.

Imagen

Asi que habria que reservar 220 tiles para personajes, y al menos 30 mas para varios (barras, animaciones..etc)

Asi que de los 1216 tiles utiles, solo nos quedan 1216 - 250 = 966 tiles


Volvemos al fondo. Tenemos el fondo de NeoGeo "Fire at Wadamoya" de 640x224 pixeles.

Fondo: 640x224 = 143360 pixeles / 64 = 2240 tiles
Maximo disponible: 966 tiles


O sea, que solo disponemos de un 43% de tiles para trabajar, o lo que es lo mismo, tenemos que descartar un 67% de la imagen original.
Eso sin contar que la neogeo tiene 256 colores, mientras que nosotros solo disponemos de 14 para el plano de fondo.

Aqui viene el trabajo sucio :) con photoshop, paint shop pro..etc, hay que abrir la imagen original del fondo del NeoGeo, dividir en una cuadricula de 8x8 y buscar patrones, tiles similares, sitios muertos...

Que significa esto? pues, que basicamente si dos trozos de 8x8 (1 tile) son iguales, solo ocupan el espacio de 1 tile, si varios tile tienen un mismo color, ocupan solo 1..etc

Por ejemplo:

Imagen
Trozo de 40x24 pixeles, 15 tiles original de neogeo

Imagen
El mismo trozo, modificado, usando solo 6 tiles. Se aprecia la perdida de informacion, pero al menos se mantiene la "escencia" original

Asi que despues de 6 o 8 horas de trabajo, logre que este escenario de NeoGeo de 2240 tiles, quedara en solo 960 tiles!! XD menuda paliza me pege buscando patrones, copiando pegando trozos...
Y lo mas dificil, adaptar los 256 colores del NeoGeo a 14 colores. Lo peor fue que dentro de la paleta de la MD no encontre todos los colores necesarios, solo encontre 11. Asi que tuve que trabajar la imagen, y reducirla a 11 colores.

Imagen
Original NeoGeo, 256 colores, 2240 tiles

Imagen
Modificado para Megadrive, 11 colores, 960 tiles

Aqui dejo la rom de megadrive, si alguien quiere provarla en un emulador. Solo muestra el fondo, y presionando A y izquierda+derecha se hace el scroll



Espero que esta informacion sea util a alguien, o al menos, alguien le encuentre algun interes!! XD






Espero les sea util esta primera guia, y estoy ansioso por oir los comentarios/criticas, y posibles proyectos!! estoy preparando varias guias mas!
Avatar de Usuario
theelf
Site Admin
 
Mensajes: 2487
Registrado: Jue Oct 20, 2011 8:17 pm

Re: [TUTORIAL] Programacion Megadrive - Basico

Notapor REHome » Lun May 25, 2015 3:14 pm

Hola:

Muy buen tutorial básico. Seguimos con lo básico.

¿Vas a seguir haciendo mini tutoriales?

Da igual cualquier apartado o tema.

Quiero lograr hacer sistema de menús, por ejemplo, el indicado abajo.
Imagen

Otro tipo de menú.
Imagen

Se muestra una carátula de juegos. Cuando escojas un juego, pasa a la pantalla del juego, como ejemplo, no ponemos demoentos juegos dentro, sino una pantalla en negro que diga con mensaje de texto, están el el juego 1, por poner un ejemplo.

Si es posible hacerlo, es bueno que haga este tutorial, ya que tengo un proyecto en mente con la electrónica para hacer un cartucho y poner varios juegos dentro. He hecho algo que puedes ver por aquí.

Ver esquema 6 juegos más el menú principal.
Imagen

Mientras, estoy otra vez leyendo el tutorial desde el principio para entender muchas cosas y ahcer pruebas. Por cierto, es el mejor tutorial que he visto para hacer juegos de MD. Buen trabajo. ;)

Saludos.
REHome
 
Mensajes: 12
Registrado: Dom May 24, 2015 8:32 pm

Re: [TUTORIAL] Programacion Megadrive - Basico

Notapor Fedx » Lun Jul 23, 2018 1:44 am

Muy buen tutorial!!! Algo de colision con plataformas??
Fedx
 
Mensajes: 2
Registrado: Sab Jul 14, 2018 10:30 pm

Re: [TUTORIAL] Programacion Megadrive - Basico

Notapor REHome » Lun Jul 23, 2018 11:53 pm

Que haga más tutoriales para pulir. ;)
REHome
 
Mensajes: 12
Registrado: Dom May 24, 2015 8:32 pm

Re: [TUTORIAL] Programacion Megadrive - Basico

Notapor Fedx » Mar Jul 24, 2018 4:24 am

REHome escribió:Que haga más tutoriales para pulir. ;)
siii..xfaa. Algo se puede aportar desde la ignorancia.jaja. Yo venia metiendole al Visual Batari Basic (Atari 2600) y hace poco agarre este. Siempre dije... hacer al menos un Pong al para mis consolas mimadas (Atari y Sega)
Fedx
 
Mensajes: 2
Registrado: Sab Jul 14, 2018 10:30 pm

Re: [TUTORIAL] Programacion Megadrive - Basico

Notapor REHome » Mar Jul 24, 2018 1:55 pm

El autor tendrá que tener tiempo y ganas de recordad el pasado. ;)
REHome
 
Mensajes: 12
Registrado: Dom May 24, 2015 8:32 pm

Re: [TUTORIAL] Programacion Megadrive - Basico

Notapor theelf » Dom Jul 29, 2018 4:06 pm

REHome escribió:Hola:



Lo siento, llevo un tiempo muy desconectado

Has logrado el menu?

krikzz tenia una aplicacion para hacer multiroms si mal no recuerdo

https://krikzz.com/pub/support/everdrive-md/v3/tools/
Avatar de Usuario
theelf
Site Admin
 
Mensajes: 2487
Registrado: Jue Oct 20, 2011 8:17 pm


Volver a Tutoriales varios

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron