123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- /*
- Pattern Movement Example.
- Move a computer entity around using a set of instructions. (pattern)
- There are a lot of use cases for having a predefined set of commands. You might want
- to create a patrol path for a bad guy. "A forest troll patrolling between his lair and the bridge."
- When he spots you he attacks or flees.
- You could also use this method for genetic algorithms where you mutate the commands and see if they have any good result(scoring)
- You might just want to let a spaceship fly down in a circle like pattern! So many possibilities.
- */
- #include "raylib.h"
- // This is for our map.
- static int mapwidth=20;
- static int mapheight=10;
- static 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}};
-
- // The enum are for the instructions inside the agent command array.
- enum flag{up,down,left,right,wait1,wait2,stop};
- typedef struct agent{
- bool active;
- int x;
- int y;
- double time;
- int commandposition; // Where in the command array are we at.
- int command[1024]; // The array containing the movement instructions.
- }agent;
- static void moveagent(void);
- // Create our agent.
- static agent myagent;
- int main(void)
- {
- // Initialization
- //--------------------------------------------------------------------------------------
- const int screenWidth = 800;
- const int screenHeight = 450;
- InitWindow(screenWidth, screenHeight, "raylib example.");
- float tilewidth = (float)screenWidth/(float)mapwidth;
- float tileheight = (float)screenHeight/(float)mapheight;
-
- // initialize agent.
- myagent.active = true;
- myagent.x = 1;
- myagent.y = 1;
- myagent.commandposition = 0; // we start at the first slot in the command array.
- // This is the set of instructions we give the agent to let him move around the map. (script!)
- int c[1024] = { right,wait1,right,wait1,right,wait1,right,wait1,right,wait1,
- right,wait1,right,wait1,down,wait1,down,wait2,down,wait1,
- down,wait1,down,wait1,down,wait1,right,wait2,right,wait1,
- left,wait1,left,wait1,left,wait1,left,wait1,left,wait1,stop};
- // Put the instructions inside the myagent command array.
- for(int i=0;i<1024;i++){
- myagent.command[i] = c[i];
- if(c[i]==stop)break;
- }
-
- 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
- //----------------------------------------------------------------------------------
-
- moveagent();
-
- //----------------------------------------------------------------------------------
- // 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 agent.
- DrawRectangle(myagent.x*tilewidth,myagent.y*tileheight,tilewidth,tileheight,RED);
-
- EndDrawing();
- //----------------------------------------------------------------------------------
- }
- // De-Initialization
- //--------------------------------------------------------------------------------------
- CloseWindow(); // Close window and OpenGL context
- //--------------------------------------------------------------------------------------
- return 0;
- }
- // With this function we move the agent around. His instructions are inside the command array.
- //
- void moveagent(){
- if (myagent.active==false)return;
- if (myagent.command[myagent.commandposition]==stop)return; // He has finished his current set of instructions. 'stop'
- //
- switch (myagent.command[myagent.commandposition]){
- case up:// up is a enum
- myagent.y-=1;
- myagent.commandposition+=1;
- break;
- case down:
- myagent.y+=1;
- myagent.commandposition+=1;
- break;
- case left:
- myagent.x-=1;
- myagent.commandposition+=1;
- break;
- case right:
- myagent.x+=1;
- myagent.commandposition+=1;
- break;
- case wait1://wait for a certain amount of time.
- if(myagent.time<1)myagent.time+=0.05f;
- if(myagent.time>=1){
- myagent.time=0;
- myagent.commandposition+=1;
- }
- break;
- case wait2: //wait longer.
- if(myagent.time<2)myagent.time+=0.05f;
- if(myagent.time>=2){
- myagent.time=0;
- myagent.commandposition+=1;
- }
- break;
- case stop://do nothing
- break;
- }
-
- }
|