Merge branch 'developer' into heightmapTrees

# Conflicts:
#	CrystalPoint.cpp
#	HeightMap.cpp
This commit is contained in:
2016-06-03 11:39:19 +02:00
22 changed files with 315 additions and 90 deletions
+9 -18
View File
@@ -6,10 +6,14 @@
#include "WorldHandler.h" #include "WorldHandler.h"
#include "Player.h" #include "Player.h"
int CrystalPoint::width = 0;
int CrystalPoint::height = 0;
void CrystalPoint::init() void CrystalPoint::init()
{ {
player = Player::getInstance(); player = Player::getInstance();
worldhandler = WorldHandler::getInstance(); worldhandler = WorldHandler::getInstance();
//cursor = Cursor::getInstance();
lastFrameTime = 0; lastFrameTime = 0;
@@ -35,22 +39,7 @@ void CrystalPoint::draw()
worldhandler->draw(); worldhandler->draw();
//Draw Cursor //cursor->draw();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,width, height,0,-10,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glColor4f(1, cos(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), sin(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), 1);
glBegin(GL_TRIANGLES);
glVertex2f(mousePosition.x, mousePosition.y);
glVertex2f(mousePosition.x+15, mousePosition.y+15);
glVertex2f(mousePosition.x+5, mousePosition.y+20);
glEnd();
glutSwapBuffers(); glutSwapBuffers();
} }
@@ -78,7 +67,7 @@ void CrystalPoint::update()
if (player->rotation.x < -90) if (player->rotation.x < -90)
player->rotation.x = -90; player->rotation.x = -90;
float speed = 2; float speed = 1;
Vec3f oldPosition = player->position; Vec3f oldPosition = player->position;
if (keyboardState.keys['a']) player->setPosition(0, deltaTime*speed, false); if (keyboardState.keys['a']) player->setPosition(0, deltaTime*speed, false);
@@ -91,11 +80,13 @@ void CrystalPoint::update()
if (!worldhandler->isPlayerPositionValid()) if (!worldhandler->isPlayerPositionValid())
player->position = oldPosition; player->position = oldPosition;
player->position.y = worldhandler->getHeight(player->position.x, player->position.z) + 2.5f; player->position.y = worldhandler->getHeight(player->position.x, player->position.z) + 1.7f;
worldhandler->update(deltaTime); worldhandler->update(deltaTime);
mousePosition = mousePosition + mouseOffset; mousePosition = mousePosition + mouseOffset;
//cursor->update(mousePosition);
mouseOffset = Vec2f(0, 0); mouseOffset = Vec2f(0, 0);
prevKeyboardState = keyboardState; prevKeyboardState = keyboardState;
+1 -2
View File
@@ -24,12 +24,11 @@ public:
WorldHandler* worldhandler; WorldHandler* worldhandler;
Player* player; Player* player;
int width, height; static int width, height;
KeyboardState keyboardState; KeyboardState keyboardState;
KeyboardState prevKeyboardState; KeyboardState prevKeyboardState;
Vec2f mouseOffset; Vec2f mouseOffset;
Vec2f mousePosition; Vec2f mousePosition;
float lastFrameTime; float lastFrameTime;
+4
View File
@@ -152,9 +152,11 @@
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="CrystalPoint.cpp" /> <ClCompile Include="CrystalPoint.cpp" />
<ClCompile Include="Cursor.cpp" />
<ClCompile Include="Enemy.cpp" /> <ClCompile Include="Enemy.cpp" />
<ClCompile Include="Entity.cpp" /> <ClCompile Include="Entity.cpp" />
<ClCompile Include="HeightMap.cpp" /> <ClCompile Include="HeightMap.cpp" />
<ClCompile Include="Interface.cpp" />
<ClCompile Include="json.cpp" /> <ClCompile Include="json.cpp" />
<ClCompile Include="LevelObject.cpp" /> <ClCompile Include="LevelObject.cpp" />
<ClCompile Include="Main.cpp" /> <ClCompile Include="Main.cpp" />
@@ -167,9 +169,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="CrystalPoint.h" /> <ClInclude Include="CrystalPoint.h" />
<ClInclude Include="Cursor.h" />
<ClInclude Include="Enemy.h" /> <ClInclude Include="Enemy.h" />
<ClInclude Include="Entity.h" /> <ClInclude Include="Entity.h" />
<ClInclude Include="HeightMap.h" /> <ClInclude Include="HeightMap.h" />
<ClInclude Include="Interface.h" />
<ClInclude Include="json.h" /> <ClInclude Include="json.h" />
<ClInclude Include="LevelObject.h" /> <ClInclude Include="LevelObject.h" />
<ClInclude Include="Main.h" /> <ClInclude Include="Main.h" />
+15 -3
View File
@@ -63,6 +63,12 @@
<ClCompile Include="CrystalPoint.cpp"> <ClCompile Include="CrystalPoint.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Cursor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Interface.cpp">
<Filter>Source Files\World</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="World.h"> <ClInclude Include="World.h">
@@ -77,9 +83,6 @@
<ClInclude Include="LevelObject.h"> <ClInclude Include="LevelObject.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="vector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Model.h"> <ClInclude Include="Model.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -107,6 +110,15 @@
<ClInclude Include="CrystalPoint.h"> <ClInclude Include="CrystalPoint.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Interface.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Cursor.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="vector.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="worlds\worlds.json"> <None Include="worlds\worlds.json">
+58
View File
@@ -0,0 +1,58 @@
#include "Cursor.h"
#include <GL\freeglut.h>
#include <cmath>
#include "CrystalPoint.h"
Cursor* Cursor::instance = NULL;
Cursor::Cursor()
{
enabled = false;
}
Cursor::~Cursor()
{
}
Cursor* Cursor::getInstance(void)
{
if (instance == nullptr)
instance = new Cursor();
return instance;
}
void Cursor::enable(bool enable)
{
enabled = enable;
}
bool Cursor::isEnabled(void)
{
return enabled;
}
void Cursor::draw(void)
{
//Draw Cursor
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, CrystalPoint::width, CrystalPoint::height, 0, -10, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glColor4f(1, cos(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), sin(glutGet(GLUT_ELAPSED_TIME) / 1000.0f), 1);
glBegin(GL_TRIANGLES);
glVertex2f(mousePosition.x, mousePosition.y);
glVertex2f(mousePosition.x + 15, mousePosition.y + 15);
glVertex2f(mousePosition.x + 5, mousePosition.y + 20);
glEnd();
}
void Cursor::update(Vec2f newPosition)
{
mousePosition = newPosition;
}
+24
View File
@@ -0,0 +1,24 @@
#pragma once
#include "Vector.h"
class Cursor
{
private:
Cursor();
static Cursor* instance;
bool enabled;
Vec2f mousePosition;
public:
~Cursor();
static Cursor* getInstance(void);
void enable(bool enable);
bool isEnabled(void);
void draw(void);
void update(Vec2f newPosition);
};
+1 -1
View File
@@ -31,7 +31,7 @@ void Entity::draw()
glRotatef(rotation.y, 0, 1, 0); glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1); glRotatef(rotation.z, 0, 0, 1);
glScalef(scale, scale, scale); glScalef(scale, scale, scale);
glTranslatef(-model->center.x, 0, -model->center.z); //collision gaat hierdoor kapot glTranslatef(-model->center.x, 0, -model->center.z);
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); glCullFace(GL_BACK);
+11 -21
View File
@@ -14,16 +14,14 @@
#define BLUE 2 #define BLUE 2
#define ALPHA 3 #define ALPHA 3
HeightMap::HeightMap(const std::string &file, float scale, World* world) HeightMap::HeightMap(const std::string &file, World* world)
{ {
this->scale = scale;
int bpp; int bpp;
unsigned char* imgData = stbi_load(file.c_str(), &width, &height, &bpp, 4); unsigned char* imgData = stbi_load(file.c_str(), &width, &height, &bpp, 4);
auto heightAt = [&](int x, int y) auto heightAt = [&](int x, int y)
{ {
return (imgData[(x + y * width) * 4 ] / 256.0f) * 100.0f; return (imgData[(x + y * width) * 4 ] / 256.0f) * 50.0f;
}; };
auto valueAt = [&](int x, int y, int offset = 0) auto valueAt = [&](int x, int y, int offset = 0)
@@ -40,21 +38,9 @@ HeightMap::HeightMap(const std::string &file, float scale, World* world)
Vec3f ba(1, heightAt(x + 1, y) - heightAt(x, y), 0); Vec3f ba(1, heightAt(x + 1, y) - heightAt(x, y), 0);
if ((valueAt(x, y, GREEN) >= 10) && (valueAt(x,y,GREEN) <= 100)) 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)); world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)).first, Vec3f(x, heightAt(x, y), y), Vec3f(0, rand()%360, 0), 1, world->getObjectFromValue(valueAt(x, y, GREEN)).second));
}
if (valueAt(x, y, GREEN) == 180 || valueAt(x, y, GREEN) == 190 || valueAt(x, y, GREEN) == 170 || valueAt(x, y, GREEN) == 250)
{
world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)), Vec3f(x*scale, heightAt(x, y), y*scale), Vec3f(0, 0, 0), 1, true));
}
if ((valueAt(x, y, GREEN) >= 200) && (valueAt(x, y, GREEN) <= 240))
{
world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)), Vec3f(x*scale, heightAt(x, y), y*scale), Vec3f(0, 0, 0), 1, false));
}
if (valueAt(x, y, GREEN) == 160)
{
world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)), Vec3f(x*scale, heightAt(x, y), y*scale), Vec3f(0, 0, 0), 1, false));
} }
Vec3f normal = ca.cross(ba); Vec3f normal = ca.cross(ba);
@@ -63,7 +49,7 @@ HeightMap::HeightMap(const std::string &file, float scale, World* world)
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
float h = heightAt(x + offsets[i][0], y + offsets[i][1]); float h = heightAt(x + offsets[i][0], y + offsets[i][1]);
vertices.push_back(Vertex{ (float)(x + offsets[i][0])*scale, h*scale, (float)(y + offsets[i][1])*scale, vertices.push_back(Vertex{ (float)(x + offsets[i][0]), h, (float)(y + offsets[i][1]),
normal.x, normal.y, normal.z, normal.x, normal.y, normal.z,
(x + offsets[i][0]) / (float)height, (y + offsets[i][1]) / (float)width } ); (x + offsets[i][0]) / (float)height, (y + offsets[i][1]) / (float)width } );
} }
@@ -121,13 +107,17 @@ void HeightMap::Draw()
float HeightMap::GetHeight(float x, float y) float HeightMap::GetHeight(float x, float y)
{ {
x /= scale;
y /= scale;
int ix = x; int ix = x;
int iy = y; int iy = y;
int index = (ix + (width - 1) * iy) * 4; int index = (ix + (width - 1) * iy) * 4;
if (index + 3 >= vertices.size())
index = vertices.size() - 4;
if (index < 0)
index = 0;
Vertex& a = vertices[index]; Vertex& a = vertices[index];
Vertex& b = vertices[index+1]; Vertex& b = vertices[index+1];
Vertex& c = vertices[index+3]; Vertex& c = vertices[index+3];
+1 -2
View File
@@ -14,9 +14,8 @@ private:
int width; int width;
GLuint imageIndex; GLuint imageIndex;
int scale;
public: public:
HeightMap(const std::string &file, float scale, World* world); HeightMap(const std::string &file, World* world);
~HeightMap(); ~HeightMap();
void Draw(); void Draw();
+94
View File
@@ -0,0 +1,94 @@
#include "Interface.h"
#include <GL\freeglut.h>
#include "CrystalPoint.h"
#include <string>
#include "Player.h"
//Prototype
void glutBitmapString(std::string str, int x, int y);
Interface::Interface()
{
}
Interface::~Interface()
{
}
void Interface::draw()
{
Player* player = Player::getInstance();
//Switch view to Ortho
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1000, 1000, 0, -10, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
//Draw interface
//Health bar
glBegin(GL_QUADS);
glColor4f(0,0,0, 1.0);
glVertex2f(250, 980);
glVertex2f(250, 965);
glVertex2f(750, 965);
glVertex2f(750, 980);
glEnd();
glBegin(GL_QUADS);
glColor4f(1.0f, 0.1f, 0.1f, 1.0);
glVertex2f(250, 980);
glVertex2f(250, 965);
glColor4f(1.0f, 0.5f, 0.5f, 1.0);
glVertex2f(250 + (player->health / 100 * 500), 965);
glVertex2f(250 + (player->health / 100 * 500), 980);
glEnd();
//XP bar
glBegin(GL_QUADS);
glColor4f(0, 0, 0, 1.0);
glVertex2f(250, 950);
glVertex2f(250, 935);
glVertex2f(750, 935);
glVertex2f(750, 950);
glEnd();
glBegin(GL_QUADS);
glColor4f(1.0f, 1.0f, 0.1f, 1.0);
glVertex2f(250, 950);
glVertex2f(250, 935);
glColor4f(1.0f, 1.0f, 0.5f, 1.0);
glVertex2f(250 + (player->xp / 100 * 500), 935);
glVertex2f(250 + (player->xp / 100 * 500), 950);
glEnd();
//Text: level
glColor4f(1.0f, 1.0f, 0.1f, 1.0);
glutBitmapString("Level: " + std::to_string(player->level), 490, 900);
}
void Interface::update(float deltaTime)
{
}
void glutBitmapString(std::string str, int x, int y)
{
glRasterPos2f(x, y);
for (int i = 0; i < str.size(); i++)
{
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, str[i]);
}
}
+11
View File
@@ -0,0 +1,11 @@
#pragma once
class Interface
{
public:
Interface();
~Interface();
void draw(void);
void update(float deltaTime);
};
+12 -6
View File
@@ -21,7 +21,7 @@ int main(int argc, char* argv[])
glutDisplayFunc([]() { app->draw(); } ); glutDisplayFunc([]() { app->draw(); } );
glutIdleFunc([]() { app->update(); } ); glutIdleFunc([]() { app->update(); } );
glutReshapeFunc([](int w, int h) { app->width = w; app->height = h; glViewport(0, 0, w, h); }); glutReshapeFunc([](int w, int h) { CrystalPoint::width = w; CrystalPoint::height = h; glViewport(0, 0, w, h); });
//Keyboard //Keyboard
glutKeyboardFunc([](unsigned char c, int, int) { app->keyboardState.keys[c] = true; }); glutKeyboardFunc([](unsigned char c, int, int) { app->keyboardState.keys[c] = true; });
@@ -29,8 +29,7 @@ int main(int argc, char* argv[])
glutSpecialFunc([](int c, int, int) { app->keyboardState.special[c] = true; }); glutSpecialFunc([](int c, int, int) { app->keyboardState.special[c] = true; });
glutSpecialUpFunc([](int c, int, int) { app->keyboardState.special[c] = false; }); glutSpecialUpFunc([](int c, int, int) { app->keyboardState.special[c] = false; });
//Mouse auto mousemotion = [](int x, int y)
glutPassiveMotionFunc([](int x, int y)
{ {
if (justMoved) if (justMoved)
{ {
@@ -45,7 +44,14 @@ int main(int argc, char* argv[])
glutWarpPointer(app->width / 2, app->height / 2); glutWarpPointer(app->width / 2, app->height / 2);
justMoved = true; justMoved = true;
} }
}); };
//Mouse
glutPassiveMotionFunc(mousemotion);
glutMotionFunc(mousemotion);
CrystalPoint::height = GLUT_WINDOW_HEIGHT;
CrystalPoint::width = GLUT_WINDOW_WIDTH;
glutMainLoop(); glutMainLoop();
return 0; return 0;
@@ -57,7 +63,7 @@ void configureOpenGL()
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 600); glutInitWindowSize(800, 600);
glutCreateWindow("Crystal Point"); glutCreateWindow("Crystal Point");
//glutFullScreen(); glutFullScreen();
//Depth testing //Depth testing
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
@@ -86,5 +92,5 @@ void configureOpenGL()
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); glEnable(GL_LIGHT0);
glutSetCursor(GLUT_CURSOR_CROSSHAIR); glutSetCursor(GLUT_CURSOR_NONE);
} }
+3
View File
@@ -8,6 +8,9 @@ Player* Player::instance = NULL;
Player::Player() Player::Player()
{ {
speed = 10; speed = 10;
health = 50;
xp = 75;
level = 10;
} }
Player* Player::getInstance() Player* Player::getInstance()
+3
View File
@@ -23,6 +23,9 @@ public:
Model* leftWeapon; Model* leftWeapon;
Model* rightWeapon; Model* rightWeapon;
float health;
float xp;
int level;
float speed; float speed;
}; };
+48 -24
View File
@@ -3,13 +3,19 @@
#include "Entity.h" #include "Entity.h"
#include "json.h" #include "json.h"
#include "Model.h" #include "Model.h"
#include "CrystalPoint.h"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
World::World(const std::string &fileName) World::World(const std::string &fileName)
{ {
//Store player instance
player = Player::getInstance(); player = Player::getInstance();
//Create the interface
interface = new Interface();
//Open world json file
std::ifstream file(fileName); std::ifstream file(fileName);
if(!file.is_open()) if(!file.is_open())
std::cout<<"Error, can't open world file - " << fileName << "\n"; std::cout<<"Error, can't open world file - " << fileName << "\n";
@@ -27,67 +33,84 @@ World::World(const std::string &fileName)
if (v["world"]["object-templates"].isNull()) if (v["world"]["object-templates"].isNull())
std::cout << "Invalid world file: object templates - " << fileName << "\n"; std::cout << "Invalid world file: object templates - " << fileName << "\n";
float scale = 1.0f;
if (!v["world"]["scale"].isNull())
scale = v["world"]["scale"].asFloat();
//Load object templates //Load object templates
for (auto objt : v["world"]["object-templates"]) for (auto objt : v["world"]["object-templates"])
{ {
objecttemplates.push_back(std::pair<int, std::string>(objt["color"], objt["file"])); //collision
bool cancollide = true;
if (!objt["collision"].isNull())
cancollide = objt["collision"].asBool();
objecttemplates.push_back(std::pair<int, std::pair<std::string, bool>>(objt["color"], std::pair<std::string, bool>(objt["file"], cancollide)));
} }
heightmap = new HeightMap(v["world"]["heightmap"].asString(), scale, this); //Generate heightmap for this world
heightmap = new HeightMap(v["world"]["heightmap"].asString(), this);
//Map different texture to heightmap if available
if(!v["world"]["texture"].isNull()) if(!v["world"]["texture"].isNull())
heightmap->SetTexture(v["world"]["texture"].asString()); heightmap->SetTexture(v["world"]["texture"].asString());
player->position.x = v["player"]["startposition"][0].asFloat()*scale; //Set player starting position
player->position.y = v["player"]["startposition"][1].asFloat()*scale; player->position.x = v["player"]["startposition"][0].asFloat();
player->position.z = v["player"]["startposition"][2].asFloat()*scale; player->position.y = v["player"]["startposition"][1].asFloat();
player->position.z = v["player"]["startposition"][2].asFloat();
//Load and place objects into world
for (auto object : v["objects"]) for (auto object : v["objects"])
{ {
//Collision
bool hasCollision = true; bool hasCollision = true;
if (!object["collide"].isNull()) if (!object["collide"].isNull())
hasCollision = object["collide"].asBool(); hasCollision = object["collide"].asBool();
//Rotation
Vec3f rotation(0, 0, 0); Vec3f rotation(0, 0, 0);
if(!object["rot"].isNull()) if(!object["rot"].isNull())
rotation = Vec3f(object["rot"][0].asFloat(), object["rot"][1].asFloat(), object["rot"][2].asFloat()); rotation = Vec3f(object["rot"][0].asFloat(), object["rot"][1].asFloat(), object["rot"][2].asFloat());
//Scale
float scale = 1; float scale = 1;
if (!object["scale"].isNull()) if (!object["scale"].isNull())
scale = object["scale"].asFloat(); scale = object["scale"].asFloat();
//Position
if (object["pos"].isNull()) if (object["pos"].isNull())
std::cout << "Invalid world file: objects pos - " << fileName << "\n"; std::cout << "Invalid world file: objects pos - " << fileName << "\n";
//File
if (object["file"].isNull())
std::cout << "Invalid world file: objects file - " << fileName << "\n";
//Create
Vec3f position(object["pos"][0].asFloat(), object["pos"][1].asFloat(), object["pos"][2].asFloat()); Vec3f position(object["pos"][0].asFloat(), object["pos"][1].asFloat(), object["pos"][2].asFloat());
entities.push_back(new LevelObject(object["file"], position, rotation, scale, hasCollision)); entities.push_back(new LevelObject(object["file"].asString(), position, rotation, scale, hasCollision));
} }
//Enemies //Load and place enemies into world
for (auto e : v["enemies"]) for (auto e : v["enemies"])
{ {
std::string fileName = ""; //Rotation
if (!e["file"].isNull())
fileName = e["file"].asString();
Vec3f position(0, 0, 0);
if (!e["pos"].isNull())
position = Vec3f(e["pos"][0].asFloat(), e["pos"][1].asFloat(), e["pos"][2].asFloat());
Vec3f rotation(0, 0, 0); Vec3f rotation(0, 0, 0);
if (!e["rot"].isNull()) if (!e["rot"].isNull())
rotation = Vec3f(e["rot"][0].asFloat(), e["rot"][1].asFloat(), e["rot"][2].asFloat()); rotation = Vec3f(e["rot"][0].asFloat(), e["rot"][1].asFloat(), e["rot"][2].asFloat());
//Scale
float scale = 1.0f; float scale = 1.0f;
if (!e["scale"].isNull()) if (!e["scale"].isNull())
scale = e["scale"].asFloat(); scale = e["scale"].asFloat();
enemies.push_back(new Enemy(fileName, position, rotation, scale)); //Position
if (e["pos"].isNull())
std::cout << "Invalid world file: enemies pos - " << fileName << "\n";
//File
if (e["file"].isNull())
std::cout << "Invalid world file: enemies file - " << fileName << "\n";
//Create
Vec3f position(e["pos"][0].asFloat(), e["pos"][1].asFloat(), e["pos"][2].asFloat());
enemies.push_back(new Enemy(e["file"].asString(), position, rotation, scale));
} }
} }
@@ -98,7 +121,7 @@ World::~World()
delete heightmap; delete heightmap;
} }
std::string World::getObjectFromValue(int val) std::pair<std::string, bool> World::getObjectFromValue(int val)
{ {
for (auto i : objecttemplates) for (auto i : objecttemplates)
{ {
@@ -120,10 +143,9 @@ void World::draw()
float lightPosition[4] = { 0, 2, 1, 0 }; float lightPosition[4] = { 0, 2, 1, 0 };
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
float lightAmbient[4] = { 0.5, 0.5, 0.5, 1 }; float lightAmbient[4] = { 0.2, 0.2, 0.2, 1 };
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
heightmap->Draw(); heightmap->Draw();
for (auto &enemy : enemies) for (auto &enemy : enemies)
@@ -131,6 +153,8 @@ void World::draw()
for (auto &entity : entities) for (auto &entity : entities)
entity->draw(); entity->draw();
interface->draw();
} }
void World::update(float elapsedTime) void World::update(float elapsedTime)
+10 -8
View File
@@ -5,28 +5,30 @@
#include "Player.h" #include "Player.h"
#include "Enemy.h" #include "Enemy.h"
#include "LevelObject.h" #include "LevelObject.h"
#include "Interface.h"
class Entity; class Entity;
class World class World
{ {
private: private:
std::vector<std::pair<int, std::string>> objecttemplates; std::vector<std::pair<int, std::pair<std::string, bool>>> objecttemplates;
public:
World(const std::string &fileName);
~World();
std::vector<Entity*> entities;
std::vector<Enemy*> enemies;
Player* player; Player* player;
HeightMap* heightmap; HeightMap* heightmap;
Interface* interface;
std::vector<Entity*> entities;
std::vector<Enemy*> enemies;
public:
World(const std::string &fileName);
~World();
void draw(); void draw();
void update(float elapsedTime); void update(float elapsedTime);
bool isPlayerPositionValid(); bool isPlayerPositionValid();
float getHeight(float x, float y); float getHeight(float x, float y);
void addLevelObject(LevelObject* obj); void addLevelObject(LevelObject* obj);
std::string getObjectFromValue(int i); std::pair<std::string, bool> getObjectFromValue(int i);
}; };
-1
View File
@@ -2,7 +2,6 @@
"world": { "world": {
"heightmap": "worlds/hell.png", "heightmap": "worlds/hell.png",
"texture": "worlds/helltexture.png", "texture": "worlds/helltexture.png",
"scale": 1,
"object-templates": [ "object-templates": [
{ {
"color": 25, "color": 25,
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 186 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 86 KiB

+7 -1
View File
@@ -2,7 +2,13 @@
"world": { "world": {
"heightmap": "worlds/hmcs.png", "heightmap": "worlds/hmcs.png",
"texture": "worlds/hmcstexture.png", "texture": "worlds/hmcstexture.png",
"scale": 2 "object-templates": [
{
"color":100,
"file": "models/boom/Boom.obj",
"collision": false
}
]
}, },
"player": { "player": {
"startposition": [ 100, 20, 100 ] "startposition": [ 100, 20, 100 ]
+2 -2
View File
@@ -1,11 +1,11 @@
{ {
"world": { "world": {
"heightmap": "worlds/small.png", "heightmap": "worlds/small.png",
"scale": 1,
"object-templates": [ "object-templates": [
{ {
"color":100, "color":100,
"file": "models/boom/Boom.obj" "file": "models/boom/Boom.obj",
"collision": false
} }
] ]
}, },
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB