Ojo!: (¬ ¬) se lee de abajo p´arriba xD los post mas viejos quedan abajo ^^



viernes, 16 de enero de 2009

Dices que perdí, xq nací aaaaaki...

"Ya no voy a perder, no hay duda esta vez, ahora hay pisco en las venas." (Viva el PERU CSM!)

Asi es señores, a dejar de tirar la toalla!!
Me estaba alejando del Blog x buen tiempo ya ^^, pero me han inspirado nuevamente (increible lo que pueden hacer un par de buenas canciones carajo) a dejar de estar hueveando pues xD.

d(^.^)b (8)(8) Listo, hoy Viernes 16 de enero (cumple de mi hermana :P) armado con un litro de agua "San Luis", una lista de mas de 100 canciones "random" ( que van desde "good morning Baltimore, pasando por "Burn it Up" hasta "Se ha muerto mi abuelo", un cuaderno cuadriculado A4, un lapizero azul, y una PC con mis codigos fuente y el Dev C++ ^^. Hoy sale algo xD!!!
Ojala no me enchufen ninguna tarea compleja!


Movimiento en PONG:

*A partir de este momento cuando escriba PONG no estoy hablando del clasico juego, sino de la version de dicho juego que realizó el grupo XGL y el cual estoy editando para que tenga funcionabilidad en la RED.*

El loop de juego del PONG se ejecuta cada 30 ms o poco mas, es por esto que los FPS (frames per second, o cuadros por segundo) usualmente son 33 o menos en LAN (debido a su algoritmo vagamente elaborado su uso en internet no supera los 21 FPS) pero usualmente no baja de 31, con lo que es mas que suficiente.
Dentro del loop de juego se realizan los desplazamientos ( o actualizaciones de coordenadas de los objetos) tanto de la bola como de las barras. Pero nos centraremos en el de la bola ya que este no es directamente alterado por ninguno de los jugadores.
Los problemas surgen aca, el movimiento en PONG esta dado por dos variables enteras, cada una de ellas relativa a una de las coordenadas (x,y).

Entrando en detalle, dichas variables definen la cantidad de pixeles que la bola se va a desplazar y la direccion en que lo hara en el eje correspondiente. Osea si variable_x = 1 y variable_y =0 la bola se despazara 1 pixel por bucle (loop) hacia la derecha en el eje X (si fuera -1 se desplazaria a la izquierda), similar con la variable_y, 1 arriba, -1 abajo. Por lo tanto solo se puede movilizar a velocidades multiplos del FPS: 0, 33, 66, 99, 123... p/s(pixeles por segundo) en cada eje.
Cabe denotar que estas "variables" pueden entenderse como velocidad ya que te dan a conocer la razon de cambio del espacio (pixeles) por unidad de tiempo (s o ms segun convenga xD)

Pero, mmm... y xq no haces esas variables reales? asi obtendrias las velocidades que gustes, sin que sean multiplos del FPS. :P
Es buena solucion, pero requiere de un agregado, debido a una cuestion grafica que a continuacion explico ^^.

Nuestra pantalla se define en SDL (la libreria con la que trabajamos el PONG) como una superficie plana de Ancho*Alto*Profundidad de color. Tanto el Alto como el Ancho estan en pixeles, por lo que tendriamos una pizarra de puntos donde puedes colocar colores a tu gusto.
Pero, en teoria, no puedes colocar nada entre un punto y otro :S, me dejo entender?, solo podemos colorear los pixeles, no los espacios entre ellos. ^^ tiene sentido cierto?
Ahora digamos que la bola se desplaza de (x=138; y=200) con una velocidad que ingeniosamente hemos definido como un real (Vx=1,5; Vy=0,0) si pensamos a futuro, por ejemplo en el bucle 30 estaremos en la posicion (x=183; y=200) y no paso nada :P... :( Pero!! que pasa en la primera iteracion(bucle)? en el primer frame(cuadro) que debamos dibujar nuestra posicion es la siguiente (x=139,5; y=200) O.o?!!! para el SDL eso significa que debemos buscar en la superficie de pixeles el que se encuentre en la fila 200 entre el pixel de la columna 139 y el de la 140, pero entre pixel y pixel no se puede colorear, por lo tanto no podriamos pintar nuestra bola, lo cual si ocurriera con todos los pixeles de la bola significaria que la bola no se dibujo en ese frame :S, jajaja ^^ pero eso no ocurre porque las funciones graficas no te permiten ingresar una posicion que no sea entera, asi que en lugar de no dibujarse nos botaria un error nuestro juego ^^.

Ahora bien, esto no es el fin del mundo xD, vamos, que lo unico que hay q hacer es un pequeño codigo que nos "redondee" nuestras coordenadas ^^.

Pero :S no gastamos procesamiento al redondear todas nuestras coordenadas O.o???
Si, pero no es asi como lo haremos ^^ puesto que solo debemos redondear la coordenada de posicion del grafico, ya que esta es el punto de referencia de la imagen. si se altera la variable que contiene este punto 10 pixeles en cualquier sentido toda la imagen se alterara la misma distancia y en el mismo sentido ^^, puesto que la funcion de este punto es decirle a SDL desde donde debe empezar a dibujar la bola es por esto que al moverlo mueves todo el dibujo xD.

Es por esto que se acostumbra decir "cual es la posicion del objeto en este momento?" ahi se refieren a su coordenada de referencia, desde donde se comienza a dibujar, sino como diablos responderiamos a esa pregunta?? tendriamos que dar todas las coordenadas? O.o?!!

^^ Entonces la idea como queda?
entonces a partir de este momento la velocidad de desplazamiento va a ser una variable real (o de punto flotante) y los calculos de desplazamiento se realizaran seguidos de un redondeo y conversion a enteros de las coordenadas antes de mandarlos a dibujar. Algunos pensaran, tanto alboroto para tener mayor dominio de la velocidad? O.o? pero no queda ahi, este tramo de codigo que nos permite trabajar la velocidad como real nos va a permitir cosas que aun no habia mencionado porque no las voy a implementar en la version que estoy desarrollando actualmente pero mira, por ejemplo:

de fisica sabemos que:
dada una a = asceleración del objeto, v=velocidad del mismo, e=espacio tambien del mismo.*

*entendamos espacio como la posición del objeto, o para ser mas claros, la distancia desde el eje de cordenadas hasta la posición del objeto

hay una relacion entre ellos gracias a la maravillosa magnitud que permite la existencia de nuestra realidad (wtf O.o??), "el tiempo" ^^

y se da de la siguiente manera:

v(t) - v(0) = a*t
v(t) = a*t + Constante

posicion(t) - posicion(0) = (a*t^2)/2
posicion(t) = v(0)*t + (a*t^2)/2
posicion(t) = (a*t^2)/2 + Constante

Ahora, imaginan que cantidad de errores de precisión se daria si a,v y posicion fueran enteros?
mas teniendo en cuenta que el v(t) que calculas en un bucle sirve de v(0) para la siguiente :S
igual para posicion(t) y posicion(0)..:S si hacemos unas 30 de esas ecuaciones por segundo, imaginen nomas que pasaria en 10 segundos :S!!!

^^ pero afortunadamente todo eso lo vamos a manejar con reales y haremos el algoritmo que ideamos arriba antes de mandar a dibujar xD (con "mandar a dibujar" siempre me refiero a hacer que el programa muestre o "imprima" en pantalla los graficos ^^, no es que tenga mi propio dibujante xD)

Pero Ojo! esta pequeña jugarreta que hacemos es para no perder precisión, si bien redondeamos los valores de la posición de los objetos antes de mandar a dibujar, no chancamos( o sobreescribimos) dichos valores. Atencion ahi! que sino es por gusto! jajaja

un ejemplito :

si mi objeto perro esta en la posicion (234,38; 101,67) y me toca mandar a dibujar lo mandamos a dibujar en la posicion (234; 102).
Pero no por eso vamos a cambiar la posicion del perro, su posicion sigue siendo (234,38; 101,67). jajaja sino imaginen si el perro tuviera velocidad (0,40; 0,30) que pasaria?
ya no se moveria ^^. Cosa que es muy distinta a moverse despacito :P


Puntaje:

Si bien la parte de movimiento me va a tomar mi tiempecito :P no porque sea dificil la implementacion de la idea que he expuesto lineas arriba, sino por el hecho de que trabajo sobre un codigo ya hecho, voy a reemplazar las variables y eso traera consecuencias de incompativilidad en alguna que otra funcion, por lo que voy a tener que arreglarmelas con eso ^^
Otra salida seria no reconstruir sobre lo ya hecho, sino en base a ello, empezar de cero. ya vere como le hago y les cuento ^^.

Con respecto al puntaje son un par de variables enteras, la del servidor y la del cliente xD que guardaran, valga la redundancia, la cantidad de puntos acumulados (mas no los graficos) no, solo usaremos 2 enteros para almacenar los puntos y mediante la sublibreria de SDL llamada SDL_TTF "escribiremos" en un grafico jijiji como es eso? lo que hace la libreria SDL_TTF es ayudarnos a, teniendo un texto y un Font (en formato TTF), generar una imagen con dicho texto escrito en el con el tipo de letra definido en TTF (pero ojo, el resultado ya no es un texto, es una imagen ^^)
la ventaja es que lo generamos en tiempo de ejecucion, no tenemos almacenados todos los graficos correspondientes a cada letra y numero xD con lo que almacenamos memoria, mucha xD, ademas imaginen que quisieramos escribir en 3 o 4 tipos de letra distintos y en 3 tamaños de letra :S:S si lo hicieramos teniendo las imagenes pre-cargadas en memoria nos quitaria demasiada memoria :S:S y eso dependiendo del tamaño de la letra.

Si bien por ahora no vamos a permitir que se acumulen mas de 9 puntos por jugador ^^ en algún momento tendremos que permitirlo, con lo que vamos a requerir de algun algoritmo que nos separe cada cifra del numero y lo pase a texto ^^
ejemplo: 223 (numero) espacio que ocupa en memoria: 1 byte

"223" (cadena de caracteres) espacio que ocupa en memoria: 4 bytes
3: uno para cada cifra, y ademas uno para el finalizador de cadena (caracter que va siempre al final de una cadena de caracteres para indicar precisamente que ahi termina)
ademas pierden su capacidad numerica. "2" + "3" no es "5".. ¬¬ no sean payasos.


Interfaz Grafica de Usuario (GUI):

Para este aspecto planeo agregarle algunos menus basicos al PONG que en su version original no presentaba ninguno, iba defrente a la "acción" ^^.

De momento he pensado en estos:

Menu Principal:
-Opciones: (el usuario podra seleccionar una de ellas mediante un cursor que indica cual esta seleccionando en ese momento, que controlara con las teclas "arriba" y "abajo", + Enter)
-Comenzar juego
-Unirse a un juego
-Opciones
-Salir

Menu Comenzar:
-Nombre (introduce su nombre por teclado)
-Opciones:
-Comenzar (inicia un juego en LAN donde el es el Servidor)
-Volver (regresa al menu principal)

Menu Unirse:
-Nombre
-IP (ingreso de la IP del host via texto)
-Opciones:
-Comenzar (inicia partida contra el Servidor, si hay uno en esa IP)
-Volver

Menu Opciones: (reservado para futuras versiones ^^)

Salir: (te vas ^^)

* para futuras versiones cambiaran los Menus Unirse y Comenzar puesto que se implementara un algoritmo que utilize UDP para ubicar Servidores activos en tu LAN, con lo que ya no necesitaras conocer la IP de tu compañero ni menos introducirla xD.
Tambien se adicionaran opciones al menu Opciones :D jajaja esas cosas van a empezar a aparecer conforme se acompleje el juego, cosas como cambiar la profundidad de color (16, 32bits), encender/apagar el audio (como dije "para futuras versiones"), etc etc... xD


Bueno gente! xD los dejo de momento que tengo que trabajar que para eso me pagan ^^!!!

Y perdon si escribo mucho pero es debido a que no se si limitarme a escribir tecnicamente y asumiendo que saben de programacion, de SDL e incluso del proyecto PONG jajaja debe ser porque no comence este Blog cuando comenzamos a crear el PONG, tratare de arreglarlo con el tiempo ^^ Saludos a todos! :P

No hay comentarios: