Browse Source

Spawn objects from file

Kenneth van Ewijk 9 năm trước cách đây
mục cha
commit
d83cc6403c
8 tập tin đã thay đổi với 64 bổ sung6 xóa
  1. 1 0
      CrystalPoint.vcxproj
  2. 3 0
      CrystalPoint.vcxproj.filters
  3. 19 2
      HeightMap.cpp
  4. 3 1
      HeightMap.h
  5. 26 2
      World.cpp
  6. 5 0
      World.h
  7. 7 1
      worlds/small.json
  8. BIN
      worlds/small.png

+ 1 - 0
CrystalPoint.vcxproj

@@ -184,6 +184,7 @@
   <ItemGroup>
     <None Include="worlds\fire.json" />
     <None Include="worlds\ice.json" />
+    <None Include="worlds\small.json" />
     <None Include="worlds\worlds.json" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+ 3 - 0
CrystalPoint.vcxproj.filters

@@ -118,5 +118,8 @@
     <None Include="worlds\ice.json">
       <Filter>Source Files\json</Filter>
     </None>
+    <None Include="worlds\small.json">
+      <Filter>Source Files\json</Filter>
+    </None>
   </ItemGroup>
 </Project>

+ 19 - 2
HeightMap.cpp

@@ -2,12 +2,19 @@
 #include "stb_image.h"
 #include "vector.h"
 
+#include "LevelObject.h"
+
 #include <GL/freeglut.h>
 #include <iostream>
 #include <string>
+#include "World.h"
 
+#define RED 0
+#define GREEN 1
+#define BLUE 2
+#define ALPHA 3
 
-HeightMap::HeightMap(const std::string &file, float scale)
+HeightMap::HeightMap(const std::string &file, float scale, World* world)
 {
 	this->scale = scale;
 
@@ -16,7 +23,12 @@ HeightMap::HeightMap(const std::string &file, float scale)
 
 	auto heightAt = [&](int x, int y)
 	{
-		return (imgData[(x + y * width) * 4] / 256.0f) * 100.0f;
+		return (imgData[(x + y * width) * 4 ] / 256.0f) * 100.0f;
+	};
+
+	auto valueAt = [&](int x, int y, int offset = 0)
+	{
+		return imgData[(x + y * width) * 4 + offset];
 	};
 
 	for (int y = 0; y < height-1; y++)
@@ -27,6 +39,11 @@ HeightMap::HeightMap(const std::string &file, float scale)
 			Vec3f ca(0, heightAt(x, y + 1) - heightAt(x, y), 1);
 			Vec3f ba(1, heightAt(x + 1, y) - heightAt(x, y), 0);
 
+			if (valueAt(x, y, GREEN) > 0)
+			{
+				world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)), Vec3f(x*scale, heightAt(x, y), y*scale), Vec3f(0, rand()%360, 0), 1, true));
+			}
+
 			Vec3f normal = ca.cross(ba);
 			normal.Normalize();
 

+ 3 - 1
HeightMap.h

@@ -5,6 +5,8 @@
 #include <vector>
 #include <GL/freeglut.h>
 
+class World;
+
 class HeightMap
 {
 private:
@@ -14,7 +16,7 @@ private:
 	GLuint imageIndex;
 	int scale;
 public:
-	HeightMap(const std::string &file, float scale);
+	HeightMap(const std::string &file, float scale, World* world);
 	~HeightMap();
 
 	void Draw();

+ 26 - 2
World.cpp

@@ -1,7 +1,6 @@
 #include "World.h"
 #include <GL/freeglut.h>
 #include "Entity.h"
-#include "LevelObject.h"
 #include "json.h"
 #include "Model.h"
 #include <fstream>
@@ -18,18 +17,27 @@ World::World(const std::string &fileName)
 	json::Value v = json::readJson(file);
 	file.close();
 
+	//Check file
 	if(v["world"].isNull() || v["world"]["heightmap"].isNull())
 		std::cout << "Invalid world file: world - " << fileName << "\n";
 	if (v["player"].isNull() || v["player"]["startposition"].isNull())
 		std::cout << "Invalid world file: player - " << fileName << "\n";
 	if (v["objects"].isNull())
 		std::cout << "Invalid world file: objects - " << fileName << "\n";
+	if (v["world"]["object-templates"].isNull())
+		std::cout << "Invalid world file: object templates - " << fileName << "\n";
 
 	float scale = 1.0f;
 	if (!v["world"]["scale"].isNull())
 		scale = v["world"]["scale"].asFloat();
 
-	heightmap = new HeightMap(v["world"]["heightmap"].asString(), scale);
+	//Load object templates
+	for (auto objt : v["world"]["object-templates"])
+	{
+		objecttemplates.push_back(std::pair<int, std::string>(objt["color"], objt["file"]));
+	}
+
+	heightmap = new HeightMap(v["world"]["heightmap"].asString(), scale, this);
 
 	if(!v["world"]["texture"].isNull())
 		heightmap->SetTexture(v["world"]["texture"].asString());
@@ -90,6 +98,17 @@ World::~World()
 	delete heightmap;
 }
 
+std::string World::getObjectFromValue(int val)
+{
+	for (auto i : objecttemplates)
+	{
+		if (i.first == val)
+			return i.second;
+	}
+
+	return objecttemplates[0].second;
+}
+
 float World::getHeight(float x, float y)
 {
 	return heightmap->GetHeight(x, y);
@@ -152,6 +171,11 @@ void World::update(float elapsedTime)
 	}
 }
 
+void World::addLevelObject(LevelObject* obj)
+{
+	entities.push_back(obj);
+}
+
 bool World::isPlayerPositionValid()
 {
 	for (auto e : entities)

+ 5 - 0
World.h

@@ -4,11 +4,14 @@
 #include "HeightMap.h"
 #include "Player.h"
 #include "Enemy.h"
+#include "LevelObject.h"
 
 class Entity;
 
 class World
 {
+private:
+	std::vector<std::pair<int, std::string>> objecttemplates;
 public:
 	World(const std::string &fileName);
 	~World();
@@ -23,5 +26,7 @@ public:
 	void update(float elapsedTime);
 	bool isPlayerPositionValid();
 	float getHeight(float x, float y);
+	void addLevelObject(LevelObject* obj);
+	std::string getObjectFromValue(int i);
 };
 

+ 7 - 1
worlds/small.json

@@ -1,7 +1,13 @@
 {
    "world": {
     "heightmap": "worlds/small.png",
-    "scale": 1
+    "scale": 1,
+	"object-templates": [
+		{
+			"color":100,
+			"file": "models/boom/Boom.obj"
+		}
+	]
    },
   "player": {
     "startposition": [ 20, 5, 20 ]

BIN
worlds/small.png