Shamman Beast

martes 24 de noviembre de 2009

Es un nombre tentativo :D, es un videojuego, apenas estamos trabajando en la idea y algo de arte. En general narra dos historias:


--
Shamman Beast: Guerra

Es la "precuela", cuenta la historia del "Tigre" (aún no hay nombre para le personaje, pero su bestia es un Tigre), el co-protagonista de la historia del game, su ambientación está dada en un futuro cercano no muy distinto de nuestro presente, donde apenas se iniciaban las peleas entre paises, guerras por recursos mas importantes que el dinero. Explica diversas situaciones que dieron inicio a una guerra, algo muy común ya en los videojuegos. La historia es narrada desde el punto de vista del protagonista quién es un muchacho latino que se va moviendo entre situaciones y a medida que va avanzando va tomando partido importante dentro del cause, paralelo a este tema se va dando la aparición del Shamman, esta parte de la histria aún es reservada.

En la historia el protagonista se enfrentará a diversos tipos de personajes que son importantes para la segunda parte como uno de los "Jueces" o uno de los "Cazadores".

Bueno esto es simplemente la presentación de la primera parte de la historia, nada detallado.
--

--
Shamman Beast: Paz

Esta será la segunda entrega de la misma historia, aca el "Tigre" ya no será el protagonista, pues él ya hizo su función que era ayudar a generar la guerra, ahora será su hija la que debe llevar con los pecados de su padre. Al igual que el padre también posee el poder de la invocación de espíritus de bestias por instantes, es un shamman. Esta parte de la historia se da un poco mas adelante de nuestro presente, con una sociedad avanzada y degradada por dicho avance. Por ahora no hay mas para contar. Esta es la historia del primer juego.
--


El desarrollo contará con ciertos tipos de jugadores:
  • Los Ciberpunks: personajes que usan la tecnología para lograr lo que los shammanes consiguen espiritualmente.
  • Los Shammanes: personajes que han aprendido el arte de la invocación de espíritus y fuerzas de la naturaleza.
  • Los Cazadores: Son personajes que conocen el arte shamman y que lo han perfeccionado bastante, en casi todas sus cualidades son superiores a los demás, generalmente solitarios
  • Los Jueces: Son personajes que nacen siendo dioses, con todo su poder desarrollado, pueden realizar invocaciones de animales que no existen (bestias míticas) o animales extintos.

Por ahora estamos puliendo la historia de la segunda parte y la primera (en ese orden :D) y estamos trabajando en algunos artes que voy a poner aca (son imagenes de alta así que pesan un poco xD):

[Cazador]

[Ciberpunk]

Leer ++;

Assassins creed movie

jueves 19 de noviembre de 2009

Se trata de la película que hizo la gente de ubisoft para contar la historia previa al momento en que se desenvuelve la segunda entrega de este videojuego, altamente recomendado.



Leer ++;

Yo se que no encaja pero me da igual¡¡¡

miércoles 11 de noviembre de 2009

Si lo se, el blog tiene un sentido mas informativo y técnico pero me vale, un par de canciones ke voy a compartir aca ahora mismo (son 4 ¬¬)

Recomendadas:
http://www.youtube.com/watch?v=TmFi2snLr7o
http://www.youtube.com/watch?v=mpiEEl_5pmA

--









Leer ++;

Nuevo proyecto: "Road Gunners"

martes 10 de noviembre de 2009

En una tarde de aburrimiento, oir música depresiva jajajajajajaja y sentirse algo triste y con la cabeza vuelta nada surgen algunas buenas ideas ... y esta definitivamente es una de ellas, he decidido con Felipe (cafeino o Cafeortiz) iniciar un nuevo proyecto que tiene por nombre tentativo "Road Gunners"

¿En qué consiste?
Pos vamos a elegir un fin de semana del mes para ir a algún lugar de Colombia, vamos a tomar fotos, vamos a escribir una encuesta que pronto publicaré y la haremos en cada destino, filmaremos la vida nocturna y diurna durante solo uno o dos dias. Vamos a crear un blog para el proyecto y en él vamos a publicar cada mes el contenido nuevo que consigamos en dicha ciudad con nuestros comentarios y demás.

¿Objetivo?
La verdad ninguno que tenga mucho sentido, es que estabamos hablando de las distintas regiones y la gente de cada una y pos nos surgió la idea de viajar a conocer para dejar de especular tanto :P

¿Cuándo inicia?
En diciembre daremos inicio a nuestros viajes jajajajaja :P

¿Cuál es el primer destino?
Pos teniamos varias opciones pero creemos que la mejor para iniciar es Manizales así que estaré avisando la fecha del viaje pronto :P.

¿Algo mas?
No nada mas, too bien calmate calmate ...

Leer ++;

Unreal Engine 3 Eval Kit FREE

jueves 5 de noviembre de 2009

Bueno es una noticia de la que hay que hacer ECO en todos lados, la gente de Epic Games ha decidido liberar su eval kit de desarrollo totalmente gratis para uso no comercial (incluye realización de demos y fines académicos), para los que aún no alcanzan a darse cuenta de la magnitud de la noticia, esto significa ke los desarrolladores independientes YA tienen una herramienta para desarrollar una demo de su juego FULL con TODO y con la tecnología de PUNTA, esto con el fin de una vez terminada la demo poder buscar patrocinio mas fácilmente, en CONCLUSIÓN, ya no hay excusas de adquisición de tecnología pues puedes usar la de PUNTA para tu desarrollo.

Para mi adicional tiene una implicación mas y es que ahora podré actualizar el programa de "Diseño de Videojuegos" que dicto en la universidad ICESI de Cali para cambiar la plataforma sobre la cual trabajemos, de JME a UE3, esto con el fin de enseñar a los estudiantes a trabajar sobre las herramientas que se usan en el mercado ... lo que yo llamaria estandar de facto.

En definitiva esta noticia trae grances cosas para todos y para mi en particular :P.

Link a la noticia en gamasutra: http://www.gamasutra.com/php-bin/news_index.php?story=25955

Link al url del site oficial de UDK (Unreal Development Kit): http://www.udk.com/


Pongo aca la traducción del mini-FAQ que han puesto en el sitio oficial del proyecto:

--
¿Puedo crear cualquier tipo de juego en el UDK?
Absolutamente. UDK es la solución perfecta para cualquier tipo de mundo virtual que desees crear, desde un juego de carros hasta simulaciones. Visita nuestros "showcase" para ver algunas de las asombrosas creaciones de nuestros usuarios con UDK.

¿Puede mi programa UDK correr en Mac, iPhone, PS3 o Xbox 360?
Justo ahora, UDK es un programa unicamente para Windows. Por favor visita nuestra página de licenciamiento si deseas hablar sobre el uso de UDK para multiples plataformas.

He realizado mods para Unreal Tournament 3. ¿Cuanto difiere UDK del editor de UT3?
Puedes crear aplicaciones independientes (de escritorio) con UDK. Esto significa que los usuarios podrán instalar y ejecutar tus juegos sin tener una copia del UT3.
--

Para finalizar este post dejo los requerimientos necesarios para ejecutar este sistema.

--
Minimos:
  • Windows XP SP2 o Windows Vista
  • Procesador 2.0+ GHz
  • 2 GB de RAM
  • Tarjeta de video compatible con SM3
  • 3 GB de Disco Duro libres.
Recomendados:
  • Windows Vista 64 SP2
  • Procesador multi-nucleo de 2.0+ GHz
  • 8 GB de RAM
  • NVIDIA de la serie 8000 o superior
  • Todo lo que puedas de DD libre.
--

Parece ke tengo buena suerte, justo me llega el portatil Alienware y Epic libera este evalkit de desarrollo mmm creo que pasaré mucho tiempo con mis nuevos juguetes :D.

En un próximo post hablaré sobre lo que trae y lo que no trae el UDK, esta noche a instalar :D.

Bye bye

Leer ++;

Algunas viejas cosas

lunes 2 de noviembre de 2009

Estoy en este momento ordenando mis cosas y revisando unos cds he encontrado tres viejos artículos que intenté escribir hace como 6 años ya, dos están terminados y otro está solo a medio camino, igual los estoy publicando en este post ya que puden ser de utilidad para alguien y sino igual para recordar viejos tiempos :D.

-------
Sockets en Tcl.
--------------------

Este es mi tercer artículo, Hace un año aprendí a programar en este lenguaje debido a que lo necesitaba para una materia y la verdad me parece muy bueno, es lenguaje script pero es muy bueno. En este artículo se intenta explicar como trabajar con sockets en Tcl de una forma fácil y rápida.


INDICE
-----------


- Introducción

- Abriendo un Socket como Servidor

- Abriendo un Socket como Cliente

- E/S asíncrona con Sockets

- Demo

- Despedida

-------------------------------------------------------------------------------

- Introducción.
-------------------


Los sockets son usados en todo tipo de programa en red, para comunicar dos computadores o dos programas en la misma máquina. El modelo de Socket es muy usado en redes TCP/IP. Algunos programas como "servidores" escuchan en un puerto particular. Cuando algún programa como "cliente" inicia una conección, el "servidor" responde y comienza a leer la información del cliente, y escribe información cuando es necesario. Muchas de las operaciones de lectura y escritura son a la salida/entrada estandar o sobre archivos, pues esta operación es exactamente la misma sobre sockets.


- Abriendo un Socket como Servidor.
------------------------------------------------


Código ejemplo:
set trigger 0
set s [ socket -server openchan 5000 ]
vwait trigger

Explicación:
La segunda línea abre un socket sobre el puerto 5000; cuando el cliente se conecte el argumento "-server" es invocado y en este caso se ejecuta el procedimiento "openchan". Los parámetros del manejador de archivo para la conección, la dirección y el puerto del cliente son automaticamente pasados. La tercera línea es "vwait" que suspende la ejecución del programa hasta que la variable "$var" cambie.

El procedimiento "openchan" debe recibir estos parámetros ( manejador de conección, puerto y dirección ) y decidir cual será la forma de comunicación entre cliente y servidor y la forma de retornar los datos.


- Abriendo un Socket como Cliente.
----------------------------------------------


Una vez creado el servidor y corriendo, basta con hacer:

valtovar@dintev articulos $ nc localhost 5000

Para darnos cuenta de que funciona perfectamente, sacará un error debido a que aún no hemos escrito la función "openchan" la cual debe estar antes del socket para que entre en el "scope" del socket, pero esto indica que la conección fue exitosa.

Una vez testeado nuestro servidor continuamos con el cliente. Muy seguramente deseamos que nuestro cliente realice algunas funciones, pues aquí está el código de un simple cliente que solamente abre una conección y escucha.

set s [ socket localhost 5000 ]
while { [ gets $s line ] != -1 } {
puts $line
}


- E/S asíncrona con Sockets.
------------------------------------


Ahora si mostraré nuestra función "openchan" la cual debe estar del lado del servidor

proc openchan { chan dir puerto }
{
% setea flags para el canal de comunicación.
fconfigure $chan -blocking 0 -buffering none

% ejecuta cuando hay datos para leer en el canal.
% es importante para recibir y atender a cada cliente.
fileevent $chan readable "readchan $chan"

% imprime del lado del servidor.
% $chan es el manejador de conexion.
% $dir es la direccion del cliente.
% $puerto es el puerto del cliente.
puts stdout "Conexión aceptada $dir:$puerto ( $chan )

% imprime del lado del cliente.
puts $chan "Servidor leyendo"
}

En la línea 2 se configura el canal de comunicación con algunos flags; "blocking" es para que el canal sea blokeante o no, en nuestro caso, es no blokeante. Es necesario colocar fileevent debido a que como es no bloqueante, necesitamos que cuando existan datos en el canal para leer, se ejecute este script y los lea.


- Demo.
---------


Esta es un pequeño chat modo texto creado en tcl para demostrar el manejo de sockets, ejecuta el server.tcl primero y luego dos veces el client.tcl para que se vea en ejecucion.


- Despedida.
---------------


Bueno, con esto termino la versión 0.1 de mi artículo el cual se limita a explicar de forma muy basica el uso de sockets en tcl, para proximas versiones voy a colocar mas tips interesantes sobre el manejo de sockets en tcl.
-------

El siguiente irá en otro post

Leer ++;

Algunas viejas cosas II

El primero fue de Sockets en Tcl, este será el segundo artículo que escribí hace como 6 años, este es sobre estructuras de datos en C++, Java y Python, me hubiera gustado terminarlo :D.

------
Estructuras de Datos en C++, Java y Python
-----------------------------------------------------------


Este articulo esta dirigido a aquellas personas que tienen un conocimiento sobre lenguajes de programacion y que desean aprender un poco mas sobre ellos y sobre como mejorar sus programas mediante el uso de estructuras de datos mas complejas. En este articulo explicare en detalle algunas estructuras de datos ( las mas comunes ) y su implementacion en lenguajes de programacion como C++ y Java; sobre los algoritmos de manipulacion sobre dichas estructuras y sobre como optimizar su uso.

En este articulo supongo que el lector tiene conocimiento en dichos lenguajes y debido a esto no hare mucho incapie en sintaxis ni explicaciones pertinentes al lenguaje, solo a las estructuras.


Contenido:
---------------


- Introduccion.
-- Estructuras Fundamentales.
--- Array.
--- Lista.

- Pilas.
-- Representacion.
-- Algoritmos de Manipulacion.
--- Push.
--- Pop.
--- Top.
--- Empty.
-- Implementacion en C++.
-- Implementacion en Java ( propia ).
-- Explicacion de la clase Stack de Java.
-- Implementacion en Python.

- Colas.
-- Representacion.
-- Algoritmos de Manipulacion.
--- Insert.
--- Delete.
--- Find.
--- Sort.
--- Empty.
-- Implementacion en C++.
-- Implementacion en Java.
-- Implementacion en Python.


- Listas Enlazadas.
-- Representacion.
-- Algoritmos de Insercion, Busqueda y Eliminacion.
-- Implementacion en C++.
-- Implementacion en Java ( propia ).
-- Explicacion de la clase LinkedList de Java.
-- Implementacion en Python.
-- Recomendaciones.

- Listas Doblemente Enlazadas.
-- Representacion.
-- Algoritmos de Manipulacion.
-- Implementacion en C++.
-- Implementacion en Java ( propia ).
-- Implementacion en Python.
-- Recomendaciones.

- Listas Circulares.
-- Representacion.
-- Algoritmos de Manipulacion.
-- Implementacion en C++.
-- Implementacion en Java ( propia ).
-- Implementacion en Python.
-- Recomendaciones.


- Arboles
--
- Grafos

- Tablas Hash


-------------------------------------------------------------------------------

- Introduccion:
---------------------


Las estructuras de datos se basan en la teoria de conjuntos. Son agrupaciones de datos con caracteristicas comunes para su facil manejo. Existen dos tipos de estructuras de datos conocidas como "Estructuras Fundamentales" que son: Array y Lista, Son las mas faciles de manipular debido a que no existen sobre ellas ningun tipo de restriccion, por tanto los procesos de "Consultas y Modificaciones" son mucho mas faciles; muchas de las estructuras mas complejas
como pilas o colas son implementadas en base a estas dos, son como arrays con restricciones de acceso o modificacion.

La desventaja de la estructura Array es que es estatica, su tamaño debe ser fijado en tiempo de compilacion para la reserva de la memoria, mientras que las Listas permiten hacer reserva de mas memoria en tiempo de ejecucion de un programa, por tanto son dinamicas y pueden crecer con forme pasa el tiempo de ejecucion mientras que el array permanecera estatico durante dicho tiempo. En ambas estructuras no existe forma de saber si un dato se encuentra almacenado a menos que se haga un recorrido por toda la estructura y esto en cualquier caso tomara "Theta ( n )" ( se lee teta de n ) donde "n" es el tamaño de la estructura ( la cantidad de datos ) por tanto si "n" es muy grande esta busqueda seria demasiado costosa en tiempo. Por otro lado, Buscar
un elemento en la lista siempre sera "Theta ( n )", mientras que en un Array puede ser "Theta(1)" debido a que tiene un comportamiento parecido a una Tabla Hash, lo que permite hacer un accesado directo al dato buscado si tenemos la "llave" ( key ), en el caso de los Arrays dicha "llave" es el indice en el cual se encuentra el elemento. Para que quede mas claro muestro un ejemplo:

Tenemos dos estructuras:

Array [ n ]; // n es la cantidad de elementos.
Lista.p = 0; // La estructura Lista tiene dos campos: p -> int,
Lista.next = Lista // next -> puntero al siguiente elemento de la lista ( lista enlazada ).


Inicializamos las estructuras.

for i <- 0 to n // para i desde 0 hasta n.
Array [ i ] <- ( i + 1 );
Lista.p <- ( i + 1 );
Lista <- Lista.next;
Lista.p <- infinito;
Lista.next <- null;


Si queremos saber si 9 esta en la lista tocaria:

for i <- 0 to n
if Array [ i ] == 9
print "Esta en la pocision: " i;
else print "No esta";

i <- 0;
while Lista.next != null
if Lista.p == 9
print "Esta en la pocision: " i;
else Lista <- Lista.next;
i++;


Como se ve, en ambas toca hacer una busqueda en toda la estructura hasta encontrar el elemento buscado. Ahora miremos otras operaciones:


Si queremos insertar un elemento:

Array [ k ] <- elemento // k es la pocision donde lo vamos a insertar.
ptrLista.p <- elemento // ptrLista es un puntero a la ultima pocision
ptrLista.next <- null // de la lista.

Esta operacion es rapida y no toma mucho tiempo si tenemos en ambos casos una variable externa que nos indique en donde vamos en la estructura ( en Array es "k" y en Lista es "ptrLista" ), en caso contrario tocaria hacer de nuevo una busqueda por toda la estructura para encontrar el final e insertar ahi el nuevo elemento.

*********************************************************************************
Tip: Es bueno tener dicha variable externa en caso de realizar varias operaciones de este tipo sobre la estructura para ahorrar en tiempo de ejecucion.
*********************************************************************************

Ahora veamos que pasa cuando buscamos un elemento en una determinada pocision:

print Array [ k ]; // k es la pocision del elemento.

i <- 0;
while Lista.next != null
if i == k
print Lista.p;
else Lista <- Lista.next;
i++;

Como vemos, en el Array hay un acceso directo por tanto el tiempo es Theta(1) mientras que en Lista hay que hacer una busqueda por toda la estructura, haciendo que su tiempo en el peor de los casos sea "Theta(n)".

Una vez visto la introduccion a estas estructuras basicas, entremos en materia. La estructura Lista sera explicada mas adelante.

-------------------------------------------------------------------------------


- Pilas ( Stack ):
----------------------


Esta es una de las estructuras mas simples que existen, es generalmente implementada basandose en Array o Lista a las cuales se le aplican las restricciones necesarias para que se comporte como lo hace una pila ( LIFO, Last In, First Out ). La estructura de una pila responde al comportamiento de una pila de platos, donde se coloca uno, luego otro y asi sucecivamente hasta llegar a un numero "N" de platos apilados, luego cuando se desea obtener un plato en la pocision "X" ( 0 < style="font-style: italic;">Ultimo en llegar, Primero en Salir y es asi pues para obtener el ultimo plato primero deben retirarse los N-1 platos que estan encima de el ultimo.
Ejemplo:

N = 3, TotalPlatos = 1.
Pos = 1 = X

N = 3, TotalPlatos = 2.
Pos = 1 = X
Pos = 2 = X

N = 3, TotalPlatos = 3.
Pos = 1 = X
Pos = 2 = X
Pos = 3 = X

Como se ve en el ejemplo, el ultimo en llegar queda ubicado en el tope de la pila y el primero va quedando "cepultado". Ahora si desdeamos obtener el tendriamos que retirar primero el para luego obtener el , asi: "X = 2", retiramos los "X - 1 = 2 - 1 = 1" platos antes que hay encima de él, o el , hariamos: "X = 3" y "3 - 1 = 2" platos que se
deben retirar primero.

******************************************************************************
Tip: en la computadora las pilas no se llenan hacia arriba como una pila de platos, se llenan es hacia abajo, por eso en la pila de datos de un programa, los parametros a funciones se pasan de forma inversa a la que son enviados asi, si tenemos:

function algo ( par1, par2 ),
en la pila veriamos:

// Sentido inverso al que nosotros lo enviamos.

y al retirar el elemento del tope tendriamos:
// El ultimo elemento era

Esto por que supone que el orden importa y el elemento que se pasa de primero se va a utilizar de primero, asi que lo pone de ultimo en la pila para poder acceder de inmediato a ese elemento.
******************************************************************************

En este tipo de estructuras existen dos operaciones que son insertar conocida como PUSH y eliminar llamada POP, tambien es comun encontrar una tercera funcion para ver el ultimo elemento de la pila sin eliminarlo llamada TOP. En muchas implementaciones como en la de Stack de Java encontramos otras funciones como EMPTY y FULL para saber si la pila esta llena o vacia, ahora vamos a estudiar estos algoritmos en detalle.


-- Algoritmos de Manipulacion.
----------------------------------------


- Push
-------

Push ( x )
Tope () = Tope () + 1 // Incrementa el tope de la pila.
Pila ( Tope () ) = x // Almacena el nuevo elemento en el tope de la pila.

- Pop
------

Pop ( )
Tope () = Tope () - 1 // Decrementa el tope en 1.
Return Pila ( Tope () + 1 ) // Devuelve el elemento que se retiro para mostrarlo.

En el algoritmo Pop se ve que solo se decrementa el contador del tope, esto es por que no hace falta eliminarlo realmente debido a que cuando se vaya a insertar un nuevo elemento, solo hace falta tener el tope, incrementarle 1 y ahi se sobre-escribe el dato. Asi como funciona el "rm" de las computadoras que no elimina realmente, solo etiqueta con "libre" y luego cuando va a guardar sobre-escribe.

Obviamente se puede mejorar estos algoritmos para evitar overflow y underflow pero esta es como la implementacion basica; la complejidad de estos dos es O(1) debido a que son operaciones que toman tiempo constante.


*********************************************************************************
Tip: En estas estructuras de datos hay dos tipos de vulnerabilidades que son:
underflow: cuando se desea retirar un elemento y la pila esta vacia. Este error es tipicamente tratado.
overflow: cuando se desea insertar un elemento y la pila esta llena. Este error no se trata con frecuencia es un topico importante en la validacion de seguridad de un programa. Genera un bug que puede ser explotado.
********************************************************************************
-------

Por desgracia este artículo lo dejé hasta ahí, espero sirva de algo para alguien jajaja. Gracias :P

Leer ++;