Barcelona Games World

Notas sobre el código en (TANK BATTLE)

Con el fin de facilitar un poco la compresión del código utilizado en el juego os pasaremos unas notas que creemos que os ayudarán.

 

Máquina de estados: Según mis apuntes “Entendemos por un estado de un videojuego un módulo independiente que realiza una funcionalidad específica y que tiene su propio gestor de eventos, su bucle principal y su engine gráfico para mostrar la información por pantalla” ¿No esta claro?Nota:En la entrada damos un ejemplo de la implementación de un estado en el juego

Alta de un jugador: En este apartado explicamos como crear un jugador nuevo en esta caso player3, creación de los objetos, como especificar la teclas de movimientos, etc.
Control de disparo: ¿Donde se ha visto un juego de disparos en el que no se pueda disparar? Pues eso, en esta caso explicamos los detalle de control de disparos movimiento de los proyectiles, puntuación del jugador y mucho mas.

Creación de niveles: Ultimo punto pero no menos importa te, aquí describiremos como se crea el escenario donde transcurre la partida

Recordad que el juego ha sido desarrollado en C++ y OpenGL. Es código abierto sobre licencia  y que esta disponible en githud

Encontrareis puntos expuestos:

 

 

Creación de niveles

La estrategia has seguida para que modelar el escenario se podra definir en dos partes principales.
En el primer punto leeremos un fichero (bmp) y buscaremos los pixel de color negro una vez localizados pasaremos esas coordenadas referentes a la imagen y crearemos un objeto del tipo Wall
Finalmente en la creación de este objeto se añadirá a la lista de elementos para el control de colisiones

Creamos dos objetos del tipo BITMAPFILEHEADER BITMAPINFOHEADER

   BITMAPFILEHEADER oBMPHeader;
   BITMAPINFOHEADER oBMPInfo;

 

Leemos el fichero bmp donde está definido el mapa dl escenario

   // read binary file
   FILE* pFile = fopen("./Images/level003.bmp","rb");

   // read both headers
  fread(&oBMPHeader,sizeof(BITMAPFILEHEADER),1,pFile);
  fread(&oBMPInfo,sizeof(BITMAPINFOHEADER),1,pFile)

Información de las estructuras con la imagen de ejemplo

oBMPHeader

  • bfType 19778
    bfSize 632
    bfReserved1 0
    bfReserved2 0
    bfOffBits 54

oBMPInfo

  • biSize 40
    biWidth 16
    biHeight 12
    biPlanes 1
    biBitCount 24
    biCompression 0
    biSizeImage 578
    biXPelsPerMeter 2834
    biYPelsPerMeter 2834
    biClrUsed 0
    biClrImportant 0

Recorremos los la imagen y por cada pixel de color negro llamamos a createWall el cual se encargara de crean un objeto tipo Wall y será añadido a la lista de elementos para el control de colisiones

Búsqueda de los pixel negros

	Pixel24* curPos = aoPixels;
	for (int y = 0; y < oBMPInfo.biHeight; y++)
	{
		for (int x = 0; x < oBMPInfo.biWidth; x++)
		{
			//get pixel and save it to array using switch
			Pixel24 pixel = *curPos;
			curPos++;

			int r = (pixel.r&0xff)<<16;
			int g = (pixel.g&0xff)<<8;
			int b = (pixel.b&0xff);

			int p = r|b|g;

			switch(p)
			{
			case 0x00000000:
				this->createWall(x*64+32, y*64+32, m_Wallfile);
				break;
			default:
				break; 
			}
		}
	}

	fclose(pFile);
	delete [] aoPixels;

 

Creación de los obstáculos

	Wall* pWall = new Wall(a_filename, a_x, a_y);

	pWall->SetFaction(FT_WALL);

	if (m_pkGridIndex != nullptr)
		m_pkGridIndex->AddNode(pWall);