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);