domingo, 17 de enero de 2010

PROGRAMAR VIDEOJUEGOS

Más de una vez algún alumno me ha preguntado cómo podrían programar videojuegos. La verdad es que estamos acostumbrados a juegos tan bien hechos y tan complejos que cualquier cosa que pueda hacer un alumno de secundaria va a ser algo bastante simple comparado con aquellos con los que suele jugar.

Los lenguajes específicos que hay para programar videojuegos son bastante profesionales y es difícil iniciarse en su aprendizaje. Cuando yo estaba en el instituto, los videojuegos eran bastante sencillos y los ordenadores que teníamos en casa nos permitían programar videojuegos muy simples de manera sencilla.

Hace poco he descubierto un lenguaje de programación bastante sencillo de manejar, gratuíto y que permite iniciarse en el mundo de los videojuegos. Evidentemente, lo que podemos hacer como primer paso va a ser muy simple, pero poco a poco podemos ir comprendiendo ciertos conceptos de programación y hacer algo más complejo. Por otro lado, para un alumno de secundaria, siempre va a ser más divertido introducirse en el mundo de la programación por medio de los videojuegos que programando bases de datos o algo parecido.

El programa se llama processing:

Hay páginas como ésta en la que la gente comparte sus códigos. Lo malo es que todo está en inglés.

Para empezar a programar videojuegos lo mejor es empezar siguiendo el orden de los videojuegos que han ido surgiendo en el mercado: tenis, space invaders, moon cresta, galaxians, pac-man, etc.

Aquí tenéis el código del juego del tenis. Los controles son az para un jugador y pñ para el otro.



//Primera parte del programa. Declaración de variables.
//dimensiones de la ventana de juego
int ancho= 600;
int alto=400;
int goles1;//goles de jugador uno y dos
int goles2;
int x=150;//coordenadas de la pelota
int y=150;
int r=10;//radio de la pelota
int incx=1;//incrementos. Lo que se le va a sumar a x e y para que se mueva la pelota
int incy=1;
boolean sub1;//variable booleana, ésto quiere decir que sólo puede valer verdadero o falso. Verdadero si el jugador uno ha pulsado subir
boolean baj1;//Verdaderosi el jugador uno ha pulsado bajar
boolean sub2;//bubir jugador dos
boolean baj2;//bajar jugador dos
int posx=40;//coordenadas del centro de la raqueta uno
int posy =150;
int pos2x=ancho-40;//coordenadas del centro de la raqueta dos
int pos2y =150;
// definición de la función setup, que se ejecuta siempre al principio
void setup(){
size(ancho,alto); //dimensiones de la ventana
background(0);//color de fondo
smooth();//hace que los contornos de lo que se dibuja sean suaves, que no haya picos
frameRate(200);//velocidad. Veces por segundo que se ejecuta la función draw. En teoría a partir de 60 da igual lo que se ponga, pero lo cierto es que con 200 va más rápido que con 60
PFont font;//define el tipo de letra para el texto
font = loadFont("Impact-48.vlw");
textFont(font);
}
//el bucle draw se repite constantemente
void draw() {
background(0);//pinta de negro la pantalla
text(goles1, width/2-40, 60);//escribe el marcador
text(goles2, width/2+40, 60);
ellipse(x,y,r,r);//dibuja la pelota
//bote con el borde
if ((y>alto-1)||(y<1)){
incy=incy*(-1);
}
//goles
if (x>ancho-40){
background(80);
}
if(x==ancho){
goles1++;
x=width/2;
incx=-1;
}
if (x==0){
x=width/2;
incx=+1;
goles2++;
}
if (x<20){
background(80);
}
//bote con las raquetas
if (((x==posx+5)&&((posy-y)*(posy-y)<2500))||(((x==pos2x-5)&&((pos2y-y)*(pos2y-y)<2500)))){
incx=-(incx);
}
//movimiento de la pelota
x=x+incx;
y=y+incy;
//dibuja las raquetas
rect(posx,posy,10,50);
rect(pos2x,pos2y,10,50);
//mueve las raquetas
if (sub1){
posy--;
}
if (baj1){
posy++;
}
if (sub2){
pos2y--;
}
if (baj2){
pos2y++;
}

}
void keyPressed(){
if (key == 'a'){
sub1=true;
}
if (key =='z'){
baj1= true;
}
if (key == 'p'){
sub2=true;
}
if (key =='ñ'){
baj2=true;
}
}
void keyReleased(){
if (key == 'a'){
sub1=false;
}
if (key =='z'){
baj1= false;
}
if (key == 'p'){
sub2=false;
}
if (key =='ñ'){
baj2=false;
}
}