From 3025fecf9489dddd26a4359b93a774326e355dfb Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Tue, 21 Jun 2016 18:25:16 +0200 Subject: [PATCH] Load weapons from JSON --- CrystalPoint.cpp | 6 ++++- Player.cpp | 68 ++++++++++++++++++++++++++++++++++++++++++++++-- Player.h | 8 ++++++ Weapon.cpp | 10 +++++-- Weapon.h | 14 +++++++--- World.cpp | 2 +- worlds/rock.json | 2 +- 7 files changed, 99 insertions(+), 11 deletions(-) diff --git a/CrystalPoint.cpp b/CrystalPoint.cpp index 8e9c54b..6d69384 100644 --- a/CrystalPoint.cpp +++ b/CrystalPoint.cpp @@ -144,9 +144,13 @@ void CrystalPoint::update() if (player->rotation.x < -90) player->rotation.x = -90; + player->position.y = worldhandler->getHeight(player->position.x, player->position.z) + 1.7f; + if (!worldhandler->isPlayerPositionValid()) player->position = oldPosition; - player->position.y = worldhandler->getHeight(player->position.x, player->position.z) + 1.7f; + /*else if (player->position.y > oldPosition.y + 1.2) + player->position = oldPosition; + */ worldhandler->update(deltaTime); } else diff --git a/Player.cpp b/Player.cpp index 303a9d4..9b576a3 100644 --- a/Player.cpp +++ b/Player.cpp @@ -3,6 +3,10 @@ #include "Player.h" #include +#include +#include +#include + Player* Player::instance = NULL; Player::Player() @@ -15,10 +19,12 @@ Player::Player() level = 1; crystals = 0; - leftWeapon = new Weapon("models/weapons/ZwaardMetTextures/TextureZwaard.obj", 1, position, rotation, Vec3f(4.5, -8, -1), Vec3f(-2.0f, 6.0f, -2.1f), Vec2f(170, 70), Vec2f(20, -80)); + loadWeapons(); + + leftWeapon = leftweapons[0]; leftWeapon->rotateWeapon(Vec3f(150, 0, 60)); - rightWeapon = new Weapon("models/weapons/ZwaardMetTextures/TextureZwaard.obj", 1, position, rotation, Vec3f(0.5, -8, -1), Vec3f(-2.0f, 6.0f, -2.1f), Vec2f(170, 70), Vec2f(20, -80)); + rightWeapon = rightweapons[0]; rightWeapon->rotateWeapon(Vec3f(150, 0, 60)); } @@ -115,4 +121,62 @@ void Player::levelUp() maxXp += 50; maxHp += 10; health = maxHp; +} + +void Player::loadWeapons() +{ + std::string fileName = "weapons.json"; + + //Open world json file + std::ifstream file(fileName); + if (!file.is_open()) + std::cout << "Error, can't open world file - " << fileName << "\n"; + + json::Value v = json::readJson(file); + file.close(); + + //Check file + if (v["weapons"].isNull()) + std::cout << "Invalid weapons file: " << fileName << "\n"; + + //Load object templates + for (auto w : v["weapons"]) + { + Weapon* lweapon; + Weapon* rweapon; + + std::string name = w["name"].asString(); + std::string fileN = w["file"].asString(); + float damage = w["damage"].asFloat(); + + Weapon::Element e = Weapon::FIRE; + + if(w["element"].asString() == "fire") + e = Weapon::FIRE; + else if (w["element"].asString() == "water") + e = Weapon::WATER; + else if (w["element"].asString() == "earth") + e = Weapon::EARTH; + else if (w["element"].asString() == "air") + e = Weapon::AIR; + else + e = Weapon::FIRE; + + + Vec3f leftoffset = Vec3f(w["left"]["offset"][0].asFloat(), w["left"]["offset"][1].asFloat(), w["left"]["offset"][2].asFloat()); + Vec3f rightoffset = Vec3f(w["right"]["offset"][0].asFloat(), w["right"]["offset"][1].asFloat(), w["right"]["offset"][2].asFloat()); + + Vec3f anchor = Vec3f(w["anchor"][0].asFloat(), w["anchor"][1].asFloat(), w["anchor"][2].asFloat()); + Vec3f collision = Vec3f(w["collision"][0].asFloat(), w["collision"][1].asFloat(), w["collision"][2].asFloat()); + + Vec2f maxRot = Vec2f(w["maxRotation"][0].asFloat(), w["maxRotation"][1].asFloat()); + Vec2f minRot = Vec2f(w["minRotation"][0].asFloat(), w["minRotation"][1].asFloat()); + + lweapon = new Weapon(name, damage, e, fileN, 1, position, rotation, leftoffset, anchor, maxRot, minRot, collision); + rweapon = new Weapon(name, damage, e, fileN, 1, position, rotation, rightoffset, anchor, maxRot, minRot, collision); + + leftweapons.push_back(lweapon); + rightweapons.push_back(rweapon); + } + } \ No newline at end of file diff --git a/Player.h b/Player.h index 8d171d4..4b67fbb 100644 --- a/Player.h +++ b/Player.h @@ -1,12 +1,20 @@ #pragma once #include "Vector.h" #include "Weapon.h" +#include "json.h" + +#include class Player { private: static Player* instance; void levelUp(); + + std::vector leftweapons; + std::vector rightweapons; + void loadWeapons(void); + public: Player(); ~Player(); diff --git a/Weapon.cpp b/Weapon.cpp index 7a26355..ebd7819 100644 --- a/Weapon.cpp +++ b/Weapon.cpp @@ -9,18 +9,24 @@ #include -Weapon::Weapon(std::string modelFilename, float scale, Vec3f location, Vec2f rotation, +Weapon::Weapon(std::string name, int damage, Element e, std::string modelFilename, float scale, Vec3f location, Vec2f rotation, Vec3f offsetPlayer, Vec3f ankerPoint, - Vec2f maxRotation, Vec2f minRotation){ + Vec2f maxRotation, Vec2f minRotation, + Vec3f collision){ weaponmodel = Model::load(modelFilename); rotate(rotation); move(location); this->scale = scale; + this->name = name; + this->damage = damage; + this->element = e; + this->offsetPlayer = offsetPlayer; this->ankerPoint = ankerPoint; this->maxRotation = maxRotation; this->minRotation = minRotation; + this->collision = collision; }; Weapon::~Weapon(){ diff --git a/Weapon.h b/Weapon.h index 8d5e672..187b5b0 100644 --- a/Weapon.h +++ b/Weapon.h @@ -11,22 +11,28 @@ class Weapon { public: - Weapon(std::string modelFilename, float scale, Vec3f location, Vec2f rotation, + enum Element {FIRE, WATER, EARTH, AIR}; + + Weapon(std::string name, int damage, Element element, std::string modelFilename, float scale, Vec3f location, Vec2f rotation, Vec3f offsetPlayer, Vec3f ankerPoint, - Vec2f maxRotation, Vec2f minXRotation); + Vec2f maxRotation, Vec2f minXRotation, + Vec3f collision); ~Weapon(); void draw(); void rotateWeapon(Vec3f rotation); void rotate(Vec2f rotation); void move(Vec3f location); - + + std::string name; unsigned int damage; + Element element; + Model* weaponmodel; float scale; Vec3f position, rotation, rotationWeapon; - Vec3f offsetPlayer, ankerPoint; + Vec3f offsetPlayer, ankerPoint, collision; Vec2f maxRotation, minRotation; }; diff --git a/World.cpp b/World.cpp index 38548cb..0803c32 100644 --- a/World.cpp +++ b/World.cpp @@ -64,8 +64,8 @@ World::World(const std::string &fileName) //Set player starting position player->position.x = v["player"]["startposition"][0].asFloat(); - player->position.y = v["player"]["startposition"][1].asFloat(); player->position.z = v["player"]["startposition"][2].asFloat(); + player->position.y = heightmap->GetHeight(player->position.x, player->position.z); //Load and place objects into world for (auto object : v["objects"]) diff --git a/worlds/rock.json b/worlds/rock.json index a62b3c0..ca70643 100644 --- a/worlds/rock.json +++ b/worlds/rock.json @@ -83,7 +83,7 @@ ] }, "player": { - "startposition": [ 1, 5, 20 ] + "startposition": [ 20, 5, 20 ] }, "objects": [ ], "portal": {