mirror of
https://github.com/devZoGok/PlanetFleet.git
synced 2026-09-02 12:33:39 +00:00
removed many Irrlicht references
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
#include <model.h>
|
||||
#include <texture.h>
|
||||
|
||||
#include "unit.h"
|
||||
#include "inGameAppState.h"
|
||||
#include "stateManager.h"
|
||||
@@ -7,63 +10,62 @@
|
||||
using namespace game::content::unitData;
|
||||
using namespace game::core;
|
||||
using namespace game::util;
|
||||
using namespace sf;
|
||||
using namespace vb01;
|
||||
using namespace std;
|
||||
|
||||
namespace game{
|
||||
namespace content{
|
||||
Unit::Unit(Player *player, vector3df pos, int id) {
|
||||
Unit::Unit(Player *player, vb01::Vector3 pos, int id) {
|
||||
this->id = id;
|
||||
this->player = player;
|
||||
type = unitData::unitType[id];
|
||||
this->health = unitData::health[id];
|
||||
this->maxTurnAngle = unitData::maxTurnAngle[id];
|
||||
this->range = unitData::range[id];
|
||||
this->lineOfSight = unitData::lineOfSight[id];
|
||||
width = unitData::unitCornerPoints[id][0].X - unitData::unitCornerPoints[id][1].X;
|
||||
height = unitData::unitCornerPoints[id][4].Y - unitData::unitCornerPoints[id][0].Y;
|
||||
length = unitData::unitCornerPoints[id][3].Z - unitData::unitCornerPoints[id][0].Z;
|
||||
this->speed = unitData::speed[id];
|
||||
type = unitData::unitType[id];
|
||||
width = unitData::unitCornerPoints[id][0].x - unitData::unitCornerPoints[id][1].x;
|
||||
height = unitData::unitCornerPoints[id][4].y - unitData::unitCornerPoints[id][0].y;
|
||||
length = unitData::unitCornerPoints[id][3].z - unitData::unitCornerPoints[id][0].z;
|
||||
|
||||
GameManager *gm = GameManager::getSingleton();
|
||||
ISceneManager *smgr = gm->getDevice()->getSceneManager();
|
||||
IVideoDriver *driver = gm->getDevice()->getVideoDriver();
|
||||
this->speed = unitData::speed[id];
|
||||
mesh = smgr->getMesh(basePath[id] + meshPath[id]);
|
||||
node = smgr->addAnimatedMeshSceneNode(mesh);
|
||||
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();
|
||||
ITexture *diffuseTexture = driver->getTexture(basePath[id] + "diffuseMap.png");
|
||||
|
||||
if (diffuseTexture)
|
||||
node->setMaterialTexture(0, diffuseTexture);
|
||||
else
|
||||
node->setMaterialTexture(0, driver->getTexture(DEFAULT_TEXTURE));
|
||||
*/
|
||||
string f[]{basePath[id] + "diffuseMap.png"};
|
||||
Texture *diffuseTexture = new Texture(f, 1);
|
||||
|
||||
/*
|
||||
light = smgr->addLightSceneNode(node, vector3df(0, 2, 0), SColor(255, 255, 255, 255), lineOfSight);
|
||||
light->setVisible(false);
|
||||
node->setVisible(false);
|
||||
selectionSfxBuffer=new SoundBuffer();
|
||||
path p=PATH+"Sounds/"+unitData::name[id]+"s/selection.ogg";
|
||||
*/
|
||||
selectionSfxBuffer = new sf::SoundBuffer();
|
||||
string p = PATH+"Sounds/"+unitData::name[id]+"s/selection.ogg";
|
||||
|
||||
if(selectionSfxBuffer->loadFromFile(p.c_str()))
|
||||
selectionSfx=new Sound(*selectionSfxBuffer);
|
||||
selectionSfx = new sf::Sound(*selectionSfxBuffer);
|
||||
}
|
||||
|
||||
Unit::~Unit() {
|
||||
/*
|
||||
GameManager *gm = GameManager::getSingleton();
|
||||
ISceneManager *smgr = gm->getDevice()->getSceneManager();
|
||||
IVideoDriver *driver = gm->getDevice()->getVideoDriver();
|
||||
// driver->removeTexture(node->getMaterial(0).getTexture(0));
|
||||
driver->removeTexture(node->getMaterial(0).getTexture(0));
|
||||
node->removeChild(light);
|
||||
node->getParent()->removeChild(node);
|
||||
*/
|
||||
}
|
||||
|
||||
void Unit::update() {
|
||||
if (orders.size() > 0){
|
||||
if(selected&&canDisplayOrderLine()){
|
||||
int r=0,g=0,b=0;
|
||||
|
||||
switch(orders[0].type){
|
||||
case Order::TYPE::MOVE:
|
||||
g=255;
|
||||
@@ -77,18 +79,23 @@ namespace game{
|
||||
r=255,g=255;
|
||||
break;
|
||||
}
|
||||
GameManager::getSingleton()->getDevice()->getVideoDriver()->draw3DLine(pos,*(orders[0].targetPos[0]),SColor(255,r,g,b));
|
||||
|
||||
//GameManager::getSingleton()->getDevice()->getVideoDriver()->draw3DLine(pos,*(orders[0].targetPos[0]),SColor(255,r,g,b));
|
||||
}
|
||||
|
||||
while (patrolPoints.size() > 0 && orders[0].type != Order::TYPE::PATROL) {
|
||||
patrolPoints.pop_back();
|
||||
patrolPointId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
executeOrders();
|
||||
|
||||
if (health <= 0)
|
||||
blowUp();
|
||||
}
|
||||
|
||||
/*
|
||||
void Unit::updateScreenCoordinates(ICameraSceneNode *cam, vector3df camDir, vector3df camLeft, vector3df camUp) {
|
||||
vector3df camPos = cam->getPosition();
|
||||
vector3df farLeftUpPoint = cam->getViewFrustum()->getFarLeftUp();
|
||||
@@ -115,11 +122,13 @@ namespace game{
|
||||
} else
|
||||
selectable = false;
|
||||
}
|
||||
*/
|
||||
|
||||
void Unit::blowUp(){
|
||||
working=false;
|
||||
working = false;
|
||||
}
|
||||
|
||||
/*
|
||||
void Unit::updateUnitGUIInfo(ICameraSceneNode* cam, vector3df camDir, vector3df camLeft, vector3df camUp) {
|
||||
updateScreenCoordinates(cam, camDir, camLeft, camUp);
|
||||
if (selected) {
|
||||
@@ -127,7 +136,9 @@ namespace game{
|
||||
drawCuboid();
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
void Unit::displayUnitStats() {
|
||||
IVideoDriver *driver = GameManager::getSingleton()->getDevice()->getVideoDriver();
|
||||
SColor white = SColor(255, 255, 255, 255);
|
||||
@@ -138,7 +149,9 @@ namespace game{
|
||||
driver->draw2DRectangle(SColor(255, 0, 200, 0), rect<s32>(screenPos.X - 50, screenPos.Y - 19, screenPos.X - 50 + ((float)health / unitData::health[id]) * 100, screenPos.Y));
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
void Unit::drawCuboid() {
|
||||
IVideoDriver *driver = GameManager::getSingleton()->getDevice()->getVideoDriver();
|
||||
driver->setTransform(ETS_WORLD, IdentityMatrix);
|
||||
@@ -157,7 +170,9 @@ namespace game{
|
||||
driver->draw3DLine(pos + vec, pos + vec + yVec);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
void Unit::debug() {
|
||||
IVideoDriver *driver = GameManager::getSingleton()->getDevice()->getVideoDriver();
|
||||
driver->setTransform(ETS_WORLD, IdentityMatrix);
|
||||
@@ -167,10 +182,12 @@ namespace game{
|
||||
driver->draw3DLine(pos, pos + leftVec * length, SColor(255, 255, 0, 0));
|
||||
driver->draw3DLine(pos, pos + upVec * length, SColor(255, 0, 255, 0));
|
||||
}
|
||||
*/
|
||||
|
||||
void Unit::executeOrders() {
|
||||
if (orders.size() > 0) {
|
||||
Order order = orders[0];
|
||||
|
||||
switch (order.type) {
|
||||
case Order::TYPE::ATTACK:
|
||||
attack(order);
|
||||
@@ -179,9 +196,7 @@ namespace game{
|
||||
move(order, unitData::destinationOffset[id]);
|
||||
break;
|
||||
case Order::TYPE::PATROL:
|
||||
{
|
||||
patrol(order);
|
||||
}
|
||||
break;
|
||||
case Order::TYPE::LAUNCH:
|
||||
launch(order);
|
||||
@@ -195,12 +210,14 @@ namespace game{
|
||||
void Unit::setOrder(Order order) {
|
||||
while (orders.size() > 0)
|
||||
orders.pop_back();
|
||||
|
||||
addOrder(order);
|
||||
orderLineDispTime=getTime();
|
||||
orderLineDispTime = getTime();
|
||||
}
|
||||
|
||||
void Unit::attack(Order order) {
|
||||
vector3df target=*order.targetPos[0];
|
||||
Vector3 target = *order.targetPos[0];
|
||||
|
||||
if (pos.getDistanceFrom(target) >= range)
|
||||
move(order, range);
|
||||
// InGameAppState *inGameState=((InGameAppState*)gameManager->getAppState(AppStateTypes::IN_GAME_STATE));
|
||||
@@ -211,39 +228,47 @@ namespace game{
|
||||
|
||||
void Unit::move(Order order, float destOffset) {
|
||||
float movementAmmount, radius = getCircleRadius(), angle = 0.;
|
||||
vector3df dest = *order.targetPos[0];
|
||||
dest.Y = pos.Y;
|
||||
vector3df center;
|
||||
if (getAngleBetween(leftVec, dest - pos) < PI / 2) {
|
||||
Vector3 dest = *order.targetPos[0];
|
||||
dest.y = pos.y;
|
||||
Vector3 center;
|
||||
|
||||
if (leftVec.getAngleBetween(dest - pos) < PI / 2) {
|
||||
moveDir = MoveDir::LEFT;
|
||||
center = pos + leftVec*radius;
|
||||
} else if (getAngleBetween(-leftVec, dest - pos) < PI / 2) {
|
||||
} else if (-leftVec.getAngleBetween(dest - pos) < PI / 2) {
|
||||
moveDir = MoveDir::RIGHT;
|
||||
center = pos - leftVec*radius;
|
||||
}
|
||||
|
||||
bool withinCircle = center.getDistanceFrom(dest) < radius ? true : false;
|
||||
|
||||
if (moveDir != MoveDir::FORWARD) {
|
||||
if (withinCircle)
|
||||
angle = getAngleBetween(dirVec, center - dest) / PI * 180;
|
||||
angle = dirVec.getAngleBetween(center - dest) / PI * 180;
|
||||
else
|
||||
angle = getAngleBetween(dirVec, dest - pos) / PI * 180;
|
||||
angle = dirVec.getAngleBetween(dest - pos) / PI * 180;
|
||||
|
||||
angle = isnan(angle) ? 0. : angle;
|
||||
|
||||
if (angle > anglePrecision[id]) {
|
||||
float rotAngle = maxTurnAngle > angle ? angle : maxTurnAngle;
|
||||
angle -= rotAngle;
|
||||
turn(moveDir == MoveDir::RIGHT ? rotAngle : -rotAngle);
|
||||
}
|
||||
}
|
||||
|
||||
if (angle > anglePrecision[id])
|
||||
movementAmmount = speed;
|
||||
else {
|
||||
if (withinCircle) {
|
||||
float inDest = ((center - dest).normalize() * radius - (center - dest)).getLength();
|
||||
float inDest = ((center - dest).norm() * radius - (center - dest)).getLength();
|
||||
movementAmmount = speed > inDest ? inDest : speed;
|
||||
} else
|
||||
movementAmmount = speed > pos.getDistanceFrom(dest) ? pos.getDistanceFrom(dest) : speed;
|
||||
}
|
||||
|
||||
advance(movementAmmount);
|
||||
|
||||
if (pos.getDistanceFrom(dest) <= destOffset && orders[0].type == Order::TYPE::MOVE) {
|
||||
moveDir = MoveDir::FORWARD;
|
||||
removeOrder(0);
|
||||
@@ -257,14 +282,16 @@ namespace game{
|
||||
void Unit::launch(Order order) {}
|
||||
|
||||
void Unit::advance(float speed) {
|
||||
pos += dirVec*speed;
|
||||
pos = pos + dirVec * speed;
|
||||
node->setPosition(pos);
|
||||
}
|
||||
|
||||
void Unit::turn(float angle) {// rad
|
||||
quaternion rotQuat = rotQuat.fromAngleAxis(PI / 180 * angle, vector3df(0, 1, 0));
|
||||
node->setRotation(vector3df(node->getRotation().X, node->getRotation().Y + angle, 0));
|
||||
/*
|
||||
Quaternion rotQuat = Quaternion(PI / 180 * angle, Vector3(0, 1, 0));
|
||||
node->setOrientation(Vector3(node->getOrientation().x, node->getRotation().Y + angle, 0));
|
||||
dirVec = rotQuat*dirVec, leftVec = rotQuat*leftVec;
|
||||
*/
|
||||
}
|
||||
|
||||
void Unit::halt() {
|
||||
@@ -279,66 +306,76 @@ namespace game{
|
||||
return radius;
|
||||
}
|
||||
|
||||
void Unit::placeUnit(vector3df p) {
|
||||
void Unit::placeUnit(Vector3 p) {
|
||||
node->setPosition(p);
|
||||
pos = p;
|
||||
}
|
||||
|
||||
void Unit::orientUnit(vector3df orientVec){
|
||||
vector3df orientVecProj=vector3df(orientVec.X,0,orientVec.Z).normalize();
|
||||
float projAngle=getAngleBetween(orientVec,orientVecProj);
|
||||
float rotAngle=getAngleBetween(vector3df(0,0,-1),orientVecProj);
|
||||
rotAngle*=(orientVec.X<0?1:-1)/PI*180;
|
||||
projAngle*=(orientVec.Y>0?1:-1)/PI*180;
|
||||
dirVec=orientVecProj;
|
||||
upVec=vector3df(0,1,0);
|
||||
leftVec=quaternion(0,0,0,1).fromAngleAxis(-PI/2,upVec)*dirVec;
|
||||
quaternion rotQuat=quaternion(0,0,0,1).fromAngleAxis(projAngle/180*PI,leftVec);
|
||||
dirVec=rotQuat*dirVec;
|
||||
upVec=rotQuat*upVec;
|
||||
node->setRotation(vector3df(projAngle,rotAngle,0));
|
||||
void Unit::orientUnit(Vector3 orientVec){
|
||||
Vector3 orientVecProj = Vector3(orientVec.x, 0, orientVec.z).norm();
|
||||
float projAngle = orientVec.getAngleBetween(orientVecProj);
|
||||
float rotAngle = Vector3(0,0,-1).getAngleBetween(orientVecProj);
|
||||
|
||||
rotAngle *= (orientVec.x < 0 ? 1 : -1) / PI * 180;
|
||||
projAngle *= (orientVec.y > 0 ? 1 : -1) / PI * 180;
|
||||
dirVec = orientVecProj;
|
||||
upVec = Vector3(0,1,0);
|
||||
leftVec = Quaternion(-PI / 2, upVec) * dirVec;
|
||||
Quaternion rotQuat = Quaternion(projAngle / 180 * PI, leftVec);
|
||||
dirVec = rotQuat * dirVec;
|
||||
upVec = rotQuat * upVec;
|
||||
//node->setRotation(vector3df(projAngle,rotAngle,0));
|
||||
}
|
||||
|
||||
vector3df Unit::getCorner(int i) {
|
||||
vector3df corner=unitCornerPoints[id][i];
|
||||
return pos+(leftVec*corner.X+upVec*corner.Y-dirVec*corner.Z);
|
||||
Vector3 Unit::getCorner(int i) {
|
||||
Vector3 corner = unitCornerPoints[id][i];
|
||||
return pos + (leftVec * corner.x + upVec * corner.y - dirVec * corner.z);
|
||||
}
|
||||
|
||||
std::vector<Projectile*> Unit::getProjectiles(){
|
||||
std::vector<Projectile*> projectiles;
|
||||
InGameAppState *inGameState=((InGameAppState*)GameManager::getSingleton()->getStateManager()->getAppState(AppStateTypes::IN_GAME_STATE));
|
||||
|
||||
for(Projectile *p: inGameState->getProjectiles())
|
||||
if(p->getUnit()==this)
|
||||
projectiles.push_back(p);
|
||||
|
||||
return projectiles;
|
||||
}
|
||||
|
||||
void Unit::removeOrder(int id) {
|
||||
for (vector3df *v : orders[id].targetPos) {
|
||||
for (Vector3 *v : orders[id].targetPos) {
|
||||
bool isUnitPos = false;
|
||||
InGameAppState *state = (InGameAppState*) GameManager::getSingleton()->getStateManager()->getAppState(AppStateTypes::IN_GAME_STATE);
|
||||
|
||||
for (Player *p : state->getPlayers())
|
||||
for (Unit *u : p->getUnits())
|
||||
if (v == u->getPosPtr())
|
||||
isUnitPos = true;
|
||||
|
||||
if(!isUnitPos)
|
||||
delete v;
|
||||
}
|
||||
|
||||
orders.erase(orders.begin() + id);
|
||||
}
|
||||
|
||||
void Unit::toggleSelection(bool selection) {
|
||||
selected = selection;
|
||||
if(selection&&selectionSfx)
|
||||
|
||||
if(selection && selectionSfx)
|
||||
selectionSfx->play();
|
||||
|
||||
orderLineDispTime=getTime();
|
||||
}
|
||||
|
||||
/*
|
||||
SMaterial Unit::createLineMaterial() {
|
||||
SMaterial mat;
|
||||
mat.Lighting = false;
|
||||
return mat;
|
||||
}
|
||||
*/
|
||||
|
||||
void Unit::addProjectile(Projectile *p) {((InGameAppState*)GameManager::getSingleton()->getStateManager()->getAppState(AppStateTypes::IN_GAME_STATE))->addProjectile(p);}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user