Configurando el motor - greenwebsevilla/Next_MS_Engine GitHub Wiki
Este capítulo va a ser denso, pero es el corazón del Next_MS_Engine. Por lo tanto, pilla un café, té o coca-cola y siéntate tranquilo a leerlo.
Las opciones que te da el motor vienen configuradas en el fichero "config.bas" que se encuentra dentro de "/dev/my/". Ábrelo en VSC que vamos a explicar cada una de las opciones que lleva.
¿Cómo funciona el fichero de configuración?
Básicamente, el fichero es una lista de #defines (MACROS) los cuales pueden indicar al motor:
-
Que active o desactive una característica: esto se consigue comentando o descomentando dicha macro. En ZX Basic, los comentarios se ponen empezando la línea con el signo ' (en la tecla ? a la derecha del 0 en teclados españoles). Por ejemplo, la macro #define PLAYER_CAN_FIRE activa el disparo del jugador, si tu juego lo va a usar.
-
Definir un valor fijo: por ejemplo, la macro #define BULLET_SPRITE 63 define el número del sprite que va a ser la bala del disparo, en este caso, el sprite 63 del spriteset del player.
-
Ambas cosas al mismo tiempo: por ejemplo, la macro #define PLAYER_GRAVITY 16, si no está comentada, activa la gravedad para el player (tiende a bajar hasta encontrar suelo) y además, el número 16 indica la aceleración que va a aplicar.
NOTA: Los valores de aceleración y velocidades en los parámetros del player están en una escala 6 bits desplazados a la izquierda (<<6), por tanto su valor real en la escala de píxeles en pantalla es 64 veces menor. Por ejemplo, esos 16 de gravedad equivalen a que el player sufre una aceleración de caída de 16/64 píxeles por frame. O sea, 0.25 px/frame.
Vamos a explicar cada uno de las macros por secciones:
General configuration
- ENABLE_SOUND: Si lo comentamos, el juego apagará todos los sonidos.
- FIX_MUSIC_60HZ: Hace que la música suena a la misma velocidad tanto en 50hz como en 60hz. Para esto hay que modificar un poco el fichero Nextlib.bas que trae Nextbuild dentro de la carpeta "scripts". Habría que añadir este código justo antes de la línea que dice "#ifndef NOAYFX", aproximadamente en la línea 3219:
#ifdef FIX_MUSIC_60HZ
asm
ld a, [_VarFrec]
cp 50
jr z, Playdo
ld a, [_contador_frecuencia60]
dec a
ld [_contador_frecuencia60],A
jr nz, Playdo
ld a,6
ld [_contador_frecuencia60],A
jr skipmusicplayer
Playdo:
end asm
#endif
- DEBUGGING: permite cambiar de nivel pulsando las teclas Z/X para ir un nivel atrás o adelante respectivamente.
- CUSTOM_PALETTE: activa el uso de paletas de colores personalizadas en lugar de la paleta por defecto. Para ello, hay que nombrar los ficheros de las nuevas paletas como sprites.pal y tiles.pal y guardarlos en /data/pal/
- SPRITES_TRANSPARENT_COLOR: define el color transparente de los spritesets.
- GLOBAL_TRANSPARENT_COLOR: define el color transparente del resto de capas de video (layer2, ULA...).
- REDEFINE_TEXT_X y REDEFINE_TEXT_Y: definen las coordenadas donde se imprimirán los textos cuando redefinimos las teclas en el menú. Así lo podrás ajustar mejor al diseño de tu pantalla de menú.
- Camera setting: CAM_LEFT_LIMIT, CAM_RIGHT_LIMIT, CAM_DOWN_LIMIT y CAM_UP_LIMIT definen el rectángulo dentro del cual la cámara (scroll) no sigue al player, solo lo seguirá una vez salga de él. Estos valores son respecto al origen de coordenadas de la pantalla (320x256).

Por defecto, en horizontal tanto el límite izquierdo como el derecho están en 152, para que el player esté centrado justo el centro de la pantalla cuando el scroll avance.
NOTA: por ahora las macros de los límites verticales no tienen efecto.
Levels configuration
RECUERDA: Para el motor, cada mapa es un nivel, por lo que aquí level = mapa.
- FIRST_LEVEL: define en que número de mapa comienza el juego.
- MAX_LEVELS: define el número total de mapas que tendrá el juego. Esto es importante en el caso de juegos que avanzan nivel a nivel y terminan cuando has superado todos. El motor entonces entenderá que has terminado el juego y mostrará la pantalla con el final del juego. Si no es tu caso, puedes controlar cuando acaba mediante código, pero tienes que indicar el número de mapas totales.
- LEVELS_TILESETS: aquí definiremos que tileset usará cada mapa en orden. Cada valor estará separado por una coma, y debería contener tantos valores como mapas tenga el juego. IMPORTANTE.
- LEVELS_ENEMIES: aquí definiremos que spriteset de enemigos usará cada mapa en orden. Cada valor estará separado por una coma, y debería contener tantos valores como mapas tenga el juego. IMPORTANTE.
- LEVELS_MUSICS: aquí definiremos que número de música usará cada mapa en orden. Cada valor estará separado por una coma, y debería contener tantos valores como mapas tenga el juego. IMPORTANTE.
- MAX_ENEMS: define al máximo número de sprites (aparte del player) que podrá contener cada mapa. Sumando enemigos, objetos, plataformas y otros sprites que hayamos podido crear en el mapa. Por defecto está en 40, el máximo podrían ser 63, pero no se recomienda aumentarlo y sí reducirlo si no vas a usar tantos sprites por mapa.
Tiles animados.
- TILANIMS: si no se comenta, se activarán las animaciones en los tiles de fondo en el juego.
- MAX_TILANIMS: define el número máximo de tiles que tienen animación en un mismo mapa. No se recomienda poner un número muy alto, porque podría ralentizar el juego. Con 30 creo que es más que suficiente.
- MAX_FRAMES_TILANIM: define el número de fotogramas que usa cada animación de los tiles. Puedes crear varias animaciones para diferentes tiles del mapa, pero cada una debe tener los mismos fotogramas y deben estar en orden en el tileset.
- TILANIM_FREQUENCY: define cada cuantos frames del juego se dibuja el siguiente fotograma de la animación del tile animado.
- LEVELS_FIRST_TILANIM: define el número del primer tile animado dentro del tileset. Recuerda ponerlos al final del mismo porque el motor considerará "tile animado" a todos los que estén después de este número. Este valor es editable para cada nivel mediante código, ya lo veremos en el capítulo correspondiente.
Timer configuration.
Esta sección viene directa del motor MK1. Un saludo Nathan!
- TIMER_ENABLE: activa el contador de temporizador en el juego, si quieres que haya límite de tiempo en él.
- TIMER_INITIAL: define cuantos segundos tiene al comienzo el temporizador.
- TIMER_LAPSE: define cada cuantos frames se resta un segundo. Por defecto 50 es un segundo, pero podríamos alargar este parámetro para que el reloj reste uno cada 2 segundos reales, por ejemplo.
- TIMER_START: si no se comenta, el reloj arrancará solo al comienzo del nivel. También podemos controlar el tiempo desde código mediante TIMER_ON / TIMER_OFF. Lo veremos en el capítulo de código custom.
- TIMER_AUTO_RESET: si no se comenta, el reloj vuelve al valor inicial al llegar a 0.
Miscelanea
- EXTRA_LIFE_SCORE: define cuantos puntos se necesitan obtener para ganar una vida extra (si usas el marcador de puntos, si no, no tiene efecto).
- SPIKES_KILL_VERTICAL_ONLY Si está activo, los tiles dañinos (pinchos) solo dañan si caemos encima o los golpeamos desde abajo. Si chocamos horizontalmente con ellos se comportarían como un bloque sólido y no dejarían pasar.
Player configuration.
-
PLAYER_SPRITE_16X32: si se descomenta, el player usará el tamaño de 16x32 píxeles en lugar de 16x16 (lo explicaremos en un capítulo específico para usar sprites de mayor tamaño).
-
MAX_FRAMES_PLAYER: define el número de fotogramas máximo que podrá usar el player en cada una de las animaciones (andando, saltando, muriendo, etc).
-
PLAYER_FLICKERS: activa el parpadeo de inmunidad cuando el jugador recibe daño.
-
FLICKERING_TIME: define el tiempo en frames que el jugador parpadea.
-
INIT_ENERGY: define los puntos de energía que tiene el jugador al comenzar la partida y cuando recoge una recarga.
-
INIT_LIVES: define el número de vidas que tiene el jugador al comenzar la partida.
-- Disparo
- PLAYER_CAN_FIRE: activa o desactiva el disparo del jugador.
- BULLET_SPRITE: define el numero del sprite que usarán las balas del jugador.
- MAX_BULLETS: define el número de balas que puede haber a la vez en pantalla. No se recomienda aumentarlas mucho.
-- Movimiento vertical
- PLAYER_GRAVITY: si no se comenta, se activa la gravedad en el player con la aceleración que indique el número. 16 = 0.25px/frame
- PLAYER_MAX_VY_FALLING: velocidad máxima del player cayendo. 256
- PLAYER_JUMPS: si no se comenta, el jugador podrá saltar pulsando la tecla definida.
- JUMP_POWER: define la velocidad hacia arriba con la que se impulsa el player al saltar.
- DAMAGE_BOUNCE_POWER: si se define, el jugador sufre un brinco con la velocidad indicada en el valor.
NOTA: juega con los valores de estos parámetros para personalizar el salto de tu personaje. Quizás no necesites que salte tanto o necesitas que salte aún más, quizás quieres una gravedad más suave y que el player flote más en el aire, o que caiga más rápido... Toquetea los valores y no dejes todo por defecto, para eso están.
-
ENABLE_UPDOWN_MOVE: si se activa, el jugador podrá desplazarse arriba y abajo además de izquierda y derecha. Si activas esto, seguramente deberías desactivar la gravedad y el salto. O no se... experimenta.
-
ENABLE_LADDERS: activa los tiles tipo 2 (escaleras).
-
LADDER_VY: define la velocidad vertical subiendo o bajando escaleras.
-
JUMP_POWER_ON_LADDER: igual que JUMP_POWER pero cuando el player está en una escalera.
-
FALL_OFF_LADDER: si se activa, el player caerá de la escalera si recibe daño.
-- Movimiento horizontal
- PLAYER_MAX_VX: define la velocidad máxima a la que puede desplazarse el player en horizontal.
- INERTIA: activa el efecto de inercia por el cual el personaje no frena en seco al dejar de pulsar una dirección ni tampoco se mueve a la velocidad máxima en cuanto empieza a andar, si no que tiene una aceleración progresiva.
- PLAYER_AX: define la aceleración del player al moverse, si está activa la inercia.
- PLAYER_RX: define el rozamiento (frenada) del player al detenerse, si está activa la inercia.
IMPORTANTE: si tienes activado ENABLE_UPDOWN_MOVE estos parámetros también se aplican al movimiento en el eje vertical.
-- Caja de colisiones
-- Colision con tiles del escenario
-
BOUNDING_BOX_LEFT_OFFSET: define cuantos píxeles más o menos queremos que crezca la caja de colisiones del player respecto al borde izquierdo del sprite de 16x16. Un valor negativo reducirá la caja por ese lado, uno positivo la agrandará.
-
BOUNDING_BOX_RIGHT_OFFSET: define cuantos píxeles más o menos queremos que crezca la caja de colisiones del player respecto al borde derecho del sprite de 16x16. Un valor negativo reducirá la caja por ese lado, uno positivo la agrandará.
-
BOUNDING_BOX_UP_OFFSET: define cuantos píxeles más o menos queremos que crezca la caja de colisiones del player respecto al borde superior del sprite de 16x16. Un valor negativo reducirá la caja por ese lado, uno positivo la agrandará.
-
BOUNDING_BOX_DOWN_OFFSET: define cuantos píxeles más o menos queremos que crezca la caja de colisiones del player respecto al borde inferior del sprite de 16x16. Un valor negativo reducirá la caja por ese lado, uno positivo la agrandará.
-- Colision con enemigos y disparos enemigos
-
SMALL_COLLISION_ENEM: si se activa, la colisión del player con los enemigos será más permisiva y no detectará una colisión al pixel.
-
SMALL_COLLISION_SHOTS: si se activa, la colisión del player con los proyectiles de los enemigos será más permisiva y no detectará una colisión al pixel.
-
- STOMP_ENEMIES: si se activa, el player puede dañar a los enemigos saltando sobre ellos.
Configuración de Enemigos, Plataformas y Objetos
- ENEMY_SPRITES_16X32: si se descomenta, los enemigos (u otros sprites creados) usarán el tamaño de 16x32 píxeles en lugar de 16x16 (lo explicaremos en un capítulo específico para usar sprites de mayor tamaño).
- MAX_SPRITES_ON_SCREEN: define el número máximo de sprites en pantalla además del player.
ATENCIÓN: no confundir con el número máximo de sprites del mapa (MAX_ENEMS), MAX_SPRITES_ON_SCREEN solo indica cuántos sprites podrán aparecer a la vez en el área visible del juego. Esto se hace para optimizar el rendimiento.
- MAX_FRAMES_ENEMIES: define el número de fotogramas máximo que podrán usar los enemigos en cada una de las animaciones (andando, saltando, muriendo, etc).
- DEFAULT_ENEM_FPS: cada cuantos frames cambias de fotograma las animaciones de los enemigos.
- RESPAWN_ENEMIES: si está activa, los enemigos se regeneran si la cámara sale y vuelve al punto donde murió el enemigo.
- ENEMY_DEATH_BOUNCE: si se activa, los enemigos dan un pequeño salto al morir.
- WALLS_STOP_ENEMIES: si se activa, las paredes detendrán a los enemigos que tengan definido ese comportamiento.
- ENABLE_PLATFORMS: si se activa, los enemigos tipo 49 serán plataformas móviles.
- ENABLE_OBJECTS: si se activa, los enemigos tipo 50 serán objetos recolectables.
- OBJECTS_GET_SOUND: define el sonido que se reproduce al coger un objeto (tipo 50).
-- Fantys
- FANTYS: activa los enemigos Fanty, que te persiguen por toda la pantalla.
- FANTYS_MAX_VEL: define la máxima velocidad a la que se mueven los fanty.
- FANTYS_ACELERACION: define la aceleración de los fanty.
-- Jumpers
- JUMPERS: activa los enemigos saltarines.
- ENEM_JUMP_POWER: define la velocidad hacia arriba con la que se impulsan en cada salto los saltarines.
-- Oscillators
-
OSCILLATORS: activa los enemigos oscilantes.
-
ENEMY_GRAVITY: define la gravedad para los enemigos saltarines y oscilantes.
-
ENEMY_MAX_VY: define la máxima velocidad vertical para los enemigos saltarines y oscilantes.
-- Disparos enemigos
- ENEMY_BULLETS: activa los proyectiles enemigos.
- MAX_ENEMY_BULLETS: define el máximo número de proyectiles enemigos en pantalla. No se recomienda aumentarlo mucho.
- ENEM_BULLET_ANIM: define que dos sprites del spriteset enemigo, separados por coma, se usarán para una pequeña animación de los proyectiles. Si no se quiere animar, repite el mismo número.
Hud configuration
- HUD_HEIGHT: define cuantas filas de tiles ocupa el marcador (hud) en altura. 1 tile tiene 16 píxeles de alto, por lo que se puede imprimir en 2 líneas diferentes de caracteres por cada fila que tenga el hud.
IMPORTANTE: el total de filas de la pantalla será de 12, por lo que por ahora, mientras no haya scroll vertical, tendrás que ajustar el alto de tus mapas a la altura restante que deje el hud libre para área de juego. Por ejemplo: si tu hud ocupa 2 filas de alto, los mapas deberían ser de 10 como máximo (12 - 2).
-
SHOW_SCORE: si se activa, muestra la puntuación impresa en el marcador.
-
SCORE_X: define la coordenada X (en caracteres de 8x8) donde se imprimirá la puntuación.
-
SCORE_Y: define la coordenada Y (en caracteres de 8x8) donde se imprimirá la puntuación.
-
SHOW_ENERGYBAR: si se activa, muestra la barra de energía impresa en el marcador.
-
ENERGYBAR_X: define la coordenada X (en caracteres de 8x8) donde se imprimirá la barra de energía.
-
ENERGYBAR_Y: define la coordenada Y (en caracteres de 8x8) donde se imprimirá la barra de energía.
-
SHOW_LIVES: si se activa, muestra el número de vidas impreso en el marcador.
-
LIVES_X: define la coordenada X (en caracteres de 8x8) donde se imprimirá el número de vidas.
-
LIVES_Y: define la coordenada Y (en caracteres de 8x8) donde se imprimirá el número de vidas.
-
SHOW_TIMER: si se activa, muestra el tiempo restante impreso en el marcador.
-
TIMER_X: define la coordenada X (en caracteres de 8x8) donde se imprimirá el tiempo.
-
TIMER_Y: define la coordenada Y (en caracteres de 8x8) donde se imprimirá el tiempo.
-
SHOW_OBJECTS: si se activa, muestra el número de objetos recolectados impreso en el marcador.
-
OBJECTS_X: define la coordenada X (en caracteres de 8x8) donde se imprimirá el número de objetos.
-
OBJECTS_Y: define la coordenada Y (en caracteres de 8x8) donde se imprimirá el número de objetos.
Music and sound settings.
Esta sección sirve para definir que música o sonido sonará en cada parte del juego que vienen ya hechas: por ejemplo música para el menú, game over, stage clear, etc. o sonidos para disparo, salto, dañar enemigo, etc.
Puedes cambiar estos valores por el número de canción que quieras.