Aprendiendo a programar Videjuegos en Basic

Más
7 meses 3 semanas antes - 7 meses 1 semana antes #6710 por pooky2
pooky2 Publicó: Aprendiendo a programar Videjuegos en Basic
Hola

Se que muchos de ustedes ya saben mucho de programación, pero creo que para los miembros del grupo que no son informáticos (de profesión, me refiero) puede que les interese aprender a programar en Basic.

Para ello vamos a utilizar el ZX Basic Compiler de nuestro compañero Boriel y lo que me gustaría es explicar conceptos para que puedan crear sus propios programas y correrlos en sus Spectrums, Halequines, ZX-UNOS, RaspBerrys Pi o lavadoras (creo que hay lavadoras con Z80).

Vamos a hacernos este videojuego, descárgalo y si te gusta, aprende a programarlo: Vaus

Las teclas son Z, X y espacio para soltar la pelota.

Voy a ir poniendo código que haga cosas sencillas y complicándolo para que entre todos aprendamos.

Un saludo.

Gracias, un saludo.
Última Edición: 7 meses 1 semana antes por pooky2.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 3 semanas antes - 7 meses 1 semana antes #6711 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
El primer paso que vamos a dar es descargar el compilador de Boriel, que lo teneis en:

www.boriel.com/wiki/en/index.php/ZX_BASIC:Archive

De ahí os descargais la versión que corresponda (Windows o Linux, Mac) y lo instalais. Yo manejo Windows así que os pondré ejemplos con ese Sistema Operativo.

Cuando comenceis a instalarlo es muy importante que recordeis donde se instala, porque es un compilador de línea, es decir necesitais saber donde está el compilador.

Yo os recomiendo que lo hagais en por ejemplo C:\ZXBC o algo así.

Una vez instalado, debéis crear una carpeta para crear vuestros archivos, por ejemplo C:\MisZXs

Lo siguiente que necesitáis es un editor de texto y un emulador de Spectrum, el editor puede ser el notepad, pero yo os recomiendo este:

notepad-plus-plus.org/download/v7.3.3.html

Y el emulador de Spectrum, el que querais, FUSE por ejemplo (enlace a la versión de Windows);

sourceforge.net/projects/fuse-emulator/f...2-setup.exe/download

Una vez instalado el Compilador (traduce el Basic a código máquina), el editor (o el notepad de toda la vida) y el emulador, deberéis abrir el editor y crear un archivo cc.bat (cuidado si usas el notepad que viene con Windows tiene la manía de crear un archivo cc.bat.txt y ese no se ejecuta) en la carpeta de vuestros juegos (por ejemplo C:\MisZXs).

El contenido del cc.bat es el siguiente:
"C:\ZXBC\zxb.exe" %1 -t -B -a

Que porqué tanto rollo, porque este archivo nos va a servir para llamar al compilador sin tener que acordarnos de los parámetros que hay que poner.

Ahora vamos a crear nuestro primer programa, el famoso Hello World, así que debéis crear un archivo hola.bas y ponerle el siguiente código:
print "Hola miembros de Canarias GO Retro"

Y compilarlo desde la linea de comandos, para ello abre un Explorador (tecla de Windows + E) y navega hasta tu carpeta C:\MisZXs, una vez veas los archivos (seguramente solo tendras los archivos cc.bat y hola.bas) situa el cursor del ratón en la parte en la que ves la ruta de la carpeta (o sea C:\MisZXs) y teclea ahí mismo CMD y ENTER para que se te abra una ventana de MS-DOS en esa carpeta (no importa que se borre la dirección al teclear CMD). Otra forma es ir a Ejecutar o a Inicio y teclear CMD (y ENTER) y a continuación CD C:\MisZXs y ENTER

Allí tecleareis
cc hola.bas

Y si todo va bien obtendréis en esa misma carpeta un archivo hola.tap el cual ya podréis cargar en el emulador (en el FUSE con F3) y ver vuestro primer programa.

QUE SUBIDON :lol: :lol: :lol: :lol: :lol: :lol: :lol:

P.D. Perdonad si la explicación parece para niños de parvulario pero NO QUIERO QUE NADIE SE QUEDE PIERDA :-D

Gracias, un saludo.
Última Edición: 7 meses 1 semana antes por pooky2.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 3 semanas antes #6712 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
Ahora vamos a poner algo con más chicha, no sirve de mucho pero ya hace algo:
NX = 50
NY = 10

WHILE INKEY$ <> "0"
    
	if INKEY$ = "z" then 
		
		CLS
		NX = NX - 5
		PLOT NX, NY: DRAW 20, 0

	end if 
	
	if INKEY$ = "x" then 

		CLS
		NX = NX + 5
		PLOT NX, NY: DRAW 20, 0

	end if 

END WHILE

Crearos un archivo paleta.bas y compiladlo con cc paleta.bas, lo cargáis en el emulador y NO PASA NADA.

Para que ocurra algo dadle a la tecla "z" o a la "x" y salis pulsando el cero.

Gracias, un saludo.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 3 semanas antes - 7 meses 1 semana antes #6713 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
Vamos a explicar varios conceptos claves.

Lo primero el concepto de variable o lo que representa la línea de código:
NX = 50

Imaginad la memoria como una gran matriz o una gran hoja de Excel, muchas casillas que normalmente se identifican con una doble dirección, es decir la primera casilla de todas es A1 y la siguiente a la derecha B1, la de debajo de esa B2 y así.

La memoria de los ordenadores es igual, un conjunto grande de casillas (bytes) que se acceden mediante un identificador pero en este caso no es A26 (por ejemplo) sino un solo numero que se suele representar en hexadecimal, por ejemplo 0xFF55AA.

Este último numero es horrible y pensad en lo complicado que sería almacenar algo ahí (el valor de la aceleración dentro de un programa de física de partículas) y luego tener que ir haciendo cálculos con ese valor, acordarse de esa dirección es horrible.

Por ello se inventó el concepto de variable, es decir darle un nombre, el que tu quieras a una dirección de memoria (y tu ni siquiera necesitas saber cual es, es el ordenador / compilador el que sabe su verdadera dirección, a tí te da igual) así que puedes hacer algo así como:
Aceleracion = 9.8

Para luego hacer:
print Aceleracion * (Aceleración / 2)

Y a tí te da igual donde esté esa Aceleración en memoria, de hecho cada vez que ejecutas el programa de nuevo, Aceleración estará en una posición de memoria diferente pero te da igual mientras esté en el mismo sitio durante toda la ejecución del programa (a veces puede incluso cambiar pero el ordenador se encarga de seguirle la pista)

Por cierto es importante dar un nombre adecuado a las Variables para que sean significativas, hay la mala costumbre de si quieres usar una variable temporal solo para llevar la cuenta de algo, ponerle i (de Indice), pero sería bueno ponerles nombre significativos como Aceleración , Velocidad o Numero_Repeticiones y no solo a, b, x o y.

Mi variable NX es abreviatura de Nave y X por la posición en el eje de las X

Gracias, un saludo.
Última Edición: 7 meses 1 semana antes por pooky2.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 3 semanas antes - 7 meses 1 semana antes #6714 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
Lo siguiente es el While y el INKEY$

INKEYS$ es una variable especial que contiene la última tecla pulsada. Es una variable pero termina en $ porque significa que es una cadena de caracteres (o al menos un carácter).

Es decir si queréis crear una variable Saludo que contenga Hola, debéis usar comillas y $, es decir:
Saludo$ = "Hola"

A diferencia de una variable que contenga números que no lleva comillas ni $
PI = 3.1415926

¿Y qué es el WHILE?

WHILE es un bucle, es decir engloba un código que se repetirá muchas veces. El código se repetirá MIENTRAS se CUMPLA la CONDICIÓN.

¿Y cual es la condición?, pues que la última tecla pulsada NO sea el carácter cero (representado como "0"). Cuidado si NO PONEMOS EL CERO entre comillas no sabríamos muy bien que pasaría pero es muy posible que tuvieramos que reiniciar la máquina para salir del programa ya que no hay una tecla 0, sino "0" igual que "P" o "p"

¿Qué que trozo se repite?, pues todo lo que esté entre WHILE y END WHILE así que por eso IDENTAMOS (lo ponemos un poquito más adentro con espacios o tabuladores) lo que está dentro de esta región de tal forma que visualmente vemos que este código se ejecuta dentro de una estructura que lo gobierna.
WHILE INKEY$ <> "0"
    
	Linea 1
	Linea 2
	......
	Linea n

END WHILE

Gracias, un saludo.
Última Edición: 7 meses 1 semana antes por pooky2.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 3 semanas antes - 7 meses 1 semana antes #6715 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
Ya por último explicamos que hay dentro del WHILE y de los IF

Los IFs sirven para hacer ALGO en el caso de que se cumpla una CONDICIÓN
if INKEY$ = "x" then 

		CLS
		NX = NX + 5
		PLOT NX, NY: DRAW 20, 0

	end if

En este caso está claro, hay que hacer lo que esté dentro del bloque IF..END IF siempre y cuando la última tecla pulsada sea la x ("x")

En ese caso borramos la pantalla (CLS) y dibujamos una raya. Los más puristas del lugar me van a matar porque no se debe borrar la pantalla (CLear Screen) sino poner los gráficos con SPRITES (ya veremos que es eso o que lo explique el que lo sepa) pero en este caso tan sencillo funciona.

Es decir borramos la pantalla y dibujamos una raya (o paleta, alguién dijo Arkanoid o Pong), lo que pasa es que esta raya la ponemos en diferentes posiciones y así parece que se mueve.

Lo que hacemos después de borrar la pantalla (y siempre habiendo pulsado la "x") es incrementar la posición de la Nave en horizontal (NX) cinco pixeles y pintarla de nuevo.
PLOT NX, NY: DRAW 20, 0

Para pintar una linea (una raya) hay que poner un punto origen y otro de destino o marcar un punto origen y decir cuanto se desplaza e final de la linea a partir de ahí.

Para situar "el cursor", es decir el comienzo de la linea ponemos PLOT NX, NY

NX varia dependiendo del numero de veces que pulsemos "z" o "x" y NY esta fija al valor 10 (un poco por encima del borde inferior de la pantalla). Recuerda que NX comienza valiendo 50.

Así que poniendo el comienzo de la línea en NX, 10 (pongo 10 porque no lo estamos modificando) dibuja una línea de 20 pixeles a la derecha y 0 para arriba, es decir una línea horizontal de 20 pixels de lancho con DRAW 20, 0.

Ambas lineas de código están separadas por dos puntos ":"
PLOT NX, NY: DRAW 20, 0

Gracias, un saludo.
Última Edición: 7 meses 1 semana antes por pooky2.
El siguiente usuario dijo gracias: airamcruz

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 3 semanas antes #6716 por airamcruz
airamcruz respondió el tema: Aprendiendo a programar Videjuegos en Basic
Increíble!!!!

Mi sueño de niño cada vez más cerca

Somos esclavos de nuestro pasado

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 2 semanas antes #6717 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
Vamos con las SUBRUTINAS

Las subrutinas son simplemente parte del código que realizan una función concreta y que por lo tanto podemos "encapsular" dentro de un bloque y ponerle un nombre. Por ejemplo PRINT es una subrutina de la propia ROM del Spectrum, imprime por pantalla y nosotros no nos tenemos que preocupar de cómo lo hace.

Lo que trata de hacer es simplificar el códgo, ¿os imaginas que nuestro juego tuviera este aspecto?
LimpiarPantalla()
InicializarLadrillos()
PintarMuro()
EstablecerMarco()

while inkey$ <> "0"
	
	VerificaMovimientosVaus()
	ComprobarMuro()
	MoverPelota()
	MoverVaus()

end while

Solo hay que rellenar lo que ha dentro de cada subrutina y ya tendríamos el juego.

La idea a partir de aquí es rellenar esos huecos, es decir que cada subrutina haga lo que indica su nombre.

Gracias, un saludo.
El siguiente usuario dijo gracias: txinto

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 2 semanas antes - 7 meses 1 semana antes #6718 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
Ya he terminado el código del juego, así que lo que va a continuación es el programa principal real, es decir la parte central que se encarga de concebir toda la lógica del juego y de ir llamando a las subrutinas y a las funciones.

Lo primero que vemos son lineas REM o Remember es decir un comentario, se pone REM al inicio de la línea o una comilla simple y eso es un comentario. Los comentarios se usan para ilustrar el código que hay a continuación.
REM -----------------------------------
REM Inicio del programa Principal
REM -----------------------------------

while inkey$ <> "0"
	
	NuevaPartida()

	while Vidas > 0
		
		ComprobarMuro()
		MoverPelota()
		MoverVaus()
		
		if PelotaPerdida() = 1 then
			VidaMenos()
			Reiniciar()
		end if
		
		if NLadrillos = 0 then
			SiguienteNivel()
		end if
	
	end while	

end while

Hay un par de Whiles que lo que hacen es controlar que el juego sigue hasta que pulsas el cero ("0") y que la partida continua mientras tengas vidas.

Fíjate en la variable INKEY$ que almacena la última tecla pulsada, recuerda que además se trata de una variable que contiene una cadena de caracteres ( o un simple carácter) porque es una variable que termina en $.

Gracias, un saludo.
Última Edición: 7 meses 1 semana antes por pooky2.
El siguiente usuario dijo gracias: txinto

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Más
7 meses 2 semanas antes - 7 meses 1 semana antes #6719 por pooky2
pooky2 respondió el tema: Aprendiendo a programar Videjuegos en Basic
Otro tema importante antes de ver qué código hay dentro de estas subrutinas es la parte de declaración de constantes. Son candidatos a definirse como constantes ciertos valores como el tamaño máximo de la pantalla, el numero máximo de vidas, las posiciones iniciales de los elemntos, el tamaño de los gráficos o el valor de PI.

En BASIC solo hay variables por lo que Boriel lo ha resuelto tomando prestada la nomenclatura del lenguaje de programación C, aqui teneis la parte de constantes del juego:
#define NLadrillosX 10
#define NLadrillosY 6
#define VelocidadVaus 10
#define RadioPelota 2
#define BLANCO 7
#define MaxX 255
#define MaxY 191
#define AnchoLadrillo 25
#define AltoLadrillo 8
#define InicioMuroX 5  
#define InicioMuroY 130
#define AnchoVaus 40
#define AltoVaus 3
#define PosVidas 20
#define PosPuntos 1
#define PosBase 23
Como veis siguen el patrón
#define nombre valor
Echadles un vistazo y tratad de averiguar para que sirve cada una ¿habríais definido alguna otra?

Gracias, un saludo.
Última Edición: 7 meses 1 semana antes por pooky2.
El siguiente usuario dijo gracias: txinto

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Tiempo de carga de la página: 0.479 segundos

© Canarias Go Retro, 2016