Soed escribió:Estoy pensando en hacerme una herramienta yo mismo... alguien sabe los valores RGB de los 512 colores de Megadrive?
http://en.wikipedia.org/wiki/List_of_mo ... #9-bit_RGB
Supongo que puedo fiarme de esto...
¿Alguien se anima a trabajar en el proyecto? D:
bertobp escribió:Yo me animaria pero con el Tile Studio.
Porque no aprovechar el tremendo potencial de ese editor? Es abierto y permite crear scripts de salida, hay documentacion...
Por ejemplo hay un script para crear tileset y mapas para GBA, en ASM o en C. Yo lo usé y es una maravilla.
Manveru Ainu escribió:Suena muy bien. Me he bajado el programa y el pdf de ayuda, a ver cuando le echo un ojo. Espero que no sea demasiado complicado, si fuera así se agradecería un tutorial de cómo usarlo para la Megadrive
, si alguien se lo curra y quiere hacer algún tutorial se le agradecería, pero por ahora lo dejo de lado.Manveru Ainu escribió:Yo le he echado un ojo y de momento no me he enterado de mucho, ni siquiera he sabido poner una paleta de 16 colores, si alguien se lo curra y quiere hacer algún tutorial se le agradecería, pero por ahora lo dejo de lado.
agppro escribió:Me imagino yo en los años 90 con todas estas herramientas gratuitas y programando un juego. Seguro q el kit de desarrollo oficial era carisimo y solo grandes productoras podian permitirselo

pero el Oh Mummy quiero "clavarlo" en mi Megadrive estas navidades!!!!
daniopolis escribió:este tutorial mola no?
felicito al administrador
void myJoyHandler ( u16 joy, u16 changed, u16 state )
{
if (joy == JOY_1)
{
if ( state & BUTTON_START )
{
VDP_drawText("START button 1", 5, 13);
}
else if ( changed & BUTTON_START )
{
VDP_drawText("START button 0", 5, 13);
}
if ( state & BUTTON_MODE )
{
VDP_drawText("MODE button 1", 5, 14);
}
else if ( changed & BUTTON_MODE )
{
VDP_drawText("MODE button 0", 5, 14);
}
}
}void myJoyHandler ( u16 joy, u16 changed, u16 state )
{
if (joy == JOY_1)
{
unsigned int esElBoton ( u16 _b ) { if ( _b & changed ) return 1; return 0; }
unsigned int estaPulsado ( u16 _b ) { if ( _b & state ) return 1; return 0; }
if ( esElBoton ( BUTTON_START ) )
if ( estaPulsado ( BUTTON_START ) )
{
VDP_drawText("START button 1", 5, 13);
}
else
{
VDP_drawText("START button 0", 5, 13);
}
if ( esElBoton ( BUTTON_MODE ) )
if ( estaPulsado ( BUTTON_MODE ) )
{
VDP_drawText("MODE button 1", 5, 14);
}
else
{
VDP_drawText("MODE button 0", 5, 14);
}
}
}

Es eso, para quien le resulte mas claro pues evidentemente para quien le sea todo lo contrario seria una tonteria xDDD y le sera mas practico decantarse por la otra forma.bertobp escribió:En un buen aporte, porque seguro que a mas de uno le viene bien
jrll escribió:Buenas, estoy preparando mi portatil con Windows 7 para seguir los pasos de este tutorial.
Lo malo es que siempre me tiene que pasar algo que me impida llevarlo a cabo. A ver si me podeis ayudar.
Tengo instalado el code::blocks 10.05 y llegado al paso de crear una nueva configuración de compilador a partir de una copia del compilador GNU GCC básico, no me sale la pantalla que está en el tutorial. Me aparece una con menos opciones y no sé que hacer ahí.
Es ésta:

jebiman escribió:¡Hola!
Gran hilo que os habéis preparado como tutorial para "enrear" en la Megadrive
Me muero de ganas de ir a casa a probar todo esto. Prlf.![]()
![]()
#include <genesis.h>
void myJoyHandler( u16, u16, u16);
int main( )
{
JOY_init(); // Inicializacion joystick
JOY_setSupport(PORT_1, JOY_SUPPORT_6BTN); // En el puerto 1 se controlara un pad de 6 botones
JOY_setEventHandler( &myJoyHandler ); // Puntero a la clase que controlara el evento disparado
// por cada cambio de estado en algun boton/direccion del pad
while(1)
{
VDP_waitVSync(); // Sincronizacion vertical para evitar parpadeo/flickering
}
return (0);
}
// joy : Puede tomar valor JOY_1 o JOY_2
// changed: Siempre tomara el valor del boton/direccion que haya disparado el evento (pulsado o no)
// state : En caso de ser una pulsacion tomara el mismo valor que changed, caso contrario 0
// La comparacion que se efectua con el operador "&" es sobre bits (binaria)
void myJoyHandler ( u16 joy, u16 changed, u16 state )
{
if (joy == JOY_1)
{
unsigned int esElBoton ( u16 _b ) { if ( _b & changed ) return 1; return 0; }
unsigned int estaPulsado ( u16 _b ) { if ( _b & state ) return 1; return 0; }
if ( esElBoton ( BUTTON_START ) )
if ( estaPulsado ( BUTTON_START ) )
{
VDP_drawText("START button 1", 5, 13);
}
else
{
VDP_drawText("START button 0", 5, 13);
}
if ( esElBoton ( BUTTON_MODE ) )
if ( estaPulsado ( BUTTON_MODE ) )
{
VDP_drawText("MODE button 1", 5, 14);
}
else
{
VDP_drawText("MODE button 0", 5, 14);
}
}
}#include <genesis.h>
const u32 tile[8]=
{
0x00111100,
0x01144110,
0x11244211,
0x11244211,
0x11222211,
0x11222211,
0x01122110,
0x00111100
};
int main( )
{
// Puntero al array/tile o al primero del listado de tiles
// Indice VRAM a partir del cual comenzar a almacenar
// Cuantos tiles son a guardar, 1 o mas
// Modo de acceso directo a memoria o no/0
VDP_loadTileData ( ( const u32 * )tile, 1, 1, 0 );
// Plano A o B, indice en VRAM, coordenadas 5 horizontal 5 vertical
// Al no haber especificado se usa por defecto la paleta 0, escala de grises
VDP_setTileMap ( APLAN, 1, 5, 5 );
// La misma forma de dibujar pero ayudandose de una macro con varios parametros
// Plano, prioridad (0 la mas baja), vflip (1si/0no), hflip, indice VRAM
VDP_setTileMap ( BPLAN, TILE_ATTR_FULL ( PAL2, 0, 1, 0, 1 ), 6, 5 );
while(1)
{
VDP_waitVSync();
}
return (0);
}#include <genesis.h>
const u32 tile[8]=
{
0x00111100,
0x01144110,
0x11244211,
0x11244211,
0x11222211,
0x11222211,
0x01122110,
0x00111100
};
int main( )
{
// Puntero al array/tile o al primero del listado de tiles
// Indice VRAM a partir del cual comenzar a almacenar
// Cuantos tiles son a guardar, 1 o mas
// Modo de acceso directo a memoria o no/0
VDP_loadTileData ( ( const u32 * )tile, 1, 1, 0 );
// Comprobacion del funcionamiento del parametro prioridad
// Se usa todo el rato el mismo tile en el mismo plano pero con diferente prioridad
// Parametros de la macro: Plano, prioridad (0 la mas baja), vflip, hflip, indice VRAM
VDP_setTileMap ( APLAN, TILE_ATTR_FULL ( PAL1, 1, 0, 0, 1 ), 7, 7 ); // [ 1 ] Tile paleta tonos rojos
VDP_setTileMap ( BPLAN, TILE_ATTR_FULL ( PAL2, 0, 0, 0, 1 ), 7, 7 ); // [ 2 ] ..verdes
VDP_setTileMap ( APLAN, TILE_ATTR_FULL ( PAL1, 0, 0, 0, 1 ), 8, 7 ); // [ 3 ] ..rojos
VDP_setTileMap ( BPLAN, TILE_ATTR_FULL ( PAL2, 1, 0, 0, 1 ), 8, 7 ); // [ 4 ] ..verdes
// El tile 1 y 2 estan en la misma coordenada (7,7) pero 1 tiene priridad mayor con respecto a 2
// y por eso al ejecutar la rom solo se vera el tile en tonos rojos. En cambio en el caso de 3 y 4
// el que tiene mayor prioridad es 4 y se vera el tile en tonos verdes
while(1)
{
VDP_waitVSync();
}
return (0);
}#include <genesis.h>
const u32 tile[8]=
{
0x00111100,
0x01144110,
0x11244211,
0x11244211,
0x11222211,
0x11222211,
0x01122110,
0x00111100
};
int main( )
{
// Puntero al array/tile o al primero del listado de tiles
// Indice VRAM a partir del cual comenzar a almacenar
// Cuantos tiles son a guardar, 1 o mas
// Modo de acceso directo a memoria o no/0
VDP_loadTileData ( ( const u32 * )tile, 1, 1, 0 );
// Se rellenara un area de 8 tile horizontales por 4 verticales comenzando
// desde las coordenadas 12,12
VDP_fillTileMapRect(BPLAN, TILE_ATTR_FULL(PAL2, 0, 0, 0, 1), 12, 12, 8, 4);
while(1)
{
VDP_waitVSync();
}
return (0);
}#include <genesis.h>
// Crear carpeta "res" en el raiz del proyecto y meter ahi el grafico/bmp a cargar
#include "moon.h"
int main( )
{
u16 w = moon[0]; // Ancho del tile
u16 h = moon[1]; // Alto del tile
// Sustituir la paleta precargada en PAL1 por la del grafico
VDP_setPalette ( PAL1, &moon[2] );
// Puntero a la informacion del tile/s, indice VRAM, ancho y alto en tiles a guardar
// El ultimo parametro es obligatorio y se ha de indicar el ancho total del bitmap porque igual
// se podria querer cargar solo parte del bitmap que no entero
VDP_loadBMPTileData ( ( u32* ) &moon[18], 2, w / 8, h / 8, w/8 );
// Plano, macro con atributos (paleta, prioridad, vflip, hflip, ind.VRAM), coord.23-6
// Los dos ultimos parametros son el numero de tiles a dibujar en horizontal y en vertical
VDP_fillTileMapRectInc ( BPLAN, TILE_ATTR_FULL ( PAL1, 0, 0, 0, 2 ), 23, 6, w / 8, h / 8 );
while(1)
{
VDP_waitVSync();
}
return (0);
}#include <genesis.h>
// Los graficos se pueden poner en la carpeta que se quiera (en el raiz) pero hay que crear un archivo
// resource.rc en el que la primera y ultima lineas se dejen en blanco o con ";" y en las otras
// se especifiquen los graficos a convertir tal que: BITMAP luna "data/luna.bmp" 0
// Estructura a usar para tratar las imagenes convertidas
struct genresTiles
{
u16 *pal; // puntero a los datos de la paleta
u32 *tiles; // puntero a los datos de los tiles
u16 width; // ancho en tiles
u16 height; // alto en tiles
u16 compressedSize; // 0 en esta demo, mas proximamente
};
extern struct genresTiles luna;
int main( )
{
// Sustituir la paleta precargada por la del grafico
VDP_setPalette ( PAL2, luna.pal );
// Informacion de los tiles del bitmap, indice del primer tile, tiles a cargar, DMA o no
VDP_loadTileData ( luna.tiles, 100, luna.width*luna.height, 0 );
// Plano, macro con atributos (paleta, prioridad, vflip, hflip, ind.VRAM), coord.23-6
// Los dos ultimos parametros son el numero de tiles a dibujar en horizontal y en vertical
VDP_fillTileMapRectInc ( BPLAN, TILE_ATTR_FULL ( PAL2, 0, 0, 0, 100 ), 23, 12, luna.width, luna.height );
while(1)
{
VDP_waitVSync();
}
return (0);
}KFR escribió:Edit: Por cierto, dudita y es que probando con mis propios graficos me va todo de perlas menos el metodo de sgdk mediante la carpeta res. El .h ha de aparecer solo o hay algun paso previo?
Edit 2: Solucionado...ha sido borrar el contenido de out y volver a compilar y listo...me lo apunto pero raro raro xD
pocket_lucho escribió:Lo siento tio, pero para sprites tienen que ser secuenciales.
Manveru Ainu escribió:pocket_lucho escribió:Lo siento tio, pero para sprites tienen que ser secuenciales.
Oks gracias pocket_lucho, sacaré el código del imagenesis sin optimizar. Por cierto, ¿sabes por qué el Imagénesis "clarea" las imágenes? Todas las tablas de sprites que meto (sin pasar los 16 colores) me transforma los colores en los mismos pero un poco más claros, como si encendiese una luz sobre los sprites...
wave escribió:Manveru Ainu escribió:Oks gracias pocket_lucho, sacaré el código del imagenesis sin optimizar. Por cierto, ¿sabes por qué el Imagénesis "clarea" las imágenes? Todas las tablas de sprites que meto (sin pasar los 16 colores) me transforma los colores en los mismos pero un poco más claros, como si encendiese una luz sobre los sprites...
Probablemente sea al usar la paleta de la megadrive.
* Simplified memory set/copy methods :
- 'Fastxxx' methods are now deprecated as basic generic methods are now optimized.
- 'memcpy' is now the only memory copy method.
* Added Z80 VGM driver (thanks to Sigflup which originally wrote it and to kubilus1 which improved it).
* Added SRAM support (thanks to Chilly Willy)
* Added preliminary support for ROM > 4MB (you can at least compile them now).
* Improved support for waitTick(..) and waitSubTick(..) calls during VBlank (still inaccurate).
* Added methods to get/set scrolling mode :
- VDP_getHorizontalScrollingMode()
- VDP_getVerticalScrollingMode()
- VDP_setScrollingMode(u16 hscroll, u16 vscroll)
- VDP_setHorizontalScroll(u16 plan, u16 value)
- VDP_setHorizontalScrollTile(u16 plan, u16 tile, u16* values, u16 len)
- VDP_setHorizontalScrollLine(u16 plan, u16 line, u16* values, u16 len)
- VDP_setVerticalScroll(u16 plan, u16 value)
- VDP_setVerticalScrollTile(u16 plan, u16 tile, u16* values, u16 len)
* Added methods to set/fill tile by index :
- VDP_clearTileMapRectByIndex(u16 plan, u16 ind, u16 num, u8 use_dma)
- VDP_fillTileMapRectIncByIndex(u16 plan, u16 basetile, u16 ind, u16 num)
- VDP_fillTileMapRectByIndex(u16 plan, u16 tile, u16 ind, u16 num)
- VDP_setTileMapByIndex(u16 plan, u16 tile, u16 ind)
- VDP_setTileMapRectByIndex(u16 plan, const u16 *data, u16 ind, u16 num, u8 use_dma)
- VDP_setTileMapRectExByIndex(u16 plan, const u16 *data, u16 baseindex, u16 baseflags, u16 ind, u16 num)
* Improved boot code so it should now init correctly on real hardware.
* Fixed Z80 driver uploading which may fails on real hardware in some condition.
* Modified 'sound' sample to add VGM play example.
* Minors fixes, improvements and cleanup.
* Some refactoring.
* Fixed a stupid bug in deprecated memory functions.
* Added Bitmap structure for easier bitmap manipulation (created from .bmp resources).
* Modified Plan A & Plan B location in VRAM.
* Added methods to modify Plan A, Plan B, Window, Sprites list and H Scroll table location in VRAM.
Note that doing that you may have troubles with SGDK methods which use hardwired locations.
* VDP_setSpritesDirect(..) method so you can now send a SpriteDef array buffer directly to the VDP.
* Handle a new resource type : WAVPCM (.wavpcm)
The file is transformed to adpcm data and can be played directly through the 2 channels ADPCM driver.
Note that WAV sample rate should be at least equals to 22050 Hz.
* Fixed a bug in bintos tool.
* New wavtoraw tool, source is provided.
* Added tools sources.
pocket_lucho escribió:Pues que yo sepa no, vamos, yo me estoy haciendo una![]()
Son mapas de 256x256 hasta 512x512 y sus combinaciones (256x512 etc.)
#include <genesis.h>
int main()
{
VDP_drawText("Hola Mundo!", 10, 13);
return (0);
}
nolddor escribió:Buenas acabo de empezar con tu manual, quiero ir investigando poco a poco nada más empezar me surgen un par de dudas...#include <genesis.h>
int main()
{
VDP_drawText("Hola Mundo!", 10, 13);
return (0);
}
Hay algun sitio donde ver que hace y que argumentos necesita cada funcion?? por ejemplo
VDP_drawText No se como poner una ñ por ejemplo ni se que valores puede tomar el segundo tercer argumento es decir va desde 0 hasta 99 hasta 192 ?? nose si me explico que significan esos numero y que limite tienen???
Printing on screen is a VDP task so you need to call VDP_drawText(<your_text>, <x>, <y>).
Remember, x and y are in tile unit, not pixel unit with 1 tile = 8 pixels.