Blame

Leer más » 3 Comentarios

El efecto Linus Torvals

El pasado 26 de julio, hace casi un mes, Linus Torvals anunció en Google+ que se pasaría definitivamente a XFCE por su poca afinidad con la versión 3 de Gnome. Pues bien, el efecto se ha hecho notar:

Incluso en Google se ha notado la creciente búsqueda de “XFCE” tras las declaraciones. La marca A cuando se lanzó la última versión, la 4.8. La marca B cuando Linus habló.

Afortunada o desgraciadamente, la influencia de estas declaraciones pueden marcar la desvinculación de este escritorio para muchos usuarios. En mi caso, tengo dos opciones, me quedo con las actualizaciones sobre la versión dos o vuelvo al que fue mi primer escritorio, XFCE. read more

Leer más » 8 Comentarios

Lo mejor de mi RSS del 15 al 21 de agosto

Leer más » 1 Comentario

Reservar memoria dinámica para una matriz en C

Acabamos de hablar hace nada de cómo reservar memoria para un vector unidimensional de forma dinámica con C. Hoy le toca el turno a las matrices o arrays bidimensionales. Los vectores se organizan de forma lineal, secuencial y con todos los elementos en posiciones correlativas en la memoria. Las matrices se almacenan en forma de vector de vectores.

Dimensiones fijas

Si es de dimensiones fijas (declarándolas como matriz[filas][columnas]), el vector de vectores se guardará también uno al lado del otro.

Por lo tanto, en una matriz del tipo:

a00a01a02
a10a11a12
a20a21a22

En memoria (en la que los elementos los direccionamos en una sola dirección) los tendríamos de la siguiente forma (en cada lenguaje este criterio cambia, en Fotran se almacena en forma de vector de columnas):

a00a01a02a10a11a12a20a21a22

Dimensiones variables

Sin embargo, en el caso de la memoria dinámica, las cosas cambian. El mecanismo será el siguiente:

  • Declararemos un doble puntero “matriz” sobre el que reservaremos memoria para tantas filas tengamos.
  • Recorreremos el vector recién creado para reservar memoria para las columnas de cada fila.

Hay dos detalles a tener en cuenta:

  • La variable “matriz” será del tipo doble puntero ya que hará referencia a un vector de punteros.
  • Cada fila sí estará almacenada de forma consecutiva en memoria, pero éstas a su vez no estarán de forma obligada juntas, aunque podremos seguir accediendo de la misma forma.

Veamos un ejemplo con código real (no hace comprobaciones de que el malloc se ejecute correctamente):

#include <stdlib.h> #include <stdio.h> int main(void) { int filas = 2; int columnas = 3; int **x; int i; // Recorre filas int j; // Recorre columnas // Reserva de Memoria x = (int **)malloc(filas*sizeof(int*)); for (i=0;i<filas;i++) x[i] = (int*)malloc(columnas*sizeof(int)); // Damos Valores a la Matriz x[0][0] = 1; x[0][1] = 2; x[0][2] = 3; x[1][0] = 4; x[1][1] = 5; x[1][2] = 6; // Dibujamos la Matriz en pantalla for (i=0; i<filas; i++) { printf("\n"); for (j=0; j<columnas; j++) printf("\t%d", x[i][j] ); } return 0; } read more

Leer más » 16 Comentarios

Ropa


ropa

Hay que ver, el otro día haciendo la colada me di cuenta de que la mayor parte de mi ropa tiene algo que ver con el software libre.

Leer más » 2 Comentarios

[Tips] Google compra Motorola

La noticia (Mashable) me sorprende de dos formas, la primera es que desconozco qué mercado espera cubrir Google con esta compra, no lo tengo demasiado claro.

La segunda la barbaridad que han pagado por esta adquisión, sólo 12.5 billones de dólares, lo que serían en lengua española 12500 millones de dólares. Recordad que un billón anglosajón no equivale a un billón español, ya que aquí (España) se considera que un billón es un millón de millones y en este caso hablamos de miles de millones. read more

Leer más » 5 Comentarios

Reservar memoria dinámica para un vector en C

Puesto que estamos hablando bastante de C en el curso de programación de videojuegos con SDL, voy a publicar una serie de pequeños apuntes sobre programación en C que seguro que os son de utilidad. No van a constituir un curso como tal pero serán una serie de entradas relacionadas sobre este tema. read more

Leer más » 8 Comentarios

Lo mejor de mi RSS del 8 a 14 de agosto

Leer más » 1 Comentario

Curso programación de videojuegos con SDL – Moviendo una imagen por la pantalla

Tras cargar la imagen y quedarse estática en la pantalla os darán ganas de moverla. Aprendamos a como moverla por la pantalla con las flechas del teclado. Aprovecharemos para cambiar la forma de salirnos de la aplicación, ahora lo podremos hacer mediante la tecla ESC o haciendo clic en el cierre de la ventana. Veamos como en el caso anterior lo que debemos incluir:

  1. Declaramos un entero para las coordenadas X e Y de nuestro avión:int posicionJugadorX=320, posicionJugadorY=40;
  2. Declaramos un puntero, para que se almacene un vector dinámico con las teclas pulsadas:Uint8* teclas;
  3. Cambiamos la estructura del programa. Ahora, tras inicializar todo, parte que terminamos cambiando el título a la ventana, pasamos a hacer un bucle para que el programa se ejecute hasta que el jugador quiera salir.while(!terminar)
  4. Usamos la variable posicion tanto para dibujar el fondo como el avión en cada paso del bucle:SDL_BlitSurface(fondo, NULL, screen, &posicion); …posicion.x=posicionJugadorX; posicion.y=posicionJugadorY; SDL_BlitSurface(jugador, NULL, screen, &posicion);
  5. Bucle para detectar salidas (pulsación de ESC o de la cruz de cerrar programa):while ( SDL_PollEvent(&event) ) {if(event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)terminar = 1;}
  6. Finalmente, el resto de las teclas:teclas = SDL_GetKeyState(NULL);if(teclas[SDLK_UP]) { posicionJugadorY -= 2; }if(teclas[SDLK_DOWN]) { posicionJugadorY += 2;}if(teclas[SDLK_LEFT]) { posicionJugadorX -= 2; }if(teclas[SDLK_RIGHT]) { posicionJugadorX += 2; }

De esta manera conseguiremos que nuestro avión se mueva a través de la pantalla siguiendo nuestras órdenes. Modificaremos nuestro fichero Makefile para poder compilar este ejemplo. El resultado es el mismo que antes pero podemos mover nuestro avión. El código completo:

#include <stdio.h> #include <stdlib.h> #include <SDL/SDL.h> #define MASK 255, 255, 255 int main() { SDL_Surface *screen; SDL_Surface *fondo; SDL_Surface *jugador; SDL_Event event; int terminar=0; SDL_Rect posicion; int i, j; int posicionJugadorX=320, posicionJugadorY=40; Uint8* teclas; if (SDL_Init(SDL_INIT_VIDEO) < 0) { printf("No se pudo inicializar SDL: %s\n", SDL_GetError()); exit(1); } fondo = SDL_LoadBMP("fondo.bmp"); jugador = SDL_LoadBMP("avion.bmp"); SDL_SetColorKey (jugador, SDL_SRCCOLORKEY, SDL_MapRGB (jugador->format, MASK)); screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE ); if( screen == NULL ) {   printf( "Error al entrar a modo grafico: %s\n", SDL_GetError() );   SDL_Quit();   return -1; } SDL_WM_SetCaption( "Moviendo nuestro avion", "Moviendo nuestro avion" ); while(!terminar) {   for (i=0; i<10; i++)     for (j=0; j<10; j++)     {       posicion.x=64*i;       posicion.y=48*j;       SDL_BlitSurface(fondo, NULL, screen, &posicion);     }   posicion.x=posicionJugadorX;   posicion.y=posicionJugadorY;   SDL_BlitSurface(jugador, NULL, screen, &posicion);   SDL_Flip(screen);   /*salida con ESC o cerrar ventana*/   while ( SDL_PollEvent(&event) )   {     if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)       terminar = 1;   }   /* Vemos el estado indivudal de las teclas de la cruceta */   teclas = SDL_GetKeyState(NULL);   if (teclas[SDLK_UP]) { posicionJugadorY -= 2; }   if (teclas[SDLK_DOWN]) { posicionJugadorY += 2;}   if (teclas[SDLK_LEFT]) { posicionJugadorX -= 2; }   if (teclas[SDLK_RIGHT]) { posicionJugadorX += 2; } } SDL_Quit(); return 0; } read more

Leer más » 5 Comentarios

Temperatura de Color en GIMP

Una de las carácterísticas que más añoraba al revelar mis fotografías con GIMP era el ajuste de la temperatura de color. Encontré un plugin, Colortemp, para realizar esta tarea, pero no era demasiado intuitivo. Ya que tenía que indicar la temperatura de color inicial y la que deseábamos obtener, con lo que si hemos de ir probando hasta conseguir el resultado esperado esto se puede convertir en una tarea algo complicada.

Así, me puse a buscar y encontré YUV Temperature, en este caso los cálculos se hacen teniendo en cuenta el nivel temperatura, ángulo de incidencia y la compesación a la exposición. Podemos considerar el siguiente esquema: read more

Leer más » 2 Comentarios