--- a/src/proto2/Physics.cc Thu Nov 20 16:28:05 2008 +0000
+++ b/src/proto2/Physics.cc Thu Nov 20 17:14:59 2008 +0000
@@ -6,7 +6,7 @@
#include <functional>
PhysicsWorld::PhysicsWorld (Vector gravity, Vector dimensions)
- : tick_timer(PHYSICS_TICK_MS), gravity(gravity), dimensions(dimensions) {
+ : tick_timer(PHYSICS_TICK_MS), gravity(gravity), dimensions(dimensions), terrain(dimensions.x, std::vector<TerrainType>(dimensions.y, DIRT) {
slots.connect(tick_timer.sig_timer(), this, &PhysicsWorld::tick);
tick_timer.enable();
@@ -135,3 +135,40 @@
this->updatePosition();
}
+/**
+ * simple random map generation
+ * first fills whole level with dirt
+ * then randomizes circles of empty or rock
+ * @param seed - seed number for random number generator
+ */
+void generateTerrain(int seed) {
+ // generating should use own random number generator, but didn't find easily how that is done
+ srand(seed);
+
+ // some constants to control random generation
+ const int min_range = 10;
+ const int max_range = 40;
+ const int num = 30;
+ const int rock_rarity = 4; // 1 / rock_rarity will be rock circle
+
+ // loops for amount of circles
+ for(int i = 0; i < num; i++) {
+ // information of new circle
+ int midx = rand()%dimensions.x;
+ int midy = rand()%dimensions.y;
+ int range = rand()%(max_range-min_range)+min_range;
+ TerrainType type = EMPTY;
+ if(rand()%rock_rarity == 0) {
+ type = ROCK;
+ }
+ // loops for every pixel of circle
+ for(int x = max(0, midx-range); x < min(dimensions.x, midx+range); x++) {
+ for(int y = max(0, midy-range); y < min(dimensions.y, midy+range); y++) {
+ if(x*x+y*y < range*range) {
+ // and sets it to type
+ terrain[x][y] = type;
+ }
+ }
+ }
+ }
+}
--- a/src/proto2/Physics.hh Thu Nov 20 16:28:05 2008 +0000
+++ b/src/proto2/Physics.hh Thu Nov 20 17:14:59 2008 +0000
@@ -22,7 +22,7 @@
protected:
std::vector<PhysicsObject*> objects;
Vector gravity;
- Vector dimensions;
+ Vector dimensions; //const requested
std::vector<std::vector<TerrainType> > terrain;