› Foros › Retro y descatalogado › Consolas clásicas
#include <genesis.h>
int main()
{
VDP_drawText("Hello World!", 10, 13);
while(1){
VDP_waitVSync();
}
return (0);
}
JOY_init();
JOY_setEventHandler( &myJoyHandler );
danibus escribió:Gracias. Por cierto, callback, manejador... No hay otra traducción? Me chirrían y creo que en mis tiempos de C tenían otro nombre.
Interrupciones software? No me acuerdo
#include "sprite.h"
// CONSTANT VALUES ////////////////////////////////////////
#define SCREEN_WIDTH_TILES 40
#define SCREEEN_HEIGHT_TILES 28
#define SCENARIO_POS_X 0
#define SCENARIO_POS_Y 0
#define SCENARIO_WIDTH_TILES SCREEN_WIDTH_TILES
#define SCENARIO_HEIGHT_TILES SCREEEN_HEIGHT_TILES
#define SCENARIO_NUM_TILES SCENARIO_WIDTH_TILES * SCENARIO_HEIGHT_TILES
///////////////////////////////////////////////////////////
// MAIN
///////////////////////////////////////////////////////////
int main()
{
// Local data _________________________________________
// Scenario (planes)
u16 tilemap_buffer[SCENARIO_NUM_TILES];
u16 *shadowmap_tilemap = bga_priority_image.map->tilemap;
u16 *aplan_tilemap = &tilemap_buffer[0];
u16 numtiles = SCENARIO_NUM_TILES;
// Sprite stuff
u16 sprite_x, sprite_y, sprite_movx, sprite_movy;
Sprite* sprite;
// Process ____________________________________________
// Dump BGA tilemap into RAM
memcpyU16(aplan_tilemap, bga_image.map->tilemap, SCENARIO_NUM_TILES);
while(numtiles--)
{
if(*shadowmap_tilemap)
*aplan_tilemap |= TILE_ATTR_PRIORITY_MASK;
aplan_tilemap++;
shadowmap_tilemap++;
}
// Load tileset and tilemap for APLAN
VDP_loadTileSet(bga_image.tileset, bgb_image.tileset->numTile, DMA);
VDP_setTileMapDataRectEx(PLAN_A, &tilemap_buffer[0], 0/*u16 basetile*/,
SCENARIO_POS_X, SCENARIO_POS_Y,
SCENARIO_WIDTH_TILES, SCENARIO_HEIGHT_TILES, SCENARIO_WIDTH_TILES);
// Load scenario for BPLAN "as it is"
VDP_drawImage(PLAN_B, &bgb_image, SCENARIO_POS_X, SCENARIO_POS_Y);
// Init and load the sprite
SPR_init(16, 256, 256);
sprite_x = 0; sprite_y = 0; sprite_movx = 1; sprite_movy = 1;
sprite = SPR_addSprite(&star_sprite, sprite_x, sprite_y, TILE_ATTR(PAL3, TRUE, FALSE, FALSE));
// Set the palette taken from the scenario (BLAN image)
VDP_setPalette(PAL0, (u16*) bgb_image.palette->data);
// Set the palette from the sprite
VDP_setPalette(PAL3, (u16*) star_sprite.palette->data);
// Enable HL/S mode
VDP_setHilightShadow(1);
// LOOP
while(TRUE)
{
// Check border collisions (reverse mov)
if(sprite_x < 0 || sprite_x > 304) sprite_movx *= -1;
if(sprite_y < 0 || sprite_y > 196) sprite_movy *= -1;
sprite_x += sprite_movx; sprite_y += sprite_movy;
SPR_setPosition(sprite, sprite_x, sprite_y);
SPR_update();
VDP_waitVSync();
}
return 0;
}
/**********************************************************
DEMO "PROPSPRITES" METEOROLOG? - PART?ULAS AMBIENTE
**********************************************************/
//---------------------------------------------------------
// LIBRERIAS
//---------------------------------------------------------
#include <genesis.h>
//---------------------------------------------------------
// ASSETS
//---------------------------------------------------------
#include "sprite.h"
//---------------------------------------------------------
// CONSTANTES (DEFINES)
//---------------------------------------------------------
#define MAX_PARTICULAS 64
#define MAX_TIPOS_PARTICULAS 4
#define ANCHO_PANTALLA 320
#define ALTO_PANTALLA 224
#define ANCHO_PLANO 512
#define ALTO_PLANO 256
#define PARTICULA_TIPO_LLUVIA 0
#define PARTICULA_TIPO_ASCUA 1
#define PARTICULA_TIPO_NIEVE 2
#define PARTICULA_TIPO_HOJA 3
#define PARTICULA_TIPO_DEFAULT PARTICULA_TIPO_LLUVIA
#define TIEMPO_CAMBIO_EFECTO 80
//---------------------------------------------------------
// FUNCIONES
//---------------------------------------------------------
void creaParticulas(void);
void inicializaParticulas(u8);
void mueveParticulas(u8);
void mueveParticulasLluvia(u8);
void mueveParticulasAscua(u8);
void mueveParticulasNieve(u8);
void mueveParticulasHoja(u8);
//---------------------------------------------------------
// STRUCTS
//---------------------------------------------------------
struct t_particula
{
Sprite* sprite;
s16 posx, posy;
s16 movx, movy;
};
//---------------------------------------------------------
// DATA
//---------------------------------------------------------
struct t_particula particulas[MAX_PARTICULAS];
// Array de punteros a funciones
void (*funcionesMueveParticulas[MAX_TIPOS_PARTICULAS])(u8) =
{
mueveParticulasLluvia,
mueveParticulasAscua,
mueveParticulasNieve,
mueveParticulasHoja
};
// Buffer para textos en pantalla
char texto[8];
//---------------------------------------------------------
// MACROS
//---------------------------------------------------------
#define ESCRIBECIFRA(str, x, y); \
intToStr((str), texto, 1); \
BMP_clearText((x), (y), 7); \
BMP_drawText(texto, (x), (y));
///////////////////////////////////////////////////////////
// MAIN
///////////////////////////////////////////////////////////
int main()
{
// DATOS LOCALES ______________________________________
u8 tipo_particulas = PARTICULA_TIPO_LLUVIA;
u16 temporizador = 0;
// PROCESO (Inicialización y cargas) __________________
// init sprites engine
SPR_init(MAX_PARTICULAS, 256, 256);
// Cargamos la paleta
VDP_setPalette(PAL0, particles_sprite.palette->data);
// Creamos las partícuas
creaParticulas();
// BUCLE PRINCIPAL ____________________________________
while(1)
{
// Debug temporizador
ESCRIBECIFRA(temporizador, 1, 2);
mueveParticulas(tipo_particulas);
// Cuando el temporizador llegue al tiempo establecido
// se iniclializa un nuevo tipo de partícula
if(temporizador == TIEMPO_CAMBIO_EFECTO)
{
tipo_particulas++;
if(tipo_particulas == MAX_TIPOS_PARTICULAS)
tipo_particulas = PARTICULA_TIPO_LLUVIA;
temporizador = 0;
inicializaParticulas(tipo_particulas);
}
temporizador++;
SPR_update();
VDP_waitVSync();
}
return 0;
}
///////////////////////////////////////////////////////////
// FUNCIONES
///////////////////////////////////////////////////////////
//---------------------------------------------------------
// CREA PARTICULAS
//---------------------------------------------------------
void creaParticulas()
{
u8 i;
for(i = 0; i< MAX_PARTICULAS; i++)
{
// Creamos los sprites
particulas[i].sprite = SPR_addSprite(&particles_sprite, -32, -32, TILE_ATTR(PAL0, TRUE, FALSE, FALSE));
// Generamos posiciones aleatorias sobre el plano
particulas[i].posx = random()%ANCHO_PLANO;
particulas[i].posy = random()%ALTO_PLANO;
}
// Inicializamos con el tipo predeterminado
inicializaParticulas(PARTICULA_TIPO_DEFAULT);
}
//---------------------------------------------------------
// INICIALIZA PARTICULAS
//---------------------------------------------------------
void inicializaParticulas(u8 tipo)
{
u8 i;
s16 movx = 0, movy = 0;
// Variaciones del tipo de desplazamiento dependiendo
// del tipo de partícula que se vaya a mostrar
for(i = 0; i< MAX_PARTICULAS; i++)
{
switch(tipo)
{
case PARTICULA_TIPO_LLUVIA:
movx = 1 + random()%3;
movy = 1 + random()%4;
break;
case PARTICULA_TIPO_ASCUA:
movx = -1 - random()%3;
movy = -2 - random()%3;
break;
case PARTICULA_TIPO_NIEVE:
movx = -2 - random()%5;
movy = 2 - random()%2;
break;
case PARTICULA_TIPO_HOJA:
movx = -1 + random()%3;
movy = 1 + random()%3;
break;
}
particulas[i].movx = movx;
particulas[i].movy = movy;
SPR_setAnim(particulas[i].sprite, tipo);
}
// Debug TIPO particula
ESCRIBECIFRA(tipo, 1, 1);
}
//---------------------------------------------------------
// MUEVE PARTICULAS
//---------------------------------------------------------
void mueveParticulas(u8 tipo)
{
u8 i;
for(i = 0; i<MAX_PARTICULAS; i++)
{
funcionesMueveParticulas[tipo](i);
SPR_setPosition(particulas[i].sprite, particulas[i].posx, particulas[i].posy);
}
}
//---------------------------------------------------------
// MUEVE PARTICULAS LLUVIA
//---------------------------------------------------------
void mueveParticulasLluvia(u8 id)
{
particulas[id].posx += particulas[id].movx;
particulas[id].posy += particulas[id].movy;
}
//---------------------------------------------------------
// MUEVE PARTICULAS ASCUA
//---------------------------------------------------------
void mueveParticulasAscua(u8 id)
{
particulas[id].posx += particulas[id].movx + random()%2;
particulas[id].posy += particulas[id].movy + random()%3;
}
//---------------------------------------------------------
// MUEVE PARTICULAS NIEVE
//---------------------------------------------------------
void mueveParticulasNieve(u8 id)
{
particulas[id].posx += particulas[id].movx + random()%3 * (random()%2 * -1);
particulas[id].posy += particulas[id].movy;
}
//---------------------------------------------------------
// MUEVE PARTICULAS HOJA
//---------------------------------------------------------
void mueveParticulasHoja(u8 id)
{
particulas[id].posx += particulas[id].movx + random()%2;
particulas[id].posy += particulas[id].movy + random()%2;
}
#include <genesis.h>
void logButtonStatus(const char *str, const char *isPushed, u16 x, u16 y);
void inputHandler(u16 joy, u16 changed, u16 state) {
logInputButton(joy, BUTTON_START, changed, state, "S", 5, 12);
logInputButton(joy, BUTTON_A, changed, state, "A", 5, 14);
logInputButton(joy, BUTTON_B, changed, state, "B", 5, 15);
logInputButton(joy, BUTTON_C, changed, state, "C", 5, 16);
logInputButton(joy, BUTTON_X, changed, state, "X", 5, 18);
logInputButton(joy, BUTTON_Y, changed, state, "Y", 5, 19);
logInputButton(joy, BUTTON_Z, changed, state, "Z", 5, 20);
logInputButton(joy, BUTTON_UP, changed, state, "U", 5, 22);
logInputButton(joy, BUTTON_DOWN, changed, state, "D", 5, 23);
logInputButton(joy, BUTTON_LEFT, changed, state, "L", 5, 24);
logInputButton(joy, BUTTON_RIGHT, changed, state, "R", 5, 25);
}
void logInputButton(u16 joy, u16 button, u16 changed, u16 state, const char *str, u16 x, u16 y) {
if (joy == JOY_1) {
if (state & button) {
logButtonStatus(str, "1", x, y);
} else if (changed & button) {
logButtonStatus(str, "0", x, y);
}
}
}
void logButtonStatus(const char *str, const char *isPushed, u16 x, u16 y) {
char buf[strlen(str) + 3];
strcat(strcat(buf, str), isPushed);
VDP_drawText(buf, x, y);
}