Crazy Balloon para C-64

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

Crazy Balloon para C-64

Mensajepor dancresp » 16 Oct 2013, 13:56

cb_3.gif
cb_3.gif (5.51 KiB) Visto 4110 veces


EL JUEGO
Este videojuego arcade fue desarrollado por Taito en 1980.

En este juego de habilidad debemos controlar un globo desde un punto inicial a un punto final, evitando tocar los distintos obstáculos del laberinto. Obtenemos puntos en función del tiempo invertido en completar el recorrido.

Controles:
Utiliza el joystick en el puerto-2 para controlar el globo.
Pulsa el botón para iniciar la partida.

Descargar el juego en formato ".D64":
CrazyBalloon.zip
(3.15 KiB) Descargado 193 veces


BLOQUES
Se ha dividido el listado en 9 bloques:
- Declaración de las matrices. Llamada a rutinas principales.
- Control de nuestro globo: posición, animación y llegada a la meta. Descontar tiempo.
- Perder una vida / Fin juego.
- Pasar nivel y sumar puntos.
- Pantalla de presentación.
- Poner el laberinto en pantalla y posicionar el globo.
- Inicializar variables, matrices y SPRITES.
- Rutinas varias.
- DATA con los datos de los SPRITES, relación globo/cordel, posiciones de inicio y final del globo, y obstáculos extra.


COMO FUNCIONA
Todo el programa ocupa 109 líneas.

A continuación indico el principio de las distintas partes del programa:
10 - Definimos las matrices del juego.
50 – Llamada a la rutina (3000) que carga los SPRITES y inicializa variables y matrices.
80 – Vamos a la presentación del juego.
100 – Guardamos la variable TIME en F, descontamos el tiempo (T) y leemos el estado del joystick.
105 – Movemos el globo en función de la posición del joystick.
125 – Control de la animación del globo y cálculo de la posición del globo relativa al cordel.
150 – Controlamos que el globo haya llegado a la zona de la meta.
190 – Estabilizamos la velocidad del tiempo calculando el tiempo transcurrido desde la línea 100.
195 - Si los SPRITES no ha colisionado con nada vuelve a 100.
200 - Ponemos el color de los SPRITES a gris y reproducimos un sonido (5400)
205 - Se descuenta una vida y se borra del marcador.
250 - Final de partida. Se muestra un texto y se hace una pausa antes de volver a la presentación.
300 - Al pasar de nivel reproduce un sonido.
305 - Se incrementa el número de nivel (NN) y el de laberinto (N), volviendo a 1 si es mayor de 3.
310 - Se suman puntos en función del tiempo invertido y se muestran en el marcador.
2000 – Pantalla de presentación del juego.
2030 – Queda en espera hasta pulsar el botón del joystick del puerto 2.
2200 - Muestra la pantalla que indica el nivel y hace una pausa.
2500 – Rutina que se encarga de mostrar el laberinto en pantalla.
2550 - Si el nivel > 3 pone los obstáculos extra.
2600 - Posiciona el globo en la posición de inicio del nivel.
3000 - Cambia los colores de pantalla.
3005 - Carga los SPRITES desde las líneas DATA que empiezan en 9000.
3010 - Rellena de 0 los últimos 5 filas de cada SPRITE.
3015 - Inicializa variables que referencian a los POKE más usados.
3020 - Se guardan en la matriz B$ los distintos segmentos que forman los laberintos.
3040 - Cargamos distintas matrices: Posición globo, puntos de inicio/fin y obstáculos extra.
3060 - Inicializamos las posiciones del chip de sonido.
3100 - Inicializamos la matriz B$ con los datos de los 3 laberintos.
5000 - Rutina que muestra la pantalla de asteriscos con un espacio en el centro.
5050 - Rutina que colorea un asteriscos aleatorio de la pantalla.
5100 - Rutina de borrado de la pantalla.
5200 - Rutina LOCATE. CY=Fila, CX=Columna, T$=Texto.
5300 - Rutina USING para los marcadores. F=valor a mostrar.
5400 - Rutina de sonido. Reproduce 3 tipos de sonido. 1=Inicio, 2=Fin y 3=Pinchazo.
9000 - DATA con los datos de los SPRITES en formato de 16x24 pixels.
9500 - Posiciones del globo respecto el palo en función de la animación (A).
9510 - Posiciones Inicio horizontal/vertical y Final horizontal/vertical según el laberinto (N).
9600 - Posiciones de los obstáculos extra en función del nivel (NN) y laberinto (N).


EL LISTADO

Código: Seleccionar todo

10 DIMB$(9),L$(3),DX(7),DY(7),IX(3),IY(3),FX(3),FY(3),O$(9)
50 GOSUB3000
80 GOSUB2000

    ‘ Nudo principal de desarrollo
100 F=TI:T=T-1:K=PEEK(J):IFK=127THEN125
105 IF(KAND1)=1THENIFY<232THENY=Y+2
110 IF(KAND2)=2THENIFY>60THENY=Y-2
115 IF(KAND4)=4THENIFX<222THENX=X+2
120 IF(KAND8)=8THENIFX>44THENX=X-2
125 A=A+B:IFA=0ORA=6THENB=-B
130 POKEG,244+A:POKEH,X:POKEV,Y:POKEH+2,X+DX(A):POKEV+2,Y+DY(A)
150 IFABS(X-FX(N))<16THENIFABS(Y-FY(N))<16THEN300
190 IFTI<F+7THEN190
195 IFPEEK(C)=0THEN100

    ‘ Perder vida / Fin Juego
200 POKE53287,11:POKE53288,11:F=3:GOSUB5400
205 L=L-1:POKE1496+L,32:IFL=0THEN250
210 FORF=1TO900:NEXT:GOSUB 2200:GOTO100
250 CY=10:CX=6:T$="{space*18}":GOSUB5200:CY=12:GOSUB5200
255 CY=11:CX=6:T$="{white}{space*2}{cm +} GAME OVER {cm +}{space*2}":GOSUB5200:IFR<STHENR=S
260 FORF=1TO5000:NEXT:GOTO80

    ‘ Pasar nivel
300 F=1:GOSUB5400:FORF=1TO1000:NEXT
305 NN=NN+1:N=N+1:IFN>3THENN=1
310 IFT>0THENS=S+T*10+10:PRINT"{home}{down}";TAB(31);:F=S:GOSUB5300
315 GOSUB2200:GOTO100

     ‘ Presentación del juego
2000 POKE53269,0:PRINT"{cyan}{clear}";TAB(30);"{green}SCORE<1>":PRINTTAB(31);:F=S:GOSUB5300
2005 PRINT:PRINT TAB(30);"{yellow}HI-SCORE":PRINTTAB(31);:F=R:GOSUB5300
2010 PRINT"{down*5}";TAB(30);"{cyan}BALLOONS":PRINTTAB(31);"{white}-{red}QQQQ{white}-"
2015 CY=23:CX=30:T$="{red}@SCAINET{down}{left*8}SOFT, 13":GOSUB5200
2020 GOSUB5000:CY=10:CX=8:T$="{yellow}CRAZY BALLOON":GOSUB5200
2025 CY=13:CX=8:T$="{white}FIRE TO START":GOSUB5200
2030 GOSUB5050:IFPEEK(J)<>111THEN2025
2035 N=1:NN=1:L=4:S=0:PRINT"{home}{down}";TAB(31);"{white}000000{cyan}"
2200 POKE53269,0:GOSUB5100:GOSUB5000:CY=9:CX=8:T$="{yellow}LET'S ATTACK !":GOSUB5200
2205 CY=12:CX=11:T$="{cyan}PLAYER 1":GOSUB5200
2210 CY=15:T$="{white}LEVEL="+STR$(NN):GOSUB5200
2215 FORF=1TO80:GOSUB5050:NEXT:GOSUB5100

     ‘ Imprimir el laberinto y posicionar el globo
2500 PRINT"{home}{cyan}{space*2}";:POKE53269,0
2505 A$=L$(N):B=1
2510 FORF=1TOLEN(A$)
2515 C$=MID$(A$,F,1):IFC$>="A"THENPRINTLEFT$(B$(B),ASC(C$)-64);:GOTO2540
2520 IFC$>"0"THENPRINTB$(VAL(C$)+2);:B=1:GOTO2545
2525 IFC$="*"THEN2540
2530 IFC$="0"THENPRINT:PRINT"{space*2}";:B=1:GOTO2545
2540 B=B+1:IFB=3THENB=1
2545 NEXT
2550 IFNN<4THEN2600
2555 I=NN-3:IFI>9THENI=6+N
2560 FORF=NTOISTEP3
2565 FORI=1TOLEN(O$(F))STEP2:C$=MID$(O$(F),I,2)
2570 POKE1024+(ASC(LEFT$(C$,1))-65)*40+(ASC(RIGHT$(C$,1))-65+2),42:NEXTI,F
2600 X=IX(N):Y=IY(N):POKEH,X:POKEV,Y:POKE53287,2:POKE2040,247
2605 A=0:B=1:T=1000:POKEC,0
2610 POKEH+2,X+DX(3):POKEV+2,Y+DY(3):POKE53288,2:POKE2041,251:POKE53269,3
2690 F=2:GOSUB5400:RETURN

     ‘ Inicializar variables globales y cargar SPRITES
3000 POKE 53280,0:POKE53281,0:PRINT"{cyan}":POKE53269,0
3005 FORF=0TO7:D=15616+F*64:FORI=DTOD+47STEP3:READA,B,C:POKEI,A:POKEI+1,B
3010 POKEI+2,C:NEXT:FORI=D+48TOD+63:POKEI,0:NEXTI,F
3015 J=56320:G=2040:H=53248:V=53249:C=53279:R=0
3020 B$(1)="**************************":B$(2)="{space*26}"
3025 B$(3)="{red}{reverse on}{cm d}{reverse off}{space*5}{reverse on}{cm f}{reverse off}{cyan}":B$(4)="{red}{cm k}{space*5}{reverse on}{cm k}{reverse off}{cyan}"
3030 B$(5)="{red}{reverse on}{cm c}{reverse off}GOAL{cm i}{reverse on}{cm v}{reverse off}{cyan}":B$(6)="{green}{cm i}START{cm i}{cyan}":B$(7)="{red}{cm i}GOAL{reverse  on}{cm v}{reverse off}{cyan}"
3035 B$(8)="{green}{cm i}{cm o*6}{cyan}":B$(9)="{red}{reverse on}{cm i}{reverse off}{cm u*6}{cyan}"
3040 FORF=0TO6:READDY(F),DX(F):NEXT
3045 FORF=1TO3:READIX(F),IY(F),FX(F),FY(F):NEXT
3050 FORF=1TO9:READO$(F):NEXT
3055 Y$="{home}{down*25}"
3060 FORF=54272TO54295:POKEF,0:NEXT:POKE54296,15
3100 L$(1)="*HR0*JICD0*KDIB0*KDJA0*MAKA05ARA0FMAEA0FLAFA0CFAGBFA0AGCDDEB0"
3105 L$(1)=L$(1)+"AFECDEB0ADBDBFAEA0BCAFALA0BWA0AXA0AWB0AOBEC0AIIDC0AFMBD0"
3110 L$(1)=L$(1)+"AFBGJ0AQA40AY0DV0HR0NL"
3120 L$(2)="Z0EDICE0BHGFC0BHGGB0AJEIA0ALBJA0AXA0AEBLADA0AECIBEA0BDEFCEA0"
3125 L$(2)=L$(2)+"BDGCCEB0AELEC01BCAKB02AQA02AQA02AQA02AFACCDA02BDCADCB0"
3130 L$(2)=L$(2)+"3CDDFB0JEAIA04AQA0*XB0*VD0*LBFF0*KO"
3140 L$(3)="S40BGE0AIB0A0B0BDAIC60AECEL0AEM70AGF0CGC0DFB0DFA0EHA0EGCCA30"
3145 L$(3)=L$(3)+"CHDCH0BEGIC0BDHJB0AEHKA0AEADEIA0ALGDB0ANAIA0AXA0BVB0CDDLC0Z"
3200 RETURN

     ‘ RUTINAS VARIAS:    5000: Imprimir pantalla      5050: Colorear asteriscos
5100: Borrar pantalla      5200: Print AT
5300: Print Puntos      5400: Sonido

5000 PRINT"{home}{cyan}";:FORF=1TO8:PRINT"{space*2}";B$(1):NEXT
5005 FORF=1TO9:PRINT"{space*2}****";SPC(18);"****":NEXT
5010 FORF=1TO7:PRINT"{space*2}";B$(1):NEXT:PRINT"{space*2}";B$(1);:RETURN
5050 I=RND(1)*25*40+RND(1)*26+2:IFPEEK(1024+I)=42THENPOKE55296+I,RND(1)*3+3
5055 RETURN
5100 PRINT"{home}";:FORF=1TO24:PRINT"{space*2}";B$(2):NEXT:PRINT"{space*2}";B$(2);:RETURN
5200 PRINT"{home}":PRINTLEFT$(Y$,CY+1);TAB(CX);T$;"{cyan}";:RETURN
5300 PRINT"{white}";RIGHT$("00000"+MID$(STR$(F),2),6):RETURN
5400 IFF<3THENPOKE54277,100:POKE54278,100:POKE54276,17:GOTO5410
5405 POKE54277,80:POKE54278,100:POKE54276,129:GOTO5420
5410 IFF=1THENFORI=35TO55STEP5:POKE54273,I:POKE54272,I+10:FORFF=0TO50:NEXTFF,I
5415 IFF=2THENFORI=80TO60STEP-5:POKE54273,I:POKE54272,I+10:FORFF=0TO50:NEXTFF,I
5420 IFF=3THENPOKE54273,100:POKE54272,150:FORFF=1TO900:NEXT
5425 POKE54273,0:POKE54272,0:POKE54276,16:RETURN

     ‘ Datos de los SPRITES
9000 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,4,0,0,2,0,0
9005 DATA 1,0,0,0,128,0,0,64,0,0,32,0,0,16,0,0,28,0,0,28,0,0,28,0
9010 DATA 0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,1,0,0,1,0,0,0,128,0
9015 DATA 0,128,0,0,64,0,0,64,0,0,32,0,0,16,0,0,28,0,0,28,0,0,28,0
9020 DATA 0,0,0,0,0,0,0,64,0,0,64,0,0,64,0,0,64,0,0,32,0,0,32,0
9025 DATA 0,32,0,0,32,0,0,16,0,0,16,0,0,16,0,0,28,0,0,28,0,0,28,0
9030 DATA 0,0,0,0,8,0,0,8,0,0,8,0,0,8,0,0,8,0,0,8,0,0,8,0
9035 DATA 0,8,0,0,8,0,0,8,0,0,8,0,0,8,0,0,28,0,0,28,0,0,28,0
9040 DATA 0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,2,0,0,2,0
9045 DATA 0,2,0,0,2,0,0,4,0,0,4,0,0,4,0,0,28,0,0,28,0,0,28,0
9050 DATA 0,0,0,0,0,0,0,0,0,0,0,32,0,0,32,0,0,64,0,0,64,0,0,128
9055 DATA 0,0,128,0,1,0,0,1,0,0,2,0,0,4,0,0,28,0,0,28,0,0,28,0
9060 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,16,0,0,32
9065 DATA 0,0,64,0,0,128,0,1,0,0,2,0,0,4,0,0,28,0,0,28,0,0,28,0
9070 DATA 0,28,0,0,127,0,0,255,128,0,255,128,1,255,192,1,255,192,1,255,192
9075 DATA 0,255,128,0,255,128,0,127,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

     ‘ Posición globo/palo, inicial/final globo, obstaculos niveles > 3
9500 DATA -6,-10,-8,-8,-9,-3,-10,0,-9,3,-8,8,-6,10
9510 DATA 208,232,36,60,56,232,56,174,208,72,224,124
9600 DATA "TDKU","HCJPOK","TUVJ","OIJU","MTSUWR","SBSF"
9605 DATA "HPEKEG","LTGM","LIMJFF"


APUNTES FINALES
Si hay lenguajes de programación orientados a objetos, el C-64 tiene un lenguaje BASIC orientado a POKES.

Este detalle y el engorro de conocer tanta dirección ha sido el que ha hecho que nunca me decidiera a programar nada para él.

Por otro lado, sabía que su BASIC era muy limitado, pero al intentar programar una versión del “JawBreaker” descubrí que también es muy lento, y esto limita el desarrollo de cualquier juego que se quiera hacer, ya que, simplemente, no tira.

Así que me decidí ha hacer una versión de un juego que siempre me ha gustado y que en el fondo es muy simple. Solo hay que controlar el globo, y aprovechar la capacidad del hardware para detectar la colisión de un SPRITE con cualquier cosa que haya en pantalla.

Este es mi primer programa con el C-64 y la verdad es que el reto ha sido muy interesante, la experiencia bastante decepcionante y el resultado muy satisfactorio.

Es una lástima que tan buen hardware vaya acompañado de un BASIC tan cutre.

Principales descartes respecto al original:
- Como el juego original es vertical, he colocado los marcadores a la derecha.
- En la versión original los laberintos son 26x26 caracteres, pero aquí han quedado de 25x26. He optado por eliminar una fila poco significativa. Tampoco aparece el marco gris.
- No hay elementos móviles o scroll en varias direcciones. Me he limitado a poner obstáculos extra.
- No hay zonas con puntuación variable. Aquí solo se puntúa al finalizar el nivel, en función del tiempo.

Por el resto, creo que se ha respetado la filosofía general del juego al 100%.

comparativo.gif
comparativo.gif (42.07 KiB) Visto 4110 veces

Sorteando las complicaciones
Con un BASIC tan limitado, casi cualquier paso que das requiere documentarte a fondo para saber como hacerlo, lo que por norma general significa conocer distintas direcciones de memoria para definir, mover o ocultar los SPRITES, cambiar colores, leer el joystick, acceder a la memoria de video, gestionar el sonido, etc. Números y más números que hacen que sea un engorro hacer nada con él.

El C-64 permite usar hasta 8 SPRITES de 21x24 pixels, pero aquí necesitaba llegar a los 26x24, con lo que me he visto obligado a dividir el globo en dos partes. Un SPRITE es la esfera del globo, y después hay 7 SPRITES más con las distintas animaciones del cordel. Mediante las matrices DX y DY se en todo momento donde hay que situar el globo respecto al cordel.

Para reducir código y teniendo en cuenta que el globo está partido en dos partes, los 8 SPRITES que he definido son de 16x24 pixels, y las últimas 5 filas de cada uno las relleno con un bucle y así no ocupan espacio en los DATA.

Por otro lado, como no hay una posición fija donde colocar los SPRITES, he aprovechado los últimos bytes de los primeros 16KB ara alojarlos allí (a partir de 15616), teniendo en cuenta que el VIC “crea” una paginación mediante bloques de 64 bytes para identificarlos con un valor entre 0 y 255. Y como cada SPRITE ocupa 63 bytes, se “pierde” un byte en cada uno.
Si el programa fuera más largo, el código BASIC sobrescribiría los datos de los SPRITES y si se ejecutara el programa al definir los SPRITES se sobrescribiría el propio programa en BASIC.

El control del globo tiene que ser muy preciso, y me he decidido a controlarlo con el joystick en el puerto 2. En la posición de memoria 56320 hay el valor del estado.

El movimiento del globo se realiza de 2 en 2 pixels. Por un lado el movimiento es suave, pero por el otro puede dar la sensación que es lento. El balanceo del globo ayuda a evitar esta sensación.

Para detectar las colisiones he aprovechado las facilidades que ofrece el hardware, ya que cuando un SPRITE toca un pixel de cualquier cosa que hay en pantalla, la posición 53279 tiene un valor distinto de 0. En si, cada bit de esta posición de memoria corresponde a la colisión de uno de los 8 SPRITES que puede manejar. También permite controlar la colisión entre SPRITES pero para este juego no ha sido necesario.

Y para facilitarme las cosas, he desarrollado una serie de rutinas que me permiten hacer borrados de una parte de la pantalla, imprimir valores numéricos en una posición indicada rellenando con 0 a la izquierda, o imprimir un texto en una posición de la pantalla

Para mejorar el rendimiento he guardado el valor de ciertos POKE en variables, ya que el C-64 es más rápido accediendo al valor de una variable que reconociendo un valor directamente. Así, las principales direcciones que manipulo están almacenadas en variables.

Para conseguir una velocidad constante he usado la variable de sistema TIME. En 100 me guardo el valor en T y en 190 compruebo si se ha modificado el valor en 7, esperando en caso negativo.

Respecto al sonido, he estado haciendo pruebas y he visto que es muy potente, pero como soy un inútil y es el tema que menos me gusta me he limitado a cumplir el expediente. Simplemente algo suena. De todas formas, nuevamente el hecho de tenerlo que hacer todo a base de POKES no ayuda.

El laberinto
En el juego hay 3 laberintos distintos de 25x26 caracteres. A lo bruto esto supondría que cada pantalla ocupara 650 bytes más el código BASIC necesario para visualizarlos. Yo he optado por codificar los datos y he conseguido dejar las distintas pantallas en unos 100 bytes.

Teniendo en cuenta que la pantalla es, básicamente una sucesión de tiras de asteriscos o de espacios en blanco, y que cada fila tiene 26 columnas... que coincide con el número de letras, las pantallas se definen con una sucesión de letras, que sucesivamente y alternativamente imprimen asteriscos o espacios en blanco en función del valor de la letra.

Se ha seguido esta codificación:
- Las letras corresponden a un número. Así, la A=1, F=6, M=13, T=20 y Z=26, por ejemplo.
- “0” indica el final de la fila.
- “*” cambia el carácter a imprimir, ya que a veces una fila empieza con asteriscos y otras con espacios.
- “3” a “9” se usan para mostrar los distintos fragmentos de la salida y la meta. Están guardados en la matriz B$.

Así, con la sencilla rutina que va de las líneas 2500 a 2545 se imprime el laberinto correspondiente de una forma razonablemente rápida.

Y entre 2550 y 2570 hay otra sencilla rutina que se encarga, a partir del nivel 4, de poner obstáculos extra en el laberinto para complicar el recorrido. Hay un total de 4 variantes por laberinto, que son acumulativos. Esta información se guarda en la matriz O$ con un formato de grupos de 2 letras. Cada letra corresponde a la posición “Y” y “X” de cada asterisco extra.

A destacar que la zona de juego ocupa 34 caracteres, con dos columnas vacías a derecha, izquierda y entre el laberinto y los marcadores.

Conclusiones
El C-64 es uno de los sistemas más farragosos de programar debido a un BASIC muy simple, que obliga a usar los POKE para todo, incluso para cosas tan simples como cambiar el color de fondo de la pantalla. Si a esto le añadimos que es muy lento en general y tratando números en particular, el cóctel es decepcionante.

Así:
He programado el VIC-20, que tiene un mal BASIC y no permite usar SPRITES.
He programado el C-64, que tiene un mal BASIC y permite usar SPRITES.
He programado el C-16, que tiene un buen BASIC y no permite usar SPRITES.
Falta programar el C-128 que tiene un buen BASIC y permite usar SPRITES. A ver que sale...


Para terminar, decir que el programa ha sido desarrollado íntegramente en un C-64 real y un Datassette.
La imagen del disquete se ha pasado a tarjeta SD y al PC posteriormente mediante un interface 1541-III.
Posteriormente he usado el “PRG Starter” junto con el VICE para extraer el “.PRG”, y el “Commodore Program Studio” para obtener el listado.


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

Os invito a probarlo.

cb_1.gif
cb_1.gif (9.49 KiB) Visto 4110 veces

cb_2.gif
cb_2.gif (7.5 KiB) Visto 4110 veces

cb_3.gif
cb_3.gif (5.51 KiB) Visto 4110 veces

cb_4.gif
cb_4.gif (5.5 KiB) Visto 4110 veces

cb_5.gif
cb_5.gif (6.52 KiB) Visto 4110 veces

cb_6.gif
cb_6.gif (5.74 KiB) Visto 4110 veces

cb_7.gif
cb_7.gif (5.79 KiB) Visto 4110 veces

cb_8.gif
cb_8.gif (6.63 KiB) Visto 4110 veces

DSC_0797.jpg
DSC_0797.jpg (101.57 KiB) Visto 4110 veces
Buscando la IP de la W.O.P.R.

fantastic64
Atari 1040 STf
Atari 1040 STf
Mensajes: 720
Registrado: 13 Jun 2010, 17:18
Gracias dadas: 3 veces
Gracias recibidas: 4 veces

Re: Crazy Balloon para C-64

Mensajepor fantastic64 » 16 Oct 2013, 16:56

Un trabajo excelente. Me lo voy a guardar para leerlo tranquilamente. Casi que da para escribir un libro con todos los apuntes que sacas. Enhorabuena!!!

Una curiosidad. Veo que has usado 3 tipos de sonido para ambientar el juego pero ... como seria de complicado incluir alguna melodia de fondo?

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 2891
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 3 veces
Gracias recibidas: 30 veces
Contactar:

Re: Crazy Balloon para C-64

Mensajepor josepzin » 17 Oct 2013, 05:10

Me he tomado la libertad de reproducir esta entrada en CommodoreManía: http://retroinvaders.com/commodoremania ... 11641.html

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1392
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: Crazy Balloon para C-64

Mensajepor dancresp » 17 Oct 2013, 10:28

fantastic64 escribió:Un trabajo excelente. Me lo voy a guardar para leerlo tranquilamente. Casi que da para escribir un libro con todos los apuntes que sacas. Enhorabuena!!!

No me des ideas... :-ss

fantastic64 escribió:Una curiosidad. Veo que has usado 3 tipos de sonido para ambientar el juego pero ... como seria de complicado incluir alguna melodia de fondo?

El sonido es la parte que menos me gusta cuando programo. Me limito a cumplir el expediente y poco más.

De todas formas, se podría incluir una melodía durante el desarrollo del juego, pero teniendo en cuenta el rendimiento del BASIC de este sistema, ni me lo planteo. :roll:
Buscando la IP de la W.O.P.R.

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 2891
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 3 veces
Gracias recibidas: 30 veces
Contactar:

Re: Crazy Balloon para C-64

Mensajepor josepzin » 27 Ago 2016, 23:54

Otro juego que se corrompieron los archivos :O

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1392
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: Crazy Balloon para C-64

Mensajepor dancresp » 29 Ago 2016, 09:45

josepzin escribió:Otro juego que se corrompieron los archivos :O

Todas mis aportaciones en ZdP están en el mismo estado, y todo el trabajo que me llevó no ha servido de nada. Una lástima.

Como tampoco puedo subir imágenes, me temo que tendrás que entrar en RetroWiki para poder acceder al post sin problemas.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
josepzin
Amiga 2500
Amiga 2500
Mensajes: 2891
Registrado: 12 Ene 2009, 14:36
Sistema Favorito: C64
primer_sistema: ZX81
Ubicación: Carthagonova
Gracias dadas: 3 veces
Gracias recibidas: 30 veces
Contactar:

Re: Crazy Balloon para C-64

Mensajepor josepzin » 29 Ago 2016, 14:34

Ya lo he encontrado!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 664
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 12 veces
Gracias recibidas: 33 veces

Re: Crazy Balloon para C-64

Mensajepor Namek » 29 Ago 2016, 15:20

dancresp escribió:Todas mis aportaciones en ZdP están en el mismo estado, y todo el trabajo que me llevó no ha servido de nada. Una lástima.

Como tampoco puedo subir imágenes, me temo que tendrás que entrar en RetroWiki para poder acceder al post sin problemas.

Pero los listados si están correctos no? Es solo cuestión de pasarlos al emulador correspondiente... :mrgreen:


Volver a “Programación”

¿Quién está conectado?

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