// // FLOW fields - work in progress // #define MAX_AGENTS 50 #include "raylib.h" #include // 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,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,0,0,0,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,0,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}; static float flowfieldmap[10][20] = {0}; typedef struct agent{ Vector2 position; int width; int height; Vector2 target; float speed; int pausetime; }agent; static struct agent arr_agent[MAX_AGENTS]; // 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); static float getangle(float x1,float y1,float x2,float y2); 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; for(int y=0;y-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; } } if(IsMouseButtonPressed(0)){ for(int i=0;i0){ arr_agent[i].pausetime--; } if(arr_agent[i].pausetime>0)continue; float angle = getangle(arr_agent[i].position.x,arr_agent[i].position.y,arr_agent[i].target.x,arr_agent[i].target.y); Vector2 oldPos = arr_agent[i].position; int posx=arr_agent[i].position.x/tileWidth; int posy=arr_agent[i].position.y/tileHeight; arr_agent[i].position.x+= cos(angle); arr_agent[i].position.y+= sin(angle); if(flowfieldmap[posy][posx]!=0){ arr_agent[i].position.x+= cos(flowfieldmap[posy][posx])/1.5; arr_agent[i].position.y+= sin(flowfieldmap[posy][posx])/1.5; } for(int j=0;j=0 && x2=0 && y2= (x2 + w2) || (x1 + w1) <= x2) return false; if(y1 >= (y2 + h2) || (y1 + h1) <= y2) return false; return true; } // Return the angle from - to in float float getangle(float x1,float y1,float x2,float y2){ return (float)atan2(y2-y1, x2-x1); }