#include "raylib.h" // This is our tile map. int map[10][20] = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1}, {1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1}, {1,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}}; static float tileWidth; static float tileHeight; static int mapWidth; static int mapHeight; typedef struct player{ Vector2 position; int width; int height; }player; static player myplayer = {0}; // uses the myplayer.position coordinates. // If offsetx is 1 then it checks if the player x position PLus 1 is colliding with a tile. static bool playertilecollide(int offsetx,int offsety); static bool rectsoverlap(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2); int main(void) { // Initialization //-------------------------------------------------------------------------------------- const int screenWidth = 800; const int screenHeight = 450; mapWidth = 20; mapHeight = 10; // Our tile width and height. We use the screen dimension and the map dimension to // get tile dimensions that fill up the entire screen. tileWidth = (float)screenWidth/(float)mapWidth; tileHeight = (float)screenHeight/(float)mapHeight; InitWindow(screenWidth, screenHeight, "raylib example."); // Our player setup myplayer.position = (Vector2){4*tileWidth,6*tileHeight}; myplayer.width = tileWidth/2; myplayer.height = tileHeight/2; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- // Below here we read the key. If the l/r/u/d cursor is pressed then we check the new position is inside // the array bounds and then we check if the collision map on the new position is not set to flag true on that tile. if(IsKeyDown(KEY_RIGHT)&& myplayer.position.x+1<(mapWidth-1)*tileWidth){ if(playertilecollide(1,0)==false){ myplayer.position.x+=1; } } if(IsKeyDown(KEY_LEFT) && myplayer.position.x-1>-1){ if(playertilecollide(-1,0)==false){ myplayer.position.x-=1; } } if(IsKeyDown(KEY_UP)&& myplayer.position.y-1>-1){ if(playertilecollide(0,-1)==false){ myplayer.position.y-=1; } } if(IsKeyDown(KEY_DOWN) && myplayer.position.y+1<(mapHeight-1)*tileHeight){ if(playertilecollide(0,1)==false){ myplayer.position.y+=1; } } //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(RAYWHITE); // Draw our tilemap. for(int y=0;y<10;y++){ for(int x=0;x<20;x++){ if(map[y][x]==1){ DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,BLACK); } } } // Draw our player DrawRectangle(myplayer.position.x,myplayer.position.y,myplayer.width,myplayer.height,RED); DrawText("Use Cursor Keys to move around..",0,0,20,WHITE); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; } //Unit collide with solid blocks true/false bool playertilecollide(int offsetx,int offsety){ int cx = (myplayer.position.x+offsetx)/tileWidth; int cy = (myplayer.position.y+offsety)/tileHeight; for(int y2=cy-1; y2=0 && x2=0 && y2= (x2 + w2) || (x1 + w1) <= x2) return false; if(y1 >= (y2 + h2) || (y1 + h1) <= y2) return false; return true; }