summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--PerlinNoise.cpp94
-rw-r--r--PerlinNoise.h28
-rw-r--r--main.cpp83
4 files changed, 208 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index af6cd3d..2045c66 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/main.cpp b/main.cpp
index f11d658..a218da5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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;