rendered paste bodyin main:
Video.SpriteSheetName["Floors"] = Video.LoadSpriteSheet("../images/floors.png", 32, 32);
Video.SpriteSheetName["Walls"] = Video.LoadSpriteSheet("../images/walls.png", 32, 32);
// Iterate over the visible part of the map and display it.
for(temp_x = (Player1.X - screen_width / 2) - 1; temp_x <= (Player1.X + screen_width / 2); temp_x++)
{
for(temp_y = (Player1.Y - screen_height / 2) - 1; temp_y <= (Player1.Y + screen_height / 2); temp_y++)
{
RealX = temp_x % iMapWidth;
while(RealX < 0) RealX += iMapWidth;
RealY = temp_y % iMapHeight;
while(RealY < 0) RealY += iMapHeight;
tile_x = map_x + (temp_x - (Player1.X - screen_width / 2)) * 32;
tile_y = map_y + (temp_y - (Player1.Y - screen_height / 2)) * 32;
if(Map.iMapLight[iLevel][RealX][RealY] > 2) glColor3f(1.0f, 1.0f, 1.0f);
if(Map.iMapLight[iLevel][RealX][RealY] == 2) glColor3f(0.6f, 0.6f, 0.7f);
if(Map.iMapLight[iLevel][RealX][RealY] == 1) glColor3f(0.4f, 0.4f, 0.5f);
if(Map.iMapLight[iLevel][RealX][RealY] == 0) glColor3f(0.0f, 0.0f, 0.0f);
if(Map.iMapLight[iLevel][RealX][RealY] == -1) glColor3f(0.2f, 0.2f, 0.3f);
if(Map.iMap[iLevel][RealX][RealY] == iTileInpassable) { Video.DrawSpriteFromSheet(Video.SpriteSheetName["Walls"], 1 + ((int) trunc(iLevel/4)), tile_x, tile_y); }
if(Map.iMap[iLevel][RealX][RealY] == iTilePassable) { Video.DrawSpriteFromSheet(Video.SpriteSheetName["Floors"], 6 + ((int) trunc(iLevel/4)), tile_x, tile_y); }
if(Map.iMap[iLevel][RealX][RealY] == iTileExit) { Video.DrawSpriteFromSheet(Video.SpriteSheetName["Floors"], 6 + ((int) trunc(iLevel/4)), tile_x, tile_y); }
glColor3f(1,1,1);
}
}
Other files:
void cVideoEngine::DrawSpriteFromSheet(int SheetNumber, int SpriteNumber, int X, int Y)
{
// Reset the view, then move to x,y.
glLoadIdentity();
glTranslatef(X, Y, 0);
// Do the actual drawing
glCallList(this->SpriteSheetList.at(SheetNumber) + SpriteNumber - 1);
}
int cVideoEngine::LoadSpriteSheet(const char* Filename, int SpriteWidth, int SpriteHeight)
{
// Insert a placeholder for the texture and store it's position.
this->SpriteSheetTexture.push_back(false);
int CurrentTexture = this->SpriteSheetTexture.size() - 1;
// Generate texture-meta-data for the texture.
glGenTextures(1, &this->SpriteSheetTexture.at(CurrentTexture));
// Create a temporary surface and load the image to it.
SDL_Surface* SpriteSheetSurface = IMG_Load(Filename);
// Store the size of the sprites and the spritesheet;
int SheetWidth = SpriteSheetSurface->w;
int SheetHeight = SpriteSheetSurface->h;
int SpritesPerRow = SheetWidth / SpriteWidth;
int Sprites = SpritesPerRow * (SheetHeight / SpriteHeight);
// Bind with our texture, then transfer the pixel-data from the surface to the texture and
// set some wrap and scaling attributes.
glBindTexture(GL_TEXTURE_2D, this->SpriteSheetTexture.at(CurrentTexture));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SpriteSheetSurface->w, SpriteSheetSurface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, SpriteSheetSurface->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// Create a List to hold the precompiled Sprites.
this->SpriteSheetList.push_back(glGenLists(Sprites));
int CurrentList = this->SpriteSheetList.size() - 1;
float TextureTop, TextureBottom, TextureLeft, TextureRight;
int SpriteRow, SpriteCol;
// For each sprite in the spritesheet..
for(int CurrentSprite = 0; CurrentSprite < Sprites; CurrentSprite++)
{
// Create list-item for the current sprite.
glNewList(this->SpriteSheetList.at(CurrentList) + CurrentSprite, GL_COMPILE);
// Calculate what row and col the sprite is on
SpriteRow = (int) ((CurrentSprite) / SpritesPerRow);
SpriteCol = (int) ((CurrentSprite) - (SpritesPerRow * SpriteRow));
// Calculate the normalized values for the sprites texture position
TextureLeft = ((float) SpriteCol * 32) / ((float) SheetWidth);
TextureRight = ((float) SpriteCol * 32 + 32) / ((float) SheetWidth);
TextureTop = ((float) SpriteRow * 32) / ((float) SheetHeight);
TextureBottom = ((float) SpriteRow * 32 + 32) / ((float) SheetHeight);
// Bind to the current texture
glBindTexture(GL_TEXTURE_2D, this->SpriteSheetTexture.at(CurrentTexture));
// Draw a rectangle (Quad = four points)
// Counter-clockwise to have the polygon face the camera
// Clockwise to have the polygon face away from the camera
glBegin(GL_QUADS);
// Top Left
glTexCoord2f(TextureLeft, TextureTop);
glVertex2i(0, 0);
// Bottom Left
glTexCoord2f(TextureLeft, TextureBottom);
glVertex2i(0, SpriteHeight);
// Bottom Right
glTexCoord2f(TextureRight, TextureBottom);
glVertex2i(SpriteWidth, SpriteHeight);
// Top Right
glTexCoord2f(TextureRight, TextureTop);
glVertex2i(SpriteWidth, 0);
// Finish the GL command
glEnd();
// Finish the Compiled List-item.
glEndList();
}
// Free the surface
SDL_FreeSurface(SpriteSheetSurface);
return CurrentList;
}