Browse Source

Create wip_-_infinite_scroll.c

Rudy Boudewijn van Etten 4 năm trước cách đây
mục cha
commit
2949e4250d
1 tập tin đã thay đổi với 227 bổ sung0 xóa
  1. 227 0
      ProcGen/wip_-_infinite_scroll.c

+ 227 - 0
ProcGen/wip_-_infinite_scroll.c

@@ -0,0 +1,227 @@
+//
+// Trying to figure out how to do larger terrain by generating at the edges - work in progress
+//
+//
+
+
+
+#include "raylib.h"
+#include <math.h>
+
+static int map[600][600];
+
+static int mapWidth = 600;
+static int mapHeight = 600;
+static float tileWidth;
+static float tileHeight;
+static const int screenWidth = 640;
+static const int screenHeight = 480;
+
+static void makemap(int px, int py);
+static void drawmap();
+static void drawmap2();
+static void genmap();
+static void edgemap();
+
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+
+    InitWindow(screenWidth, screenHeight, "raylib example.");
+
+    // We want to have the tile width and height fill the entire screen.
+    tileWidth =  1;//ceil((float)screenWidth / (float)mapWidth);
+    tileHeight = 1;//ceil((float)screenHeight / (float)mapHeight);
+    genmap();
+
+    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
+    //--------------------------------------------------------------------------------------
+    int scrolly=0;
+    // Main game loop
+    while (!WindowShouldClose())    // Detect window close button or ESC key
+    {
+        // Update
+        //----------------------------------------------------------------------------------
+        if(IsKeyDown(KEY_SPACE)){
+            genmap();
+        }
+        //if(IsKeyPressed(KEY_A)){
+
+        for(int y=3;y<mapHeight;y++){
+        for(int x=0;x<mapWidth;x++){
+            map[x][y-3] = map[x][y];
+        }    
+        }
+
+        scrolly++;
+        if(scrolly>16){
+            
+            edgemap();
+            scrolly=0;
+        }
+        //}
+        //----------------------------------------------------------------------------------
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginDrawing();
+
+            ClearBackground(RAYWHITE);
+            drawmap2();  
+
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+    // De-Initialization
+    //--------------------------------------------------------------------------------------
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+
+    return 0;
+
+
+}
+
+static void makemap(int px,int py){
+
+
+    // First we create a couple of hills in the map
+    // We create a random spot and draw a line there somewhat randomly
+    // We create a line of some sort to create more realistic landmasses. :Experiment:
+    int rx,ry;
+    for(int i=0;i<40/4;i++){
+        rx = GetRandomValue(-10,60-5);
+        ry = GetRandomValue(-10,60-5);
+        int mx=GetRandomValue(-1,1);
+        int my=GetRandomValue(-1,1);
+        int len=GetRandomValue(1,50/4);
+        for(int ii=0;ii<len;ii++){
+            if(GetRandomValue(0,10)<2){
+                mx=GetRandomValue(-1,1);
+                my=GetRandomValue(-1,1);
+            }
+            int nx=rx+mx;
+            int ny=ry+my;
+            
+            //if(nx>0&&nx<55-1 && ny>0 && ny<55-1){
+              if(nx+px<mapWidth && nx+px>-1 &&  ny+py<mapHeight && ny+py>-1){
+                map[nx+px][ny+py]++;
+              }
+            //}
+        }
+        
+    }
+    // Now we want to pile sand ontop and right next to the current hills.
+    // This will make them into larger hills. We do this by picking a random
+    // spot. If there is something below that we increase the height there.
+    int clunk=(50*50)*5;//GetRandomValue(2,3);
+    for(int i=0;i<clunk;i++){
+        int nx,ny;
+        nx = GetRandomValue(-100,100-2);
+        ny = GetRandomValue(-100,100-2);
+        if(map[nx+px][ny+py]>0){
+            for(int y=-1;y<2;y++){
+                for(int x=-1;x<2;x++){
+                    if(nx+x+px>-1 && nx+x+px<mapWidth && ny+y+py>-1 && ny+y+py<mapHeight){
+                    map[nx+x+px][ny+y+py]++;
+                    }
+                }
+            }
+        }
+        
+    }
+    
+    
+};
+
+static void drawmap2(){
+    int tileWidth2 = tileWidth*2;
+    int tileHeight2 = tileHeight*2;
+    int mapWidth2 = mapWidth/2;
+    int mapHeight2 = mapHeight/2;
+    for(int y=0;y<mapHeight2;y++){
+    for(int x=0;x<mapWidth2+20;x++){
+        int value = map[x+96][y];
+        if(value==0){ // water
+            DrawRectangle(x*tileWidth2,y*tileHeight2,tileWidth2,tileHeight2,BLUE);
+        }        
+        if(value>0){
+            if(value>0){//Draw the beach
+            DrawRectangle(x*tileWidth2,y*tileHeight2,tileWidth2,tileHeight2,(Color){250,220,0,255});
+            }
+
+            if(value>3){//If the height is larger than 3 than draw trees
+            DrawRectangle(x*tileWidth2,y*tileHeight2,tileWidth2,tileHeight2,(Color){0,210,0,255});
+            }
+            if(value>10){ // here we draw some more trees            
+            DrawRectangle(x*tileWidth2,y*tileHeight2,tileWidth2,tileHeight2,(Color){0,140,0,255});
+            }
+
+            if(value>22){ // draw mountains or rocks
+            int col=(value-22)*4;
+            DrawRectangle(x*tileWidth2,y*tileHeight2,tileWidth2,tileHeight2,(Color){110+col,110+col,110+col,255});
+            }
+
+        }
+
+    }    
+    }    
+};
+
+static void drawmap(){
+    for(int y=0;y<mapHeight;y++){
+    for(int x=0;x<mapWidth;x++){
+        if(map[x][y]==0){ // water
+            DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,BLUE);
+        }        
+        if(map[x][y]>0){
+            if(map[x][y]>0){//Draw the beach
+            DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,(Color){250,220,0,255});
+            }
+
+            if(map[x][y]>3){//If the height is larger than 3 than draw trees
+            DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,(Color){0,210,0,255});
+            }
+            if(map[x][y]>10){ // here we draw some more trees            
+            DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,(Color){0,140,0,255});
+            }
+
+            if(map[x][y]>22){ // draw mountains or rocks
+            int col=(map[x][y]-22)*4;
+            DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,(Color){110+col,110+col,110+col,255});
+            }
+
+        }
+
+    }    
+    }    
+};
+
+//
+// Here we generate a new map part at the bottom part of the map
+// we shift the map up in memory to make place for that new part.
+// For scrolling back to the origal part we would need to save the map and
+// reload it.
+//
+//
+static void edgemap(){
+    
+    for(int y=8;y<9;y++){
+    for(int x=2;x<9;x++){
+        makemap(x*50,y*50);
+    }}
+}
+
+static void genmap(){
+    // Here we generate the map using the hill algorithm
+    for(int y=0;y<mapHeight;y++){
+    for(int x=0;x<mapWidth;x++){
+        map[x][y]=0;
+    }}
+
+    for(int y=2;y<9;y++){
+    for(int x=2;x<9;x++){
+        makemap(x*50,y*50);
+    }}
+};