Created
October 16, 2017 02:49
-
-
Save aneury1/3ce3551d223e42cacd1e75ebda8e712b to your computer and use it in GitHub Desktop.
Tilemap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//The tile | |
class Tile | |
{ | |
public: | |
//Initializes position and type | |
Tile( int x, int y, int tileType ); | |
//Shows the tile | |
void render( SDL_Rect& camera ); | |
//Get the tile type | |
int getType(); | |
//Get the collision box | |
SDL_Rect getBox(); | |
private: | |
//The attributes of the tile | |
SDL_Rect mBox; | |
//The tile type | |
int mType; | |
}; | |
Tile::Tile( int x, int y, int tileType ) | |
{ | |
//Get the offsets | |
mBox.x = x; | |
mBox.y = y; | |
//Set the collision box | |
mBox.w = TILE_WIDTH; | |
mBox.h = TILE_HEIGHT; | |
//Get the tile type | |
mType = tileType; | |
} | |
void Tile::render( SDL_Rect& camera ) | |
{ | |
//If the tile is on screen | |
if( checkCollision( camera, mBox ) ) | |
{ | |
//Show the tile | |
gTileTexture.render( mBox.x - camera.x, mBox.y - camera.y, &gTileClips[ mType ] ); | |
} | |
} | |
int Tile::getType() | |
{ | |
return mType; | |
} | |
SDL_Rect Tile::getBox() | |
{ | |
return mBox; | |
} | |
void Dot::move( Tile *tiles[] ) | |
{ | |
//Move the dot left or right | |
mBox.x += mVelX; | |
//If the dot went too far to the left or right or touched a wall | |
if( ( mBox.x < 0 ) || ( mBox.x + DOT_WIDTH > LEVEL_WIDTH ) || touchesWall( mBox, tiles ) ) | |
{ | |
//move back | |
mBox.x -= mVelX; | |
} | |
//Move the dot up or down | |
mBox.y += mVelY; | |
//If the dot went too far up or down or touched a wall | |
if( ( mBox.y < 0 ) || ( mBox.y + DOT_HEIGHT > LEVEL_HEIGHT ) || touchesWall( mBox, tiles ) ) | |
{ | |
//move back | |
mBox.y -= mVelY; | |
} | |
} | |
void Dot::setCamera( SDL_Rect& camera ) | |
{ | |
//Center the camera over the dot | |
camera.x = ( mBox.x + DOT_WIDTH / 2 ) - SCREEN_WIDTH / 2; | |
camera.y = ( mBox.y + DOT_HEIGHT / 2 ) - SCREEN_HEIGHT / 2; | |
//Keep the camera in bounds | |
if( camera.x < 0 ) | |
{ | |
camera.x = 0; | |
} | |
if( camera.y < 0 ) | |
{ | |
camera.y = 0; | |
} | |
if( camera.x > LEVEL_WIDTH - camera.w ) | |
{ | |
camera.x = LEVEL_WIDTH - camera.w; | |
} | |
if( camera.y > LEVEL_HEIGHT - camera.h ) | |
{ | |
camera.y = LEVEL_HEIGHT - camera.h; | |
} | |
} | |
void Dot::render( SDL_Rect& camera ) | |
{ | |
//Show the dot | |
gDotTexture.render( mBox.x - camera.x, mBox.y - camera.y ); | |
} | |
bool checkCollision( SDL_Rect a, SDL_Rect b ) | |
{ | |
//The sides of the rectangles | |
int leftA, leftB; | |
int rightA, rightB; | |
int topA, topB; | |
int bottomA, bottomB; | |
//Calculate the sides of rect A | |
leftA = a.x; | |
rightA = a.x + a.w; | |
topA = a.y; | |
bottomA = a.y + a.h; | |
//Calculate the sides of rect B | |
leftB = b.x; | |
rightB = b.x + b.w; | |
topB = b.y; | |
bottomB = b.y + b.h; | |
//If any of the sides from A are outside of B | |
if( bottomA <= topB ) | |
{ | |
return false; | |
} | |
if( topA >= bottomB ) | |
{ | |
return false; | |
} | |
if( rightA <= leftB ) | |
{ | |
return false; | |
} | |
if( leftA >= rightB ) | |
{ | |
return false; | |
} | |
//If none of the sides from A are outside B | |
return true; | |
} | |
bool setTiles( Tile* tiles[] ) | |
{ | |
//Success flag | |
bool tilesLoaded = true; | |
//The tile offsets | |
int x = 0, y = 0; | |
//Open the map | |
std::ifstream map( "/home/aneury/Desktop/auditoria/lazy.map" ); | |
//If the map couldn't be loaded | |
if( map == NULL ) | |
{ | |
printf( "Unable to load map file!\n" ); | |
tilesLoaded = false; | |
} | |
else | |
{ | |
//Initialize the tiles | |
for( int i = 0; i < TOTAL_TILES; ++i ) | |
{ | |
//Determines what kind of tile will be made | |
int tileType = -1; | |
//Read tile from map file | |
map >> tileType; | |
//If the was a problem in reading the map | |
if( map.fail() ) | |
{ | |
//Stop loading map | |
printf( "Error loading map: Unexpected end of file!\n" ); | |
tilesLoaded = false; | |
break; | |
} | |
//If the number is a valid tile number | |
if( ( tileType >= 0 ) && ( tileType < TOTAL_TILE_SPRITES ) ) | |
{ | |
tiles[ i ] = new Tile( x, y, tileType ); | |
} | |
//If we don't recognize the tile type | |
else | |
{ | |
//Stop loading map | |
printf( "Error loading map: Invalid tile type at %d!\n", i ); | |
tilesLoaded = false; | |
break; | |
} | |
//Move to next tile spot | |
x += TILE_WIDTH; | |
//If we've gone too far | |
if( x >= LEVEL_WIDTH ) | |
{ | |
//Move back | |
x = 0; | |
//Move to the next row | |
y += TILE_HEIGHT; | |
} | |
} | |
//Clip the sprite sheet | |
if( tilesLoaded ) | |
{ | |
gTileClips[ TILE_RED ].x = 0; | |
gTileClips[ TILE_RED ].y = 0; | |
gTileClips[ TILE_RED ].w = TILE_WIDTH; | |
gTileClips[ TILE_RED ].h = TILE_HEIGHT; | |
gTileClips[ TILE_GREEN ].x = 0; | |
gTileClips[ TILE_GREEN ].y = 80; | |
gTileClips[ TILE_GREEN ].w = TILE_WIDTH; | |
gTileClips[ TILE_GREEN ].h = TILE_HEIGHT; | |
gTileClips[ TILE_BLUE ].x = 0; | |
gTileClips[ TILE_BLUE ].y = 160; | |
gTileClips[ TILE_BLUE ].w = TILE_WIDTH; | |
gTileClips[ TILE_BLUE ].h = TILE_HEIGHT; | |
gTileClips[ TILE_TOPLEFT ].x = 80; | |
gTileClips[ TILE_TOPLEFT ].y = 0; | |
gTileClips[ TILE_TOPLEFT ].w = TILE_WIDTH; | |
gTileClips[ TILE_TOPLEFT ].h = TILE_HEIGHT; | |
gTileClips[ TILE_LEFT ].x = 80; | |
gTileClips[ TILE_LEFT ].y = 80; | |
gTileClips[ TILE_LEFT ].w = TILE_WIDTH; | |
gTileClips[ TILE_LEFT ].h = TILE_HEIGHT; | |
gTileClips[ TILE_BOTTOMLEFT ].x = 80; | |
gTileClips[ TILE_BOTTOMLEFT ].y = 160; | |
gTileClips[ TILE_BOTTOMLEFT ].w = TILE_WIDTH; | |
gTileClips[ TILE_BOTTOMLEFT ].h = TILE_HEIGHT; | |
gTileClips[ TILE_TOP ].x = 160; | |
gTileClips[ TILE_TOP ].y = 0; | |
gTileClips[ TILE_TOP ].w = TILE_WIDTH; | |
gTileClips[ TILE_TOP ].h = TILE_HEIGHT; | |
gTileClips[ TILE_CENTER ].x = 160; | |
gTileClips[ TILE_CENTER ].y = 80; | |
gTileClips[ TILE_CENTER ].w = TILE_WIDTH; | |
gTileClips[ TILE_CENTER ].h = TILE_HEIGHT; | |
gTileClips[ TILE_BOTTOM ].x = 160; | |
gTileClips[ TILE_BOTTOM ].y = 160; | |
gTileClips[ TILE_BOTTOM ].w = TILE_WIDTH; | |
gTileClips[ TILE_BOTTOM ].h = TILE_HEIGHT; | |
gTileClips[ TILE_TOPRIGHT ].x = 240; | |
gTileClips[ TILE_TOPRIGHT ].y = 0; | |
gTileClips[ TILE_TOPRIGHT ].w = TILE_WIDTH; | |
gTileClips[ TILE_TOPRIGHT ].h = TILE_HEIGHT; | |
gTileClips[ TILE_RIGHT ].x = 240; | |
gTileClips[ TILE_RIGHT ].y = 80; | |
gTileClips[ TILE_RIGHT ].w = TILE_WIDTH; | |
gTileClips[ TILE_RIGHT ].h = TILE_HEIGHT; | |
gTileClips[ TILE_BOTTOMRIGHT ].x = 240; | |
gTileClips[ TILE_BOTTOMRIGHT ].y = 160; | |
gTileClips[ TILE_BOTTOMRIGHT ].w = TILE_WIDTH; | |
gTileClips[ TILE_BOTTOMRIGHT ].h = TILE_HEIGHT; | |
} | |
} | |
//Close the file | |
map.close(); | |
//If the map was loaded fine | |
return tilesLoaded; | |
} | |
bool touchesWall( SDL_Rect box, Tile* tiles[] ) | |
{ | |
//Go through the tiles | |
for( int i = 0; i < TOTAL_TILES; ++i ) | |
{ | |
//If the tile is a wall type tile | |
if( ( tiles[ i ]->getType() >= TILE_CENTER ) && ( tiles[ i ]->getType() <= TILE_TOPLEFT ) ) | |
{ | |
//If the collision box touches the wall tile | |
if( checkCollision( box, tiles[ i ]->getBox() ) ) | |
{ | |
return true; | |
} | |
} | |
} | |
//If no wall tiles were touched | |
return false; | |
} | |
//While application is running | |
while( !quit ) | |
{ | |
//Handle events on queue | |
while( SDL_PollEvent( &e ) != 0 ) | |
{ | |
//User requests quit | |
if( e.type == SDL_QUIT ) | |
{ | |
quit = true; | |
} | |
if(e.key.keysym.sym == SDLK_q) | |
quit = true; | |
//Handle input for the dot | |
dot.handleEvent( e ); | |
} | |
//Move the dot | |
dot.move( tileSet ); | |
dot.setCamera( camera ); | |
//Clear screen | |
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF ); | |
SDL_RenderClear( gRenderer ); | |
//Render level | |
for( int i = 0; i < TOTAL_TILES; ++i ) | |
{ | |
tileSet[ i ]->render( camera ); | |
} | |
//Render dot | |
dot.render( camera ); | |
//Update screen | |
SDL_RenderPresent( gRenderer ); | |
} | |
} | |
//Free resources and close SDL | |
close( tileSet ); | |
Author
aneury1
commented
Oct 23, 2017
o("drw vX,vY,P", "Dxyl", u==0xD ,
auto put = [this](int a, unsigned char b) { return ((DispMem[a] ^= b) ^ b) & b; };
for(kk=0, x=Vx, y=Vy; p--; )
kk |= put( ((x+0)%W + (y+p)%H * W) / 8, Mem[(I+p)&0xFFF] >> ( x%8) )
| put( ((x+7)%W + (y+p)%H * W) / 8, Mem[(I+p)&0xFFF] << (8 - x%8) ); \
// calculate scaling factor
int sx = windowWidth / screenWidth;
int sy = windowHeight / screenHeight;
int scale = std::min(sx, sy);
// calculate how much the buffer should be scaled
scaleW = screenWidth * scale;
scaleH = screenHeight * scale;
scaleX = (windowWidth - scaleW) / 2;
scaleY = (windowHeight - scaleH) / 2;
sourceSets{
main{
jni.srcDirs=[]
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment