Mostrando entradas con la etiqueta programacion. Mostrar todas las entradas
Mostrando entradas con la etiqueta programacion. Mostrar todas las entradas

viernes, 31 de mayo de 2013

Librería gráfica para Java (Videojuego multiplataforma)

Buenas a todos, hoy quiero hablar de una librería gráfica para Java, yo no soy muy fan de programar en este lenguaje pero, si queréis hacer un juego multiplataforma leed este post.

La librería en cuestión es libGDX, cuyas características mas atractivas son:

  • Permite programar juegos en 3D.
  • Es compatible con Linux, Mac, Windows, Android, iOS(pagando la licencia de MonoTouch) y Javascript/WebGL.
  • La partes críticas de esta librería están programadas en C/C++.

Yo aun no la he probado pero en cuanto lo haga subiré un pequeño tuto y una revisión. Puedes descargar la librería desde su web oficial.

Un saludo,
tchusami.

miércoles, 16 de enero de 2013

Punteros en C++ (Pointers on CPP)

Como estudiante de ingeniería informática, uno de mis mayores problemas con C++ fue entender el funcionamiento de los punteros, cuando en realidad es algo muy simple. Así que voy a explicarlo en ese post como creo que deberían habermelo explicado a mi en clase.

Un puntero en C++ es una dirección de memoria dentro del programa, que inicialmente apunta a 0 (NULL), ya que, no tiene memoria reservada. Los punteros sirven para utilizar memoria dinámica en lugar de estática, por ejemplo:

int* meses = new int[12];

Donde 12 podría ser una variable, pero si usamos memoria estática (int meses[12]) no se pueden utilizar variables para indicar el tamaño. Esta es la ventaja, pero hay que añadir el inconveniente, la memoria no se libera sola, se libera con delete, en este caso, como hemos declarado un array, con delete[]. De este modo:

delete[] meses;

Vamos a seguir con el uso de los punteros. Eliminar la duplicidad de información al almacenar en varias estructuras de datos. Esto es mejor explicarlo con un ejemplo:

Si tenemos la siguiente clase:

class Fecha{
   private:
     int dia, mes, anno;
     bool EsValida(int d, int m, int a);
   public:
     Fecha(int d, int m, int a);
     ~Fecha();
     int GetDia();
     int GetMes();
     int GetAnno();
};

Imaginamos ahora que queremos tener un array con todas las fechas de un año y ademas queremos tener una lista con las fechas importantes de ese año. Si añadiésemos al array y a la lista la misma fecha tendríamos dos veces la fecha en memoria y por tanto ocuparíamos el doble de espacio, para evitarlo tendríamos que almacenar punteros:

Fecha* fechas[365]; //Usando memoria estática
list importante;

Luego almacenamos punteros a Fecha, es decir, la dirección de memoria de una Fecha, ejemplo:

Fecha* miCumple = new Fecha(25,12,1992);fechas[357] = miCumple;importante.push_back(miCumple());

Después de borrar de la lista el puntero, no hay que olvidarse de que si vamos a salir del programa debemos  añadir un delete miCumple;

Ahora, para acceder a los métodos y miembros públicos de una clase se utiliza punto, ejemplo:

miCumple.GetDia(); 
Esto es erróneo si miCumple no es una Fecha, sino un puntero a Fecha

miCumple->GetDia(); 
Esta sería la forma correcta

Finalmente, puede interesar el como obtener el objeto de un puntero y como obtener el puntero de un objeto. A continuación lo explicaré:

Fecha f = *miCumple; 
Con * se obtiene el objeto Fecha al que apunta mi cumple, de este modo si se puede hacer f.GetDia() e incluso (*miCumple).GetDia();

Para obtener de nuevo la dirección de memoria del objeto f del tipo Fecha habría que hacer:

Fecha* pointerF = &f;
Con & se obtiene el puntero, por tanto, ahora pointerF utilizaría -> en lugar de . para acceder a los métodos públicos.

Esto ha sido todo, dudas en comentarios.

Un saludo,
tchusami.