소스 검색

Create Example_-_MapSmoothplayer.c

Rudy Boudewijn van Etten 5 년 전
부모
커밋
71e6586f85
1개의 변경된 파일147개의 추가작업 그리고 0개의 파일을 삭제
  1. 147 0
      Example_-_MapSmoothplayer.c

+ 147 - 0
Example_-_MapSmoothplayer.c

@@ -0,0 +1,147 @@
+
+#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<cy+2;y2++){//Note that the - and + are to be set differently with differently sized players
+    for(int x2=cx-1; x2<cx+2;x2++){
+        if(x2>=0 && x2<mapWidth && y2>=0 && y2<mapHeight){
+            if(map[y2][x2] == 1){
+                int x3 = (x2)*tileWidth;
+                int y3 = (y2)*tileHeight;
+                if(rectsoverlap(myplayer.position.x+offsetx,myplayer.position.y+offsety,myplayer.width,myplayer.height,x3,y3,tileWidth,tileHeight)){
+                    return true;
+                }
+            }
+        }
+    }}
+    return false;
+}
+
+// Rectangles overlap
+bool rectsoverlap(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2){
+    if(x1 >= (x2 + w2) || (x1 + w1) <= x2) return false;
+    if(y1 >= (y2 + h2) || (y1 + h1) <= y2) return false;
+    return true;
+}