Galaxy Wars para Commodore-16

Foro dedicado a la programación en todo tipo de sistemas clásicos.
dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Galaxy Wars para Commodore-16

Mensajepor dancresp » 06 Jun 2013, 10:57

doble_pantalla.gif
doble_pantalla.gif (12.65 KiB) Visto 8318 veces


EL JUEGO
Este videojuego arcade fue desarrollado por Universal y manufacturado por Taito en 1979.

El objetivo del juego consiste en destruir la flotilla de invasores que hay en la zona superior de la pantalla. Para ello controlamos una plataforma con un misil. Al disparar el misil debe esquivar los asteroides y los disparos enemigos e impactar en un invasor.

Controles:
Pulsa Z o X para mover la plataforma y el misil a izquierda o derecha.
Pulsa la barra espaciadora para disparar el misil.

Descargar el juego en formato ".D64":
GalaxyWars.rar
(2.44 KiB) Descargado 348 veces


BLOQUES
He dividido el listado en 11 bloques:

- Declaración de las matrices. Llamada a rutinas principales.
- Controlar nuestra plataforma o misil.
- Control de los invasores y asteroides.
- Control de los disparos enemigos.
- Detección de impacto del misil. Toca asteroide, invasor o disparo enemigo.
- Perder una vida.
- Pantalla de Presentación.
- Inicio de la partida.
- Rutinas varias.
- DATA con rutina en código máquina que duplica el juego de caracteres en otra posición.
- DATA con los gráficos del juego.


COMO FUNCIONA
Todo el programa ocupa 87 líneas.

A continuación indico el principio de las distintas partes del programa:

10 - Definimos las matrices del juego.
30 – Inicializamos el récord (R) y vamos a la rutina que redefine los gráficos.
50 – Vamos a la presentación del juego.
100 - Movemos la plataforma o misil en la dirección indicada.
130 - Si se ha disparado el misil (T=2) salta a 160.
140 – Si se pulsa el espacio disparamos el misil y borramos la plataforma.
160 – Borramos el misil y modificamos la posición vertical (Y).
170 – Si la punta del misil toca algo saltamos a 400.
180 – Ponemos el misil en la nueva posición.
200 – Movemos una de las 6 filas de enemigo o asteroides en la dirección correspondiente. (B=1: Derecha, B=-1:Izquierda).
210 – Imprimimos la fila del enemigo.
250 – Miramos si esta activa una de las 6 bombas enemigas.
260 – Si no lo está, miramos si en una posición de la pantalla hay un invasor para activar su disparo.
270 – Si el disparo toca la plataforma o misil salta a 500.
400 – Si la posición Y es mayor de 5 es que hemos impactado con un asteroide o disparo y salta a 500.
410 – Calculamos la posición del invasor destruido.
420 – Ponemos la explosión, suena un sonido y calculamos los puntos (50, 100 o 150).
430 – Borramos el invasor de la fila y restamos un invasor a los restantes (Q).
440 – Mostramos los puntos y hacemos una pausa (5500) y actualizamos el marcador.
500 – Ponemos una explosión en la posición del misil y reproducimos un sonido.
520 – Actualizamos el marcador de vidas.
550 – Si no hay más vidas finaliza la partida.
2000 – Pantalla de presentación del juego.
2050 – Al pulsar una tecla borramos la pantalla (5400) y se hace parpadear el marcador del jugador 1.
2500 – Montamos las tiras de los invasores.
2510 – Rutina que genera aleatoriamente las tiras de los asteroides. Más llenas en niveles avanzados.
2570 – Inicialización de las variables principales de la partida.
5000 – Inicio de rutina para redefinir el juego de caracteres. Aquí se baja el RAMTOP 1KB.
5010 – Se carga la rutina en ensamblador desde los DATA en memoria y se ejecuta.
5020 – Copiamos los DATA de los gráficos en la nueva posición y cambiamos los colores de pantalla.
5040 – Inicializamos la matriz de la altura de los distintos enemigos V().
5050 – Guardamos en una matriz los colores de cada tira C$().
5100 – Rutina que activa el juego de caracteres redefinido.
5200 – Activa el juego de caracteres original. El nuestro queda residente en memoria.
5300 – Activa los colores por defecto del C-16 cuando está en BASIC.
5400 – Rutina de borrado de pantalla.
5500 – Rutina de PAUSA. Valor en (J).
5600 – Muestra las 6 filas de enemigos en su posición y con el color correspondiente.
8000 – Valores DATA de la rutina en código máquina que duplica el juego de caracteres en otra posición de memoria.
9000 – Línea DATA con los gráficos del juego.


EL LISTADO
listado_doble.gif
listado_doble.gif (23.92 KiB) Visto 8318 veces


APUNTES FINALES
Llevaba tiempo dándole vueltas a programar este juego y ha sido ideal para mi primera incursión en la programación del C-16.

Por fin un equipo Commodore con un BASIC decente !!!

Principales descartes respecto al original:
- Esta versión es más ancha y menos alta ya que en el juego original la pantalla es vertical.
- Hay alguna fila de asteroides menos, debido al tamaño vertical.
- Durante el ascenso del misil podemos controlarlo horizontalmente, pero no controlamos la velocidad.
- Los invasores no aceleran cuando solo quedan un par.
- Los asteroides no descienden al llegar a los extremos.
- Las puntuaciones están limitas a 50, 100 y 150 puntos.
- No hay animaciones en los enemigos.

El primer problema ha consistido en poder redefinir los gráficos, ya que este sistema no lo permite desde el BASIC.

Por suerte tenía una rutina en unas fotocopias de una revista de C-16 y tras alguna ligera modificación la he podido usar sin problemas. La rutina se encarga de bajar el RAMTOP 1KB y copia los 128 caracteres del SET 1. A partir de aquí los podemos redefinir desde BASIC sin problema. Con un par de POKE podemos activar y desactivar este juego de caracteres alternativo.

El control de los enemigos es muy simple. Hay 6 tiras con los enemigos en su posición correspondiente. Las filas pares rotan a la izquierda y las impares a la derecha. Con LEFT$ y RIGHT$ muevo un carácter de un extremo al otro e imprimo la fila con el color correspondiente. Todo muy rápido y sencillo gracias al comando CHAR.

El bloque principal del programa ocupa solo 17 líneas. En cada pasada muevo una fila de enemigos y controlo un disparo enemigo. El contador es común en los dos casos (A).

Para ganar velocidad he prescindido de las animaciones de los enemigos. He optado por usar los gráficos intercalados.

En las colisiones solo reviso si la cabecera del misil toca algo, pero no la parte baja. Respecto a las bombas enemigas solo la activa revisa si toca algo. Esto hace que el juego sea más rápido pero se puede dar el caso que toquemos algo y no nos pase nada. Como el proceso es rápido, tiene su riesgo... y mejor no jugársela.

Para detectar las colisiones accedo directamente a la zona de memoria reservada al video. Hay 1 KB para los caracteres y otro para los atributos de color.


Respecto al equipo
Este es mi primer programa con el C-16 y la verdad es que la experiencia ha sido plenamente satisfactoria. Por fin he podido usar un equipo Commodore y programarlo con comodidad.

Tiene un buen BASIC con muchos comandos impensables en el VIC-20 y el C-64.

Temas tan engorrosos como poner algo en una posición concreta de la pantalla, reproducir un sonido o acceder a un joystick tiene sus propios comandos.

También hay comandos para acceder a la disquetera fácilmente. Ver el contenido de un disquete, copiar o borrar un fichero ya no supone ningún problema.

Las únicas pegas que le he encontrado es que el casete es muy lento, algo típico en los equipos Commodore, y que han tenido el detalle de cambiar los conectores del casete y los joystick. Así no ha sido necesario usar los comandos que nos permiten acceder a las palancas de control.

El equipo tiene poca memoria pero la verdad es que cunde bastante. Incluso permite el uso de gráficos en alta resolución en modo multicolor. Por ahora ignoro como se hace…

Pues nada más, solo me queda esperar que os guste.

Os invito a probarlo.

DSC_1103.jpg
DSC_1103.jpg (72.85 KiB) Visto 8318 veces

War_1.gif
War_1.gif (3 KiB) Visto 8318 veces

War_2.gif
War_2.gif (3.59 KiB) Visto 8318 veces

War_3.gif
War_3.gif (3.23 KiB) Visto 8318 veces

War_4.gif
War_4.gif (3.05 KiB) Visto 8318 veces

War_5.gif
War_5.gif (3.27 KiB) Visto 8318 veces

War_6.gif
War_6.gif (3.3 KiB) Visto 8318 veces
Última edición por dancresp el 13 Jun 2013, 09:24, editado 1 vez en total.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
Skuall
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 140
Registrado: 19 Jul 2010, 11:06
Gracias recibidas: 8 veces

Re: Galaxy Wars para Commodore-16

Mensajepor Skuall » 06 Jun 2013, 11:06

No tengo palabras =D>

jepalza

Re: Galaxy Wars para Commodore-16

Mensajepor jepalza » 06 Jun 2013, 18:24

W :shock: W (o lo que es lo mismo, ¡WOW!)

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: Galaxy Wars para Commodore-16

Mensajepor radastan » 06 Jun 2013, 18:47

Madre mía, lo he probado con el Yape para Windows x64 (una delicia) y va fluido el juego, una conversión genial.

No parece realizado en BASIC.
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

Avatar de Usuario
Joss
Atari 1040 STf
Atari 1040 STf
Mensajes: 930
Registrado: 17 Jul 2012, 20:07
Gracias dadas: 14 veces
Gracias recibidas: 2 veces

Re: Galaxy Wars para Commodore-16

Mensajepor Joss » 06 Jun 2013, 23:57

radastan escribió:No parece realizado en BASIC.

+1 :)

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: Galaxy Wars para Commodore-16

Mensajepor dancresp » 07 Jun 2013, 00:08

radastan escribió:Madre mía, lo he probado con el Yape para Windows x64 (una delicia) y va fluido el juego, una conversión genial.

No parece realizado en BASIC.

El BASIC tiene sus limitaciones pero se le puede sacar su juguillo... :tarzan:
Buscando la IP de la W.O.P.R.

Avatar de Usuario
Jaimen
Amiga 1200
Amiga 1200
Mensajes: 1656
Registrado: 17 Mar 2009, 13:39
Sistema Favorito: Amstrad CPC
primer_sistema: Amstrad CPC
Ubicación: Madrid
Gracias dadas: 159 veces
Gracias recibidas: 19 veces

Re: Galaxy Wars para Commodore-16

Mensajepor Jaimen » 07 Jun 2013, 07:45

Genial!!! :D :gamer:
Mi galeria de fotos en 500px.com

Avatar de Usuario
mentalthink
Amiga 2500
Amiga 2500
Mensajes: 2840
Registrado: 11 Abr 2010, 15:06
Gracias dadas: 45 veces
Gracias recibidas: 14 veces

Re: Galaxy Wars para Commodore-16

Mensajepor mentalthink » 07 Jun 2013, 10:04

Una preguntilla, porque la verdad me gustaría hacer cosillas para el commodore, y aunque supongo que pasar del ASM del Z80 al del 6250(creo que es l anomenclatura no?¿), no debe ser algo extremadamente complejo... En basic como ese juego que has hecho se podrían hacer juegos más elaborados graficamente?¿, es que en la página de C64 de lobo gris tiene unos ejemplos hechos en basic, y por ejemplo un Sprite que es enorme dándo vueltas no le cuesta absolutamente nada al C64...

también una preguntilla del basic de C64, va todo por pokes o es algo normal como el zx o el Amstrad, porque según tengo entendido en el Basic del C64 es un poco engorroso...

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: Galaxy Wars para Commodore-16

Mensajepor dancresp » 07 Jun 2013, 11:42

mentalthink escribió:Una preguntilla, porque la verdad me gustaría hacer cosillas para el commodore, y aunque supongo que pasar del ASM del Z80 al del 6250(creo que es l anomenclatura no?¿), no debe ser algo extremadamente complejo... En basic como ese juego que has hecho se podrían hacer juegos más elaborados graficamente?¿, es que en la página de C64 de lobo gris tiene unos ejemplos hechos en basic, y por ejemplo un Sprite que es enorme dándo vueltas no le cuesta absolutamente nada al C64...

también una preguntilla del basic de C64, va todo por pokes o es algo normal como el zx o el Amstrad, porque según tengo entendido en el Basic del C64 es un poco engorroso...

El BASIC del C64 es una asco ya que todo funciona a base de POKES, a parte de otras carencias muy básicas tipo "LOCATE", "ELSE", etc.

Lo que si que es cierto es que tiene la posibilidad de gestionar SPRITES por hardware, con lo que se pueden hacer cosas más complejas, al igual que pasa con los MSX. La diferencia es que con el MSX es muy simple y con el C64 vuelve a ser complejo porque otra vez se tiene que hacer todo a base de POKES.

Con los equipos Commodore tienes dos opciones:
- El C-16 y el Plus/4 tienen un BASIC muy mejorado y como puedes ver, fácilmente se pueden hacer cosas como el "Galaxy Wars" o el "Lunar Rescue". Encima es rápido.

- El Commodore 128 tiene lo bueno del C-16 más el hardware del C-64, con lo que puedes usar SPRITES de una forma mucho más sencilla.

Tu eliges.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
scooter
Amiga 1200
Amiga 1200
Mensajes: 1031
Registrado: 17 Jul 2012, 09:25
primer_sistema: C64
Ubicación: Alicante

Re: Galaxy Wars para Commodore-16

Mensajepor scooter » 07 Jun 2013, 20:52

El basic del c64 es el mismo que el del pet, con eso te lo digo todo


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados