diff options
| author | miguel <miguel@localhost> | 2017-09-23 23:13:25 +0200 |
|---|---|---|
| committer | miguel <miguel@localhost> | 2017-09-23 23:13:25 +0200 |
| commit | 41c2d41746582db5439dc51a3c35b60384ea1e4a (patch) | |
| tree | b6662d7be627fe298c877b13f22c77b20e6ad71a | |
| parent | dc71cc317b960c5320cdd00171e4d1b37d4144bd (diff) | |
integrated perlin noise map into game as minimap
| -rw-r--r-- | Makefile | 5 | ||||
| -rw-r--r-- | PerlinNoise.cpp | 94 | ||||
| -rw-r--r-- | PerlinNoise.h | 28 | ||||
| -rw-r--r-- | main.cpp | 83 |
4 files changed, 208 insertions, 2 deletions
@@ -3,7 +3,7 @@ CPPFLAGS = $(shell sdl2-config --cflags --libs) run: game ./game -game: World.o main.o +game: World.o main.o PerlinNoise.o $(CXX) -o $@ $(CPPFLAGS) $^ clean: @@ -15,4 +15,5 @@ clean: browser-game: emcc --std=c++11 -O2 World.cpp -o World.bc emcc --std=c++11 -O2 main.cpp -o main.bc - emcc -O2 World.bc main.bc -o lunatic_out.html -s USE_SDL=2 --preload-file music.wav --preload-file coin.wav --preload-file coin.bmp --preload-file earth01.bmp --preload-file fonts.bmp --preload-file gridder01.bmp --preload-file guy01.bmp --preload-file guy02.bmp --preload-file gridder02.bmp --preload-file gridder03.bmp -s TOTAL_MEMORY=536870912 --shell-file shell_minimal.html + emcc --std=c++11 -O2 PerlinNoise.cpp -o PerlinNoise.bc + emcc -O2 World.bc main.bc PerlinNoise.bc -o lunatic_out.html -s USE_SDL=2 --preload-file music.wav --preload-file coin.wav --preload-file coin.bmp --preload-file earth01.bmp --preload-file fonts.bmp --preload-file gridder01.bmp --preload-file guy01.bmp --preload-file guy02.bmp --preload-file gridder02.bmp --preload-file gridder03.bmp -s TOTAL_MEMORY=536870912 --shell-file shell_minimal.html diff --git a/PerlinNoise.cpp b/PerlinNoise.cpp new file mode 100644 index 0000000..8b749e7 --- /dev/null +++ b/PerlinNoise.cpp @@ -0,0 +1,94 @@ +#include "PerlinNoise.h" +#include <cmath> +#include <random> +#include <algorithm> +#include <numeric> + +// THIS IS A DIRECT TRANSLATION TO C++11 FROM THE REFERENCE +// JAVA IMPLEMENTATION OF THE IMPROVED PERLIN FUNCTION (see http://mrl.nyu.edu/~perlin/noise/) +// THE ORIGINAL JAVA IMPLEMENTATION IS COPYRIGHT 2002 KEN PERLIN + +// I ADDED AN EXTRA METHOD THAT GENERATES A NEW PERMUTATION VECTOR (THIS IS NOT PRESENT IN THE ORIGINAL IMPLEMENTATION) + +// Initialize with the reference values for the permutation vector +PerlinNoise::PerlinNoise() { + + // Initialize the permutation vector with the reference values + p = { + 151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142, + 8,99,37,240,21,10,23,190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117, + 35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71, + 134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41, + 55,46,245,40,244,102,143,54, 65,25,63,161,1,216,80,73,209,76,132,187,208, 89, + 18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226, + 250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182, + 189,28,42,223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, + 43,172,9,129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246, + 97,228,251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239, + 107,49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 }; + // Duplicate the permutation vector + p.insert(p.end(), p.begin(), p.end()); +} + +// Generate a new permutation vector based on the value of seed +PerlinNoise::PerlinNoise(unsigned int seed) { + p.resize(256); + + // Fill p with values from 0 to 255 + std::iota(p.begin(), p.end(), 0); + + // Initialize a random engine with seed + std::default_random_engine engine(seed); + + // Suffle using the above random engine + std::shuffle(p.begin(), p.end(), engine); + + // Duplicate the permutation vector + p.insert(p.end(), p.begin(), p.end()); +} + +double PerlinNoise::noise(double x, double y, double z) { + // Find the unit cube that contains the point + int X = (int) floor(x) & 255; + int Y = (int) floor(y) & 255; + int Z = (int) floor(z) & 255; + + // Find relative x, y,z of point in cube + x -= floor(x); + y -= floor(y); + z -= floor(z); + + // Compute fade curves for each of x, y, z + double u = fade(x); + double v = fade(y); + double w = fade(z); + + // Hash coordinates of the 8 cube corners + int A = p[X] + Y; + int AA = p[A] + Z; + int AB = p[A + 1] + Z; + int B = p[X + 1] + Y; + int BA = p[B] + Z; + int BB = p[B + 1] + Z; + + // Add blended results from 8 corners of cube + double res = lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z), grad(p[BA], x-1, y, z)), lerp(u, grad(p[AB], x, y-1, z), grad(p[BB], x-1, y-1, z))), lerp(v, lerp(u, grad(p[AA+1], x, y, z-1), grad(p[BA+1], x-1, y, z-1)), lerp(u, grad(p[AB+1], x, y-1, z-1), grad(p[BB+1], x-1, y-1, z-1)))); + return (res + 1.0)/2.0; +} + +double PerlinNoise::fade(double t) { + return t * t * t * (t * (t * 6 - 15) + 10); +} + +double PerlinNoise::lerp(double t, double a, double b) { + return a + t * (b - a); +} + +double PerlinNoise::grad(int hash, double x, double y, double z) { + int h = hash & 15; + // Convert lower 4 bits of hash into 12 gradient directions + double u = h < 8 ? x : y, + v = h < 4 ? y : h == 12 || h == 14 ? x : z; + return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); +} diff --git a/PerlinNoise.h b/PerlinNoise.h new file mode 100644 index 0000000..9ef109b --- /dev/null +++ b/PerlinNoise.h @@ -0,0 +1,28 @@ +#include <vector> + +// THIS CLASS IS A TRANSLATION TO C++11 FROM THE REFERENCE +// JAVA IMPLEMENTATION OF THE IMPROVED PERLIN FUNCTION (see http://mrl.nyu.edu/~perlin/noise/) +// THE ORIGINAL JAVA IMPLEMENTATION IS COPYRIGHT 2002 KEN PERLIN + +// I ADDED AN EXTRA METHOD THAT GENERATES A NEW PERMUTATION VECTOR (THIS IS NOT PRESENT IN THE ORIGINAL IMPLEMENTATION) + +#ifndef PERLINNOISE_H +#define PERLINNOISE_H + +class PerlinNoise { + // The permutation vector + std::vector<int> p; +public: + // Initialize with the reference values for the permutation vector + PerlinNoise(); + // Generate a new permutation vector based on the value of seed + PerlinNoise(unsigned int seed); + // Get a noise value, for 2D images z can have any value + double noise(double x, double y, double z); +private: + double fade(double t); + double lerp(double t, double a, double b); + double grad(int hash, double x, double y, double z); +}; + +#endif @@ -9,7 +9,9 @@ #include <SDL_audio.h> #include "World.h" +#include "PerlinNoise.h" +#include <random> using SDLInitType=std::pair<int,std::pair<SDL_Window*,SDL_Renderer*>>; struct Context @@ -444,6 +446,10 @@ void main_loop(void *arg) SDL_RenderCopy(ctx->ren,ctx->textures[7],NULL,&rect); break; } + //show map !? + rect={100,20,150,150}; + SDL_RenderCopy(ctx->ren,ctx->textures[8],NULL,&rect); + if(ctx->world.player.dead) { sdl_put_str(ctx->ren, ctx->textures[3],300, -1, 10,"LUNATIC LEMMY DIED!",250,100,100,19,ctx->win_width,ctx->win_height,1,2); @@ -499,6 +505,83 @@ int main(int, char**){ ctx->textures.push_back(sdl_load_texture("gridder01.bmp",255,255,255,ctx->ren)); ctx->textures.push_back(sdl_load_texture("gridder02.bmp",255,255,255,ctx->ren)); ctx->textures.push_back(sdl_load_texture("gridder03.bmp",255,255,255,ctx->ren)); +// PERLIN GENEARTED MAP + ctx->textures.push_back(SDL_CreateTexture(ctx->ren, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 1024, 768)); + + double seed=22; + PerlinNoise perlin(seed); + + SDL_SetRenderTarget(ctx->ren, ctx->textures[8]); + SDL_SetRenderDrawColor(ctx->ren, 0x00, 0x00, 0x00, 0x00); + SDL_RenderClear(ctx->ren); + + +// std::random_device rd(seed); //Will be used to obtain a seed for the random number engine + std::mt19937 gen(seed); //Standard mersenne_twister_engine seeded with rd() + std::uniform_int_distribution<> dis(0,50); + + for(int x=0;x<1024;x++) + for(int y=0;y<768;y++) + { + //SDL_SetRenderDrawColor(ren, (0.7*perlin.noise(x/1024.0*20,y/768.0*20,0)+0.2*perlin.noise(x/1024.0*200,y/768.0*200,0))*0xFF, 0x00, 0x00, 0x00); + double per1=perlin.noise(x/1024.0*3,y/768.0*3,0); + double per2=perlin.noise(x/1024.0*50,y/768.0*50,0); + if(per1<0.4)per1+=per2*0.1; + + if(per1<0.25)SDL_SetRenderDrawColor(ctx->ren, 0x00, 0x00, 0x99, 0x00); + else if(per1<0.4)SDL_SetRenderDrawColor(ctx->ren, 0x00, 0x33, 0xff, 0x00); + else if(per1<0.51)SDL_SetRenderDrawColor(ctx->ren, 0x55, 0xff, 0x55,0x00); + else if(per1<0.8) + { + SDL_SetRenderDrawColor(ctx->ren, 0x33, 0x99, 0x33,0x00); + } + else if(per1<0.85)SDL_SetRenderDrawColor(ctx->ren, 0x99, 0x99, 0x99,0x00); + else SDL_SetRenderDrawColor(ctx->ren, 0xff, 0xff, 0xff, 0x00); + //else SDL_SetRenderDrawColor(ren, perlin.noise(x/1024.0*20,y/768.0*20,0)*100, 0x00, 0x00, 0x00); + + SDL_RenderDrawPoint(ctx->ren,x,y); + } + + for(int i=0;i<30;i++) + { + int x=dis(gen); + int y=dis(gen); + int t=dis(gen); + SDL_Rect r; + r.x=1024*x/50+25; + r.y=768*y/50+25; + double per1=perlin.noise(r.x/1024.0*3,r.y/768.0*3,0); + double per2=perlin.noise(r.x/1024.0*50,r.y/768.0*50,0); + if(per1<0.4)per1+=per2*0.1; + r.w=1024/100; + r.h=768/100; + + if(per1<0.4) + { + SDL_SetRenderDrawColor(ctx->ren, 0x00, 0x00, 0x00,0x00); + SDL_RenderFillRect(ctx->ren,&r); + sdl_put_str(ctx->ren,ctx->textures[3], r.x+5, r.y,15,"boat",255,0,0,12,0,0,0,0); + } + + if(per1>0.51&&per1<0.8) + { + SDL_SetRenderDrawColor(ctx->ren, 0x00, 0x00, 0x00,0x00); + SDL_RenderFillRect(ctx->ren,&r); +// sdl_put_str(ren, textures[0],10, 10, 10,strbuffer.str(),222,255,222,60,win_width,win_height,1,1); + if(t<10)sdl_put_str(ctx->ren,ctx->textures[3], r.x+5, r.y,15,"blacksmith",0,0,0,12,0,0,0,0); + else if(t<20)sdl_put_str(ctx->ren,ctx->textures[3], r.x+5, r.y,15,"inn",255,0,255,12,0,0,0,0); + else if(t<30)sdl_put_str(ctx->ren,ctx->textures[3], r.x+5, r.y,15,"armory",255,255,0,12,0,0,0,0); + else if(t<40)sdl_put_str(ctx->ren,ctx->textures[3], r.x+5, r.y,15,"quest",0,255,255,12,0,0,0,0); + else sdl_put_str(ctx->ren,ctx->textures[3], r.x+5, r.y,15,"safehouse",255,255,255,12,0,0,0,0); + } + } + SDL_SetRenderTarget(ctx->ren, NULL); + +// PERLIN GENEARTED MAP OVER + + + + ctx->show_tiles_size=ctx->win_height/15; ctx->show_tiles_back=ctx->win_width/ctx->show_tiles_size*0.25; |
