improved unit creation

This commit is contained in:
devZoGok
2021-12-11 19:08:25 +02:00
parent 7cbd1b3880
commit aaf026c8a4
7 changed files with 101 additions and 133 deletions
+2 -2
View File
@@ -138,9 +138,9 @@ namespace battleship{
void Jet::pitch(float angle) {
Quaternion rotQuat = Quaternion(-angle / 180 * PI, leftVec);
dirVec = rotQuat*dirVec, upVec = rotQuat*upVec;
dirVec = rotQuat * dirVec, upVec = rotQuat * upVec;
horAngle = angle;
float yAngle = node->getOrientation().y;
float yAngle = model->getOrientation().y;
/*
node->setOrientation(vector3df(angle, 0, 0));
node->setOrientation(vector3df(angle, yAngle, 0));
+5 -5
View File
@@ -1,5 +1,5 @@
#include <time.h>
#include <node.h>
#include <model.h>
#include "submarine.h"
#include "defConfigs.h"
@@ -9,7 +9,7 @@
using namespace vb01;
namespace battleship{
Submarine::Submarine(Player *player, Vector3 pos, int id) : Unit(player,pos, id) {}
Submarine::Submarine(Player *player, Vector3 pos, int id) : Unit(player, pos, id) {}
void Submarine::attack(Order order) {
float angle = dirVec.getAngleBetween(*(order.targetPos[0]) - pos);
@@ -20,19 +20,19 @@ namespace battleship{
if (canFire()) {
Vector3 p = pos + leftVec * projectileData::pos[id][0][0].x + upVec * projectileData::pos[id][0][0].y - dirVec * projectileData::pos[id][0][0].z;
addProjectile(new Torpedo(this, p, dirVec, leftVec, upVec, getId(), 0, 0));
lastShotTime=getTime();
lastShotTime = getTime();
}
}
void Submarine::emerge() {
submerged = false;
pos.y += 5;
node->setPosition(pos);
model->setPosition(pos);
}
void Submarine::submerge() {
submerged = true;
pos.y -= 5;
node->setPosition(pos);
model->setPosition(pos);
}
}
+29 -22
View File
@@ -1,4 +1,5 @@
#include <model.h>
#include <material.h>
#include <texture.h>
#include <stateManager.h>
@@ -28,24 +29,28 @@ namespace battleship{
length = unitData::unitCornerPoints[id][3].z - unitData::unitCornerPoints[id][0].z;
GameManager *gm = GameManager::getSingleton();
node = new Model(basePath[id] + meshPath[id]);
placeUnit(pos);
/*
node->setMaterialFlag(EMF_LIGHTING, false);
ITriangleSelector *tr = smgr->createTriangleSelector((IAnimatedMeshSceneNode*)node);
node->setTriangleSelector(tr);
tr->drop();
*/
string f[]{basePath[id] + "diffuseMap.png"};
model = new Model(basePath[id] + meshPath[id]);
Root *root = Root::getSingleton();
Material *mat = new Material(root->getLibPath() + "texture");
string f[]{DEFAULT_TEXTURE};
Texture *diffuseTexture = new Texture(f, 1, false);
mat->addBoolUniform("texturingEnabled", true);
mat->addBoolUniform("lightingEnabled", false);
mat->addTexUniform("textures[0]", diffuseTexture, true);
model->setMaterial(mat);
root->getRootNode()->attachChild(model);
placeUnit(pos);
/*
light = smgr->addLightSceneNode(node, vector3df(0, 2, 0), SColor(255, 255, 255, 255), lineOfSight);
light->setVisible(false);
node->setVisible(false);
model->setVisible(false);
*/
selectionSfxBuffer = new sf::SoundBuffer();
string p = PATH+"Sounds/"+unitData::name[id]+"s/selection.ogg";
string p = PATH + "Sounds/" + unitData::name[id] + "s/selection.ogg";
if(selectionSfxBuffer->loadFromFile(p.c_str()))
selectionSfx = new sf::Sound(*selectionSfxBuffer);
@@ -62,20 +67,20 @@ namespace battleship{
void Unit::update() {
if (orders.size() > 0){
if(selected&&canDisplayOrderLine()){
int r=0,g=0,b=0;
if(selected && canDisplayOrderLine()){
int r = 0, g = 0, b = 0;
switch(orders[0].type){
case Order::TYPE::MOVE:
g=255;
g = 255;
break;
case Order::TYPE::ATTACK:
r=255;
r = 255;
break;
case Order::TYPE::PATROL:
b=255;
b = 255;
case Order::TYPE::LAUNCH:
r=255,g=255;
r = 255, g = 255;
break;
}
@@ -283,7 +288,7 @@ namespace battleship{
void Unit::advance(float speed) {
pos = pos + dirVec * speed;
node->setPosition(pos);
model->setPosition(pos);
}
void Unit::turn(float angle) {// rad
@@ -301,13 +306,15 @@ namespace battleship{
float Unit::getCircleRadius() {
float radius = 0.;
for (int i = 0; i <= 90 / maxTurnAngle; i++)
radius += cos(i * (maxTurnAngle / 180 * PI)) * speed;
return radius;
}
void Unit::placeUnit(Vector3 p) {
node->setPosition(p);
model->setPosition(p);
pos = p;
}
@@ -334,10 +341,10 @@ namespace battleship{
std::vector<Projectile*> Unit::getProjectiles(){
std::vector<Projectile*> projectiles;
InGameAppState *inGameState=((InGameAppState*)GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::IN_GAME_STATE));
InGameAppState *inGameState = ((InGameAppState*)GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::IN_GAME_STATE));
for(Projectile *p: inGameState->getProjectiles())
if(p->getUnit()==this)
if(p->getUnit() == this)
projectiles.push_back(p);
return projectiles;
@@ -366,7 +373,7 @@ namespace battleship{
if(selection && selectionSfx)
selectionSfx->play();
orderLineDispTime=getTime();
orderLineDispTime = getTime();
}
/*
+7 -7
View File
@@ -59,7 +59,7 @@ namespace battleship{
inline float getWidth() {return width;}
inline float getHeight() {return height;}
inline float getLength() {return length;}
inline vb01::Node* getNode() {return node;}
inline vb01::Model* getNode() {return model;}
inline Player* getPlayer(){return player;}
inline unitData::UNIT_TYPE getType() {return type;}
inline void toggleDebugging(bool d){this->debugging=d;}
@@ -75,9 +75,9 @@ namespace battleship{
inline int getNextPatrolPointId() {return patrolPointId == patrolPoints.size() - 1 ? 0 : patrolPointId + 1;}
inline bool canDisplayOrderLine(){return vb01::getTime() - orderLineDispTime < orderVecDispLength;}
//ILightSceneNode *light;
const int orderVecDispLength=2000;
const int orderVecDispLength = 2000;
sf::SoundBuffer *selectionSfxBuffer;
sf::Sound *selectionSfx=nullptr;
sf::Sound *selectionSfx = nullptr;
protected:
Player *player;
MoveDir moveDir = MoveDir::FORWARD;
@@ -89,11 +89,11 @@ namespace battleship{
std::vector<vb01::Vector3> patrolPoints;
vb01::Vector3 pos = vb01::Vector3(0, 0, 0), upVec = vb01::Vector3(0, 1, 0), dirVec = vb01::Vector3(0, 0, -1), leftVec = vb01::Vector3(1, 0, 0);
int health, cost, id, patrolPointId = 0, playerId;
s64 orderLineDispTime=0;
vb01::Mesh *mesh;
vb01::Node *node;
bool selected = false, selectable, debugging = false, working=true;
s64 orderLineDispTime = 0;
vb01::Model *model;
bool selected = false, selectable, debugging = false, working = true;
float lineOfSight, speed, maxTurnAngle, range, width, height, length;
void removeOrder(int);
virtual void executeOrders();
virtual void attack(Order);
+5 -5
View File
@@ -272,11 +272,11 @@ namespace battleship {
"Jet", "Jet"
};
const std::string meshPath[numberOfUnits]{
"hull00.x", "hull01.x",
"hull00.x", "hull01.x",
"hull00.x", "hull01.x",
"hull00.x", "hull01.x",
"hull.x",
"battleship00.vb", "battleship01.vb",
"destroyer00.vb", "destroyer01.vb",
"cruiser00.vb", "cruiser01.vb",
"aircraftCarrier00.vb", "aircraftCarrier01.vb",
"submarine.vb",
"jet00.x", "jet01.x"
};
const std::string basePath[numberOfUnits]{
+43 -81
View File
@@ -1,6 +1,8 @@
#include <algorithm>
#include <quaternion.h>
#include <model.h>
#include <mesh.h>
#include <material.h>
#include <texture.h>
#include "vessel.h"
@@ -18,48 +20,32 @@ namespace battleship{
Vessel::Turret::Turret(Unit *vessel, int unitId, int turretId) {
this->vessel = vessel;
//hullNode = vessel->getNode();
hull = vessel->getNode()->getChild(0);
this->unitId = unitId;
this->turretId = turretId;
string fr[]{DEFAULT_TEXTURE};
Texture *turretDiffTex = new Texture(fr, 1, false);
GameManager *gm = GameManager::getSingleton();
/*
turretMesh = smgr->getMesh(basePath[unitId] + turretNames[unitId][turretId] + ".x");
turretNode = smgr->addAnimatedMeshSceneNode(turretMesh);
turretNode->setMaterialFlag(EMF_LIGHTING, false);
*/
string fr[]{basePath[unitId] + turretNames[unitId][turretId] + "DiffuseMap.png"};
Texture *turretDiffuseTexture = new Texture(fr, 1, false);
Root *root = Root::getSingleton();
string libPath = root->getLibPath();
Material *turretMat = new Material(libPath + "texture");
turretMat->addBoolUniform("texturingEnabled", true);
turretMat->addBoolUniform("lightingEnabled", false);
turretMat->addTexUniform("textures[0]", turretDiffTex, true);
turret = hull->getChild(turretId);
turret->getMesh(0)->setMaterial(turretMat);
/*
turretNode->setParent(vessel->getNode());
turretNode->setPosition(turretPos[unitId][turretId]);
quaternion rotQuat = rotQuat.fromAngleAxis(PI / 180 * turretAngleOffset[unitId][turretId], vector3df(0, 1, 0));
turretNode->setRotation(vector3df(0, turretAngleOffset[unitId][turretId], 0));
dirVec = rotQuat*dirVec, leftVec = rotQuat*leftVec;
rotationSpeed = unitData::turretRotationSpeed[unitId][turretId];
maxAngle = unitData::turretMaxAngle[unitId][turretId];
this->rateOfFire = unitData::turretRateOfFire[unitId][turretId];
*/
/*
for (int i = 0; i < numberOfMantlets[unitId][turretId]; i++) {
IAnimatedMesh *mantletMesh = smgr->getMesh(basePath[unitId] + mantletNames[unitId][turretId] + ".x");
IAnimatedMesh *barrelMesh = smgr->getMesh(basePath[unitId] + barrelNames[unitId][turretId] + ".x");
ISceneNode *mantletNode = initMantletNode(driver, smgr, mantletMesh, unitId, turretId);
ISceneNode *barrelNode = initBarrelNode(driver, smgr, barrelMesh, mantletNode, unitId, turretId);
turretMantletMeshes.push_back(mantletMesh);
turretMantletNodes.push_back(mantletNode);
turretBarrelMeshes.push_back(barrelMesh);
turretBarrelNodes.push_back(barrelNode);
}
if (turretMantletNodes.size() > 1) {
turretMantletNodes[0]->setPosition(turretMantletNodes[0]->getPosition() + vector3df(mantletPosSideOffset[unitId][turretId], 0, 0));
turretMantletNodes[1]->setPosition(turretMantletNodes[1]->getPosition() - vector3df(mantletPosSideOffset[unitId][turretId], 0, 0));
}
*/
for(int i = 0; i < numberOfMantlets[unitId][turretId]; i++){
Mantlet mantlet;
mantlet.mantletNode = turret->getChild(i);
mantlet.mantletNode->getMesh(0)->setMaterial(turretMat);
mantlet.barrelNode = mantlet.mantletNode->getChild(0);
mantlet.barrelNode->getMesh(0)->setMaterial(turretMat);
mantlets.push_back(mantlet);
}
/*
fxNode=smgr->addParticleSystemSceneNode(false);
@@ -89,44 +75,16 @@ namespace battleship{
sfx = new sf::Sound(*sfxBuffer);
}
/*
ISceneNode* Vessel::Turret::initMantletNode(IVideoDriver *driver, ISceneManager *smgr, IAnimatedMesh *mantletMesh, int unitId, int turretId) {
ISceneNode *mantletNode = smgr->addAnimatedMeshSceneNode(mantletMesh);
mantletNode->setMaterialFlag(EMF_LIGHTING, false);
ITexture *mantletDiffuseTexture = driver->getTexture(basePath[unitId] + mantletNames[unitId][turretId] + "DiffuseMap.png");
if (mantletDiffuseTexture)
mantletNode->setMaterialTexture(0, mantletDiffuseTexture);
else
mantletNode->setMaterialTexture(0, driver->getTexture(DEFAULT_TEXTURE));
mantletNode->setParent(turretNode);
mantletNode->setPosition(mantletPos[unitId][turretId]);
return mantletNode;
}
ISceneNode* Vessel::Turret::initBarrelNode(IVideoDriver *driver, ISceneManager *smgr, IAnimatedMesh *barrelMesh, ISceneNode *mantletNode, int unitId, int turretId) {
ISceneNode *barrelNode = smgr->addAnimatedMeshSceneNode(barrelMesh);
barrelNode->setMaterialFlag(EMF_LIGHTING, false);
ITexture *barrelDiffuseTexture = driver->getTexture(basePath[unitId] + barrelNames[unitId][turretId] + "DiffuseMap.png");
if (barrelDiffuseTexture)
barrelNode->setMaterialTexture(0, barrelDiffuseTexture);
else
barrelNode->setMaterialTexture(0, driver->getTexture(DEFAULT_TEXTURE));
barrelNode->setParent(mantletNode);
barrelNode->setPosition(barrelPos[unitId][turretId]);
return barrelNode;
}
*/
void Vessel::Turret::rotate(double angle) {
Quaternion rotQuat = Quaternion(PI / 180 * angle, Vector3(0, 1, 0));
//turret->setOrientation(vector3df(0, turret->getRotation().Y + angle, 0));
dirVec = rotQuat*dirVec, leftVec = rotQuat*leftVec;
dirVec = rotQuat * dirVec, leftVec = rotQuat * leftVec;
this->angle += angle;
}
void Vessel::Turret::update() {
Node *rootNode = Root::getSingleton()->getRootNode();
turretPosition = rootNode->localToGlobalPosition(turret->getPosition());
Vector3 turretPosition = turret->localToGlobalPosition(Vector3::VEC_ZERO);
float hullAngle = PI / 180 /* hullNode->getRotation().Y*/;
float turretAngle = PI / 180 * angle;
/*
@@ -139,7 +97,7 @@ namespace battleship{
*/
}
void Vessel::Turret::debug(const Material &mat) {
void Vessel::Turret::debug() {
/*
float length = turretAxisLength[unitId][turretId]*0 + 1;
IVideoDriver *driver = GameManager::getSingleton()->getDevice()->getVideoDriver();
@@ -153,22 +111,23 @@ namespace battleship{
Vector3* Vessel::Turret::getInitDirs(){
Vector3 *initDirs = new Vector3[2];
switch(unitData::initDirs[unitId][turretId]){
case unitData::FORWARD:
initDirs[0]=vessel->getDirVec();
initDirs[1]=vessel->getLeftVec();
initDirs[0] = vessel->getDirVec();
initDirs[1] = vessel->getLeftVec();
break;
case unitData::BACKWARD:
initDirs[0]=-vessel->getDirVec();
initDirs[1]=-vessel->getLeftVec();
initDirs[0] = -vessel->getDirVec();
initDirs[1] = -vessel->getLeftVec();
break;
case unitData::LEFT:
initDirs[0]=vessel->getLeftVec();
initDirs[1]=-vessel->getDirVec();
initDirs[0] = vessel->getLeftVec();
initDirs[1] = -vessel->getDirVec();
break;
case unitData::RIGHT:
initDirs[0]=-vessel->getLeftVec();
initDirs[1]=vessel->getDirVec();
initDirs[0] = -vessel->getLeftVec();
initDirs[1] = vessel->getDirVec();
break;
}
return initDirs;
@@ -189,7 +148,7 @@ namespace battleship{
*/
}
Vessel::Vessel(Player *player, Vector3 pos, int id) : Unit(player,pos, id) {
Vessel::Vessel(Player *player, Vector3 pos, int id) : Unit(player, pos, id) {
if (numberOfTurrets[id] > 0)
for (int i = 0; i < numberOfTurrets[id]; i++)
turrets.push_back(new Turret(this, id, i));
@@ -197,8 +156,10 @@ namespace battleship{
void Vessel::update() {
Unit::update();
for (Turret *t : turrets) {
t->update();
if ((orders.size() > 0 && orders[0].type != Order::TYPE::ATTACK) || orders.size() == 0) {
float rotAngle = abs(t->getAngle()) < t->getRotationSpeed() ? abs(t->getAngle()) : t->getRotationSpeed();
t->rotate(t->getAngle() > 0 ? -rotAngle : rotAngle);
@@ -212,8 +173,11 @@ namespace battleship{
for (Turret *t : turrets) {
Vector3 *initDirs = t->getInitDirs();
bool right = t->getLeftVec().getAngleBetween(target - t->getPos()) > PI / 2;
float angle = initDirs[0].getAngleBetween(target - t->getPos()) / PI * 180;
Node *rootNode = Root::getSingleton()->getRootNode();
Vector3 turrPos = t->getNode()->localToGlobalPosition(Vector3::VEC_ZERO);
bool right = t->getLeftVec().getAngleBetween(target - turrPos) > PI / 2;
float angle = initDirs[0].getAngleBetween(target - turrPos) / PI * 180;
float rotAngle = t->getRotationSpeed() > angle ? angle : t->getRotationSpeed()*(right?1:-1);
if (-t->getMaxAngle() <= t->getAngle() + rotAngle
@@ -228,9 +192,7 @@ namespace battleship{
}
void Vessel::debug() {
/*
for (Turret *t : turrets)
t->debug(createLineMaterial());
*/
t->debug();
}
}
+10 -11
View File
@@ -19,42 +19,41 @@ namespace battleship {
Vessel(Player*, vb01::Vector3, int);
void update();
protected:
void attack(Order);
void attack(Order);
private:
void debug();
class Turret {
public:
struct Mantlet{
vb01::Node *mantletNode = nullptr, *barrelNode = nullptr;
};
Turret(Unit*, int, int);
void update();
void fire();
void rotate(double);
void debug(const vb01::Material&);
void debug();
vb01::Vector3* getInitDirs();
inline vb01::Vector3 getDirVec(){return dirVec;}
inline vb01::Vector3 getLeftVec(){return leftVec;}
inline vb01::Vector3 getUpVec(){return upVec;}
inline vb01::Vector3 getPos(){return turretPosition;}
inline vb01::Node* getNode(){return turret;}
inline float getMaxAngle(){return maxAngle;}
inline float getRotationSpeed(){return rotationSpeed;}
inline float getAngle(){return angle;}
inline bool canFire(){return vb01::getTime() - lastShotTime > rateOfFire;}
private:
inline std::string getExplosionSfxPath(){return configData::PATH + "Sounds/Explosions/explosion0" + std::to_string(rand() % 4) + ".ogg";}
vb01::Node *fxNode;
vb01::ParticleEmitter *emitter;
Unit *vessel;
vb01::Model *turret, *hull;
std::vector<vb01::Model*> turretMantlets, turretBarrels;
std::vector<vb01::Vector3> turretMantletPos;
vb01::Vector3 turretBarrelPos, turretPosition;
vb01::Node *turret = nullptr, *hull = nullptr;
std::vector<Mantlet> mantlets;
vb01::Vector3 upVec = vb01::Vector3(0, 1, 0), dirVec = vb01::Vector3(0, 0, -1), initDir, leftVec = vb01::Vector3(1, 0, 0);
float angle = 0., barrelAngle = 0., maxAngle, rotationSpeed,maxBarrelAngle;
int rateOfFire, damage, unitId, turretId;
/*
vb01::Model* initMantletNode(irr::scene::IAnimatedMesh*, int, int);
vb01::Model* initBarrelNode(irr::scene::IAnimatedMesh*, irr::scene::ISceneNode*, int, int);
*/
s64 lastShotTime;
sf::SoundBuffer *sfxBuffer;
sf::Sound *sfx = nullptr;