Merge pull request #16 from CrystalPointA4/feature/portal_logic

Feature/portal logic
This commit is contained in:
2016-06-10 11:56:52 +02:00
committed by GitHub
18 changed files with 234 additions and 48 deletions
+14 -4
View File
@@ -5,10 +5,11 @@
Crystal::Crystal(const std::string & filled, const std::string & empty, const Vec3f & position, Vec3f & rotation, const float & scale) Crystal::Crystal(const std::string & filled, const std::string & empty, const Vec3f & position, Vec3f & rotation, const float & scale)
{ {
this->filled = filled; this->filled = Model::load(filled);
this->empty = empty; this->empty = Model::load(empty);
model = this->filled;
model = Model::load(this->filled);
this->position = position; this->position = position;
this->rotation = rotation; this->rotation = rotation;
this->scale = scale; this->scale = scale;
@@ -20,6 +21,15 @@ Crystal::~Crystal()
{ {
if (model) if (model)
Model::unload(model); Model::unload(model);
//if isfilled, means model is model filled, so model empty has to been deleted.
//if is not filled, means model is model empty, so model filled has to been deleted.
if (isFilled)
if(empty)
Model::unload(empty);
else
if(filled)
Model::unload(filled);
} }
void Crystal::draw() void Crystal::draw()
@@ -33,6 +43,6 @@ void Crystal::collide()
{ {
Player::getInstance()->crystals++; Player::getInstance()->crystals++;
isFilled = false; isFilled = false;
model = Model::load(empty); model = empty;
} }
} }
+2 -1
View File
@@ -14,6 +14,7 @@ public:
void draw(); void draw();
void collide(); void collide();
private: private:
std::string filled, empty; Model* filled;
Model* empty;
}; };
+2
View File
@@ -165,6 +165,7 @@
<ClCompile Include="LevelObject.cpp" /> <ClCompile Include="LevelObject.cpp" />
<ClCompile Include="Main.cpp" /> <ClCompile Include="Main.cpp" />
<ClCompile Include="Model.cpp" /> <ClCompile Include="Model.cpp" />
<ClCompile Include="Portal.cpp" />
<ClCompile Include="Sound.cpp" /> <ClCompile Include="Sound.cpp" />
<ClCompile Include="SoundSystem.cpp" /> <ClCompile Include="SoundSystem.cpp" />
<ClCompile Include="Player.cpp" /> <ClCompile Include="Player.cpp" />
@@ -186,6 +187,7 @@
<ClInclude Include="LevelObject.h" /> <ClInclude Include="LevelObject.h" />
<ClInclude Include="Main.h" /> <ClInclude Include="Main.h" />
<ClInclude Include="Model.h" /> <ClInclude Include="Model.h" />
<ClInclude Include="Portal.h" />
<ClInclude Include="Sound.h" /> <ClInclude Include="Sound.h" />
<ClInclude Include="SoundSystem.h" /> <ClInclude Include="SoundSystem.h" />
<ClInclude Include="Player.h" /> <ClInclude Include="Player.h" />
+9 -3
View File
@@ -79,10 +79,13 @@
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Sound.cpp"> <ClCompile Include="Sound.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Crystal.cpp"> <ClCompile Include="Crystal.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Portal.cpp">
<Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -138,7 +141,7 @@
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Sound.h"> <ClInclude Include="Sound.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Crystal.h"> <ClInclude Include="Crystal.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
@@ -146,6 +149,9 @@
<ClInclude Include="Skybox.h"> <ClInclude Include="Skybox.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Portal.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="worlds\worlds.json"> <None Include="worlds\worlds.json">
+8
View File
@@ -20,6 +20,7 @@ Enemy::Enemy(const std::string &fileName,
radius = 10; radius = 10;
hasTarget = false; hasTarget = false;
hit_sound_id = CrystalPoint::GetSoundSystem().LoadSound("WAVE/Sound.wav", false); hit_sound_id = CrystalPoint::GetSoundSystem().LoadSound("WAVE/Sound.wav", false);
attack = false;
} }
@@ -83,6 +84,8 @@ void Enemy::update(float delta)
length = sqrt(dx*dx + dz*dz); length = sqrt(dx*dx + dz*dz);
if (length > 1) if (length > 1)
{ {
attack = false;
dx /= length; dx /= length;
dz /= length; dz /= length;
@@ -92,6 +95,11 @@ void Enemy::update(float delta)
position.x += dx; position.x += dx;
position.z += dz; position.z += dz;
} }
else
{
attack = true;
}
rotation.y = atan2f(dx, dz) * 180 / M_PI; rotation.y = atan2f(dx, dz) * 180 / M_PI;
} }
+1
View File
@@ -13,6 +13,7 @@ public:
bool hasTarget; bool hasTarget;
Vec3f target; Vec3f target;
float speed,radius; float speed,radius;
bool attack;
void update(float); void update(float);
void draw(); void draw();
+21 -7
View File
@@ -14,6 +14,15 @@ Interface::Interface()
crystalWidth = 20; crystalWidth = 20;
crystalHeight = 50; crystalHeight = 50;
crystalOffset = 5; crystalOffset = 5;
maxCrystals = 0;
}
Interface::Interface(int maxCrystal)
{
crystalWidth = 20;
crystalHeight = 50;
crystalOffset = 5;
maxCrystals = maxCrystal;
} }
@@ -80,18 +89,23 @@ void Interface::draw()
glColor4f(1.0f, 1.0f, 0.1f, 1.0); glColor4f(1.0f, 1.0f, 0.1f, 1.0);
glutBitmapString("Level: " + std::to_string(player->level), 490, 900); glutBitmapString("Level: " + std::to_string(player->level), 490, 900);
int cw, ch, offset; for (int i = 0; i < maxCrystals; i++)
cw = 20;
ch = 50;
offset = 5;
for (int i = 0; i < player->crystals; i++)
{ {
glBegin(GL_QUADS); glBegin(GL_QUADS);
glColor4f(0, 1.0f, 1.0f, 1.0f);
if(i < player->crystals)
glColor4f(0, 1.0f, 1.0f, 1.0f);
else
glColor4f(0, 0.4f, 0.4f, 1.0f);
glVertex2f(975 - crystalWidth / 2 , crystalOffset*i + crystalHeight*i); glVertex2f(975 - crystalWidth / 2 , crystalOffset*i + crystalHeight*i);
glVertex2f(975 - crystalWidth , crystalHeight / 2 + crystalOffset*i + crystalHeight*i); glVertex2f(975 - crystalWidth , crystalHeight / 2 + crystalOffset*i + crystalHeight*i);
glColor4f(0, 0.8f, 0.8f, 1.0f); if (i < player->crystals)
glColor4f(0, 0.7f, 0.7f, 1.0f);
else
glColor4f(0, 0.2f, 0.2f, 1.0f);
glVertex2f(975 - crystalWidth / 2 , crystalHeight + crystalOffset*i + crystalHeight*i); glVertex2f(975 - crystalWidth / 2 , crystalHeight + crystalOffset*i + crystalHeight*i);
glVertex2f(975 , crystalHeight / 2 + crystalOffset*i + crystalHeight*i); glVertex2f(975 , crystalHeight / 2 + crystalOffset*i + crystalHeight*i);
glEnd(); glEnd();
+2
View File
@@ -3,11 +3,13 @@ class Interface
{ {
public: public:
Interface(); Interface();
Interface(int);
~Interface(); ~Interface();
void draw(void); void draw(void);
void update(float deltaTime); void update(float deltaTime);
int crystalWidth, crystalHeight, crystalOffset; int crystalWidth, crystalHeight, crystalOffset;
int maxCrystals;
}; };
+1
View File
@@ -64,6 +64,7 @@ void configureOpenGL()
//Init window and glut display mode //Init window and glut display mode
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 600); glutInitWindowSize(800, 600);
//glutInitWindowPosition(glutGet(GLUT_WINDOW_WIDTH) / 2 - 800/2, glutGet(GLUT_WINDOW_HEIGHT) / 2 - 600/2);
glutCreateWindow("Crystal Point"); glutCreateWindow("Crystal Point");
glutFullScreen(); glutFullScreen();
+34
View File
@@ -0,0 +1,34 @@
#include "Portal.h"
#include "Model.h"
#include <iostream>
#include "Player.h"
#include "WorldHandler.h"
Portal::Portal(const std::string &fileName,
const Vec3f &position,
Vec3f &rotation,
const float &scale)
{
model = Model::load(fileName);
this->position = position;
this->rotation = rotation;
this->scale = scale;
this->canCollide = true;
mayEnter = false;
maxCrystals = 0;
}
Portal::~Portal()
{
}
void Portal::collide()
{
if (maxCrystals == (Player::getInstance()->crystals) && !mayEnter)
{
canCollide = false;
mayEnter = true;
}
}
+19
View File
@@ -0,0 +1,19 @@
#pragma once
#include "Entity.h"
#include <string>
class Portal :
public Entity
{
public:
Portal(const std::string &fileName,
const Vec3f &position,
Vec3f &rotation,
const float &scale);
~Portal();
void collide();
int maxCrystals;
bool mayEnter;
};
+16
View File
@@ -4,6 +4,7 @@
#include "stb_image.h" #include "stb_image.h"
#include "Skybox.h" #include "Skybox.h"
#include <string> #include <string>
#include <iostream>
enum{SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM}; enum{SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
GLuint skybox[6]; GLuint skybox[6];
@@ -12,6 +13,9 @@ Skybox::Skybox(const float &size, const std::string &folder)
{ {
this->size = size; this->size = size;
this->folder = folder; this->folder = folder;
brightness = 80;
targetBrightness = 80;
} }
Skybox::~Skybox() Skybox::~Skybox()
@@ -31,6 +35,8 @@ void Skybox::init()
void Skybox::draw() void Skybox::draw()
{ {
glColor4f(brightness/255, brightness/255, brightness/255, 1);
bool b1 = glIsEnabled(GL_TEXTURE_2D); bool b1 = glIsEnabled(GL_TEXTURE_2D);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
@@ -114,6 +120,16 @@ void Skybox::draw()
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
} }
void Skybox::update(float deltaTime, int curr, int max)
{
targetBrightness = 80 + ((255 - 80) / max) * curr;
if (targetBrightness > brightness)
{
brightness += 20 * deltaTime;
}
}
GLuint Skybox::loadTexture(const std::string & fileName) //load the filename named texture GLuint Skybox::loadTexture(const std::string & fileName) //load the filename named texture
{ {
int width, height, bpp; int width, height, bpp;
+3
View File
@@ -6,11 +6,14 @@ class Skybox
private: private:
float size; float size;
std::string folder; std::string folder;
float brightness;
float targetBrightness;
public: public:
Skybox(const float &size, const std::string &folder); Skybox(const float &size, const std::string &folder);
~Skybox(); ~Skybox();
void init(); void init();
void draw(); void draw();
void update(float deltaTime, int, int);
GLuint loadTexture(const std::string &fileName); GLuint loadTexture(const std::string &fileName);
}; };
+51 -5
View File
@@ -6,6 +6,7 @@
#include "CrystalPoint.h" #include "CrystalPoint.h"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <algorithm>
#include "WorldHandler.h" #include "WorldHandler.h"
World::World(const std::string &fileName): World::World(const std::string &fileName):
@@ -94,11 +95,12 @@ World::World(const std::string &fileName):
//Create //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());
position.y = getHeight(position.x, position.z) + 2.0f; position.y = getHeight(position.x, position.z);
entities.push_back(new LevelObject(object["file"].asString(), position, rotation, scale, hasCollision)); entities.push_back(new LevelObject(object["file"].asString(), position, rotation, scale, hasCollision));
} }
maxEnemies = 0;
//Load and place enemies into world //Load and place enemies into world
for (auto e : v["enemies"]) for (auto e : v["enemies"])
{ {
@@ -124,9 +126,10 @@ World::World(const std::string &fileName):
Vec3f position(e["pos"][0].asFloat(), e["pos"][1].asFloat(), e["pos"][2].asFloat()); Vec3f position(e["pos"][0].asFloat(), e["pos"][1].asFloat(), e["pos"][2].asFloat());
position.y = getHeight(position.x, position.z) + 2.0f; position.y = getHeight(position.x, position.z) + 2.0f;
maxEnemies++;
enemies.push_back(new Enemy(e["file"].asString(), position, rotation, scale)); enemies.push_back(new Enemy(e["file"].asString(), position, rotation, scale));
} }
maxCrystals = 0;
if (!v["crystal"].isNull()) if (!v["crystal"].isNull())
{ {
std::string filled = "unknown"; std::string filled = "unknown";
@@ -164,11 +167,12 @@ World::World(const std::string &fileName):
scale = instance["scale"].asFloat(); scale = instance["scale"].asFloat();
position.y = getHeight(position.x, position.z); position.y = getHeight(position.x, position.z);
maxCrystals++;
Crystal *c = new Crystal(filled, empty, position, rotation, scale); Crystal *c = new Crystal(filled, empty, position, rotation, scale);
entities.push_back(c); entities.push_back(c);
} }
interface->maxCrystals = maxCrystals;
} }
} }
@@ -180,6 +184,30 @@ World::World(const std::string &fileName):
music->Play(); music->Play();
} }
if (!v["portal"].isNull())
{
Vec3f pos(0, 0, 0);
if (!v["portal"]["pos"].isNull())
pos = Vec3f(v["portal"]["pos"][0].asFloat(),
v["portal"]["pos"][1].asFloat(),
v["portal"]["pos"][0].asFloat());
pos.y = getHeight(pos.x, pos.z);
Vec3f rot(0, 0, 0);
if (!v["portal"]["rot"].isNull())
pos = Vec3f(v["portal"]["rot"][0].asFloat(),
v["portal"]["rot"][1].asFloat(),
v["portal"]["rot"][0].asFloat());
float scale = 1.0f;
if (!v["portal"]["scale"].isNull())
scale = !v["portal"]["scale"].asFloat();
portal = new Portal(v["portal"]["file"], pos, rot, scale);
entities.push_back(portal);
portal->maxCrystals = maxCrystals;
}
} }
@@ -214,8 +242,6 @@ void World::draw()
float lightAmbient[4] = { 0.2, 0.2, 0.2, 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, 1, 1, 1);
skybox->draw(); skybox->draw();
heightmap->Draw(); heightmap->Draw();
@@ -234,6 +260,9 @@ void World::update(float elapsedTime)
for (auto &entity : entities) for (auto &entity : entities)
entity->update(elapsedTime); entity->update(elapsedTime);
int count = 0;
int remove = false;
for (auto &enemy : enemies) for (auto &enemy : enemies)
{ {
@@ -252,9 +281,26 @@ void World::update(float elapsedTime)
break; break;
} }
} }
if (enemy->attack)
{
remove = true;
continue;
}
} }
enemy->position.y = getHeight(enemy->position.x, enemy->position.z) + 2.0f; enemy->position.y = getHeight(enemy->position.x, enemy->position.z) + 2.0f;
if(!remove)
count++;
} }
if(remove)
enemies.erase(enemies.begin() + count);
skybox->update(elapsedTime, maxEnemies - enemies.size(), maxEnemies);
if (portal->mayEnter)
WorldHandler::getInstance()->NextWorld();
} }
void World::addLevelObject(LevelObject* obj) void World::addLevelObject(LevelObject* obj)
+3 -1
View File
@@ -8,6 +8,7 @@
#include "Interface.h" #include "Interface.h"
#include "Crystal.h" #include "Crystal.h"
#include "Skybox.h" #include "Skybox.h"
#include "Portal.h"
class Entity; class Entity;
@@ -20,8 +21,9 @@ private:
HeightMap* heightmap; HeightMap* heightmap;
Interface* interface; Interface* interface;
Skybox* skybox; Skybox* skybox;
Portal* portal;
int music_id; int music_id,maxCrystals,maxEnemies;
std::vector<Entity*> entities; std::vector<Entity*> entities;
std::vector<Enemy*> enemies; std::vector<Enemy*> enemies;
+2
View File
@@ -126,6 +126,7 @@ void WorldHandler::NextWorld()
if (!loadingWorld) if (!loadingWorld)
{ {
ChangeWorld(worldIndex + 1); ChangeWorld(worldIndex + 1);
Player::getInstance()->crystals = 0;
} }
} }
@@ -134,5 +135,6 @@ void WorldHandler::PreviousWorld()
if (!loadingWorld) if (!loadingWorld)
{ {
ChangeWorld(worldIndex - 1); ChangeWorld(worldIndex - 1);
Player::getInstance()->crystals = 0;
} }
} }
+34 -24
View File
@@ -1,33 +1,43 @@
{ {
"world": { "world": {
"heightmap": "worlds/hmcs.png", "heightmap": "worlds/hmcs.png",
"texture": "worlds/hmcstexture.png", "texture": "hmcstexture.png",
"skybox": "skyboxes/peaceful/",
"object-templates": [ "object-templates": [
{ {
"color":100, "color": 100,
"file": "models/boom/Boom.obj", "file": "models/boom/Boom.obj",
"collision": false "collision": true
} }
] ],
}, "music": "WAVE/bond.wav"
},
"player": { "player": {
"startposition": [ 0, 1.7, 0] "startposition": [ 1, 5, 20 ]
},
"objects": [ ],
"portal": {
"file": "models/Teleporter/Teleporter.obj",
"pos": [ 10, 5, 10 ]
}, },
"objects": [
{
"file": "models/boom/Boom.obj",
"pos": [ 10, 0, -4 ]
},
{
"file": "models/Teleporter/Teleporter.obj",
"pos": [ 0, 0, -4 ]
}
],
"enemies": [ "enemies": [
{ {
"file": "models/squid/Blooper.obj", "file": "models/squid/Blooper.obj",
"pos": [ 10, 2, -10 ], "pos": [ 20, 5, 10 ],
"scale": 0.01 "scale": 0.01
} }],
] "crystal": {
"full texture": "models/crystal/Crystal.obj",
"empty texture": "models/crystal/PickedUpCrystal.obj",
"instances": [
{
"pos": [ 31, 5, 33 ],
"rot": [ 0, 0, 0 ]
},
{
"pos": [ 40, 5, 40 ],
"rot": [ 0, 0, 0 ]
}
]
}
} }
+10 -1
View File
@@ -15,11 +15,20 @@
"startposition": [ 20, 5, 20 ] "startposition": [ 20, 5, 20 ]
}, },
"objects": [ ], "objects": [ ],
"portal": {
"file": "models/Teleporter/Teleporter.obj",
"pos": [ 10, 5, 10 ]
},
"enemies": [ "enemies": [
{ {
"file": "models/squid/Blooper.obj", "file": "models/squid/Blooper.obj",
"pos": [ 20, 5, 10 ], "pos": [ 20, 5, 10 ],
"scale": 0.01 "scale": 0.01
},
{
"file": "models/squid/Blooper.obj",
"pos": [ 30, 10, 10 ],
"scale": 0.01
}], }],
"crystal": { "crystal": {
"full texture": "models/crystal/Crystal.obj", "full texture": "models/crystal/Crystal.obj",