changes in arhitecture, some improvments, much optimising and simplify,
many bagfixes and new graphics engine
This commit is contained in:
109
towers.cpp
109
towers.cpp
@@ -3,45 +3,51 @@
|
||||
#include <cmath>
|
||||
|
||||
Towers::Towers(Game_Data *gd, QObject *parent) :
|
||||
QObject(parent)
|
||||
QObject(parent)
|
||||
{
|
||||
gameData = gd;
|
||||
}
|
||||
|
||||
bool Towers::addTower(int playerId, int srcId, QPoint pos)
|
||||
{
|
||||
//QByteArray ar;
|
||||
//ar << pos;
|
||||
if (playerId < 0 || playerId >= gameData->players.size())
|
||||
{
|
||||
qCritical("ERROR out of players range");
|
||||
return false;
|
||||
}
|
||||
if (srcId < 0 || srcId >= gameData->players.at(playerId)->srcTowers.size())
|
||||
Player * p = gameData->players.at(playerId);
|
||||
if (srcId < 0 || srcId >= p->srcTowers.size())
|
||||
{
|
||||
qCritical("ERROR out of towers range");
|
||||
return false;
|
||||
}
|
||||
if (p->money < p->srcTowers.at(srcId).cost)
|
||||
{
|
||||
qDebug() << "not enought money!";
|
||||
return false;
|
||||
}
|
||||
QRect alrec(pos,QSize(2,2));
|
||||
for (QHash<int, AlienType>::iterator i = gameData->curAliens.begin(); i != gameData->curAliens.end(); ++i)
|
||||
if (alrec.contains((*i).pos.toPoint())) return false;
|
||||
for (QHash<int, AlienType>::iterator i = gameData->aliens->curAliens.begin(); i != gameData->aliens->curAliens.end(); ++i)
|
||||
if (alrec.contains(i->pos.toPoint())) return false;
|
||||
TowerType tw;
|
||||
tw.src = srcId;
|
||||
tw.imgType = gameData->players.at(playerId)->srcTowers.at(srcId).imgType;
|
||||
tw.animIndex = 0;
|
||||
tw.src = &(p->srcTowers[srcId]);
|
||||
tw.PlayerId = playerId;
|
||||
tw.angle = 0;
|
||||
tw.build = 0;
|
||||
tw.reload = 0;
|
||||
tw.aim = -1;
|
||||
tw.experience = 0;
|
||||
//tw .oldAim = -1;
|
||||
tw.isBilding = true;
|
||||
if (gameData->map->addTowerOnMap(playerId,pos))
|
||||
{
|
||||
tw.pos = pos;
|
||||
//qDebug() << "tw" << pos;
|
||||
//gameData->map->printMap();
|
||||
tw.item = new ADItem(tw.pos,tw.src->image,QRectF(-cellSize,-cellSize,cellSize*2,cellSize*2));
|
||||
tw.item->setPos(tw.pos * cellSize);
|
||||
tw.item->rotate(tw.angle);
|
||||
tw.item->setOpacity(0.5);
|
||||
scene->addItem(tw.item);
|
||||
gameData->curTowers.insert(tw.pos,tw);
|
||||
p->money -= tw.src->cost;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -50,10 +56,18 @@ bool Towers::addTower(int playerId, int srcId, QPoint pos)
|
||||
|
||||
void Towers::delTower(QPoint pos)
|
||||
{
|
||||
if (gameData->curTowers.contains(pos))
|
||||
QPoint p;
|
||||
if (gameData->curTowers.contains(pos)) p = pos;
|
||||
if (gameData->curTowers.contains(pos+QPoint(1,0))) p = pos+QPoint(1,0);
|
||||
if (gameData->curTowers.contains(pos+QPoint(1,1))) p = pos+QPoint(1,1);
|
||||
if (gameData->curTowers.contains(pos+QPoint(0,1))) p = pos+QPoint(0,1);
|
||||
if (gameData->curTowers.contains(p))
|
||||
{
|
||||
gameData->map->delTowerOnMap(gameData->curTowers.value(pos).PlayerId,pos);
|
||||
gameData->curTowers.remove(pos);
|
||||
TowerType * t = &(gameData->curTowers[p]);
|
||||
gameData->map->delTowerOnMap(t->PlayerId,p);
|
||||
scene->removeItem(t->item);
|
||||
delete t->item;
|
||||
gameData->curTowers.remove(p);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,55 +76,58 @@ void Towers::update()
|
||||
{
|
||||
for (QHash<QPoint, TowerType>::iterator i = gameData->curTowers.begin(); i != gameData->curTowers.end(); ++i)
|
||||
{
|
||||
srcTowerType stw = gameData->players.at((*i).PlayerId)->srcTowers.at((*i).src);
|
||||
if ((*i).build < stw.buildTime)
|
||||
if (i->isBilding)
|
||||
{
|
||||
(*i).build++;
|
||||
//qDebug() << "building tower ..." << (*i).build;
|
||||
if (i->build < i->src->buildTime)
|
||||
{
|
||||
i->build++;
|
||||
i->item->setBarValue((float)(i->build)/i->src->buildTime);
|
||||
} else {
|
||||
i->isBilding = false;
|
||||
i->item->hideBar();
|
||||
i->item->setOpacity(1.0);
|
||||
}
|
||||
} else {
|
||||
if (!(gameData->curAliens.contains((*i).aim)))
|
||||
(*i).aim = -1;
|
||||
float rad = i->src->radius;
|
||||
float rad2 = rad*rad;
|
||||
if (!(gameData->aliens->curAliens.contains(i->aim)))
|
||||
i->aim = -1;
|
||||
else
|
||||
{
|
||||
if (distance2((*i).pos,gameData->curAliens.value((*i).aim).pos) > stw.radius*stw.radius)
|
||||
(*i).aim = -1;
|
||||
if (distance2(i->pos,gameData->aliens->curAliens.value(i->aim).pos) > rad2)
|
||||
i->aim = -1;
|
||||
}
|
||||
if (gameData->players.at((*i).PlayerId)->selectAlienId > 0)
|
||||
if (gameData->players.at(i->PlayerId)->selectAlienId > 0)
|
||||
{
|
||||
AlienType al = gameData->curAliens.value(gameData->players.at((*i).PlayerId)->selectAlienId);
|
||||
if (distance2(al.pos, (*i).pos) < stw.radius*stw.radius) (*i).aim = al.id;
|
||||
AlienType al = gameData->aliens->curAliens.value(gameData->players.at(i->PlayerId)->selectAlienId);
|
||||
if (distance2(al.pos, i->pos) < rad2) i->aim = al.id;
|
||||
}
|
||||
if ((*i).aim < 0)
|
||||
if (i->aim < 0)
|
||||
{
|
||||
for (QHash<int, AlienType>::iterator j = gameData->curAliens.begin(); j != gameData->curAliens.end(); ++j)
|
||||
for (QHash<int, AlienType>::iterator j = gameData->aliens->curAliens.begin(); j != gameData->aliens->curAliens.end(); ++j)
|
||||
{
|
||||
float dist = distance2((*i).pos, (*j).pos);
|
||||
//qDebug() << "dist=" << dist << "radius=" << stw.radius*stw.radius;
|
||||
if (dist < stw.radius*stw.radius) (*i).aim = (*j).id;
|
||||
//else (*i).aim = -1;
|
||||
float dist = distance2(i->pos, (*j).pos);
|
||||
if (dist < rad2) i->aim = (*j).id;
|
||||
}
|
||||
}
|
||||
// TODO: calculate tower angl
|
||||
if ((*i).aim > 0)
|
||||
if (i->aim > 0)
|
||||
{
|
||||
float arctg = std::atan2((*i).pos.x() - gameData->curAliens.value((*i).aim).pos.x(),(*i).pos.y() - gameData->curAliens.value((*i).aim).pos.y());
|
||||
//if (tmpdy < 0) arctg=arctg+M_PI;
|
||||
(*i).angle = 180.0f*(-arctg)/M_PI;
|
||||
float arctg = std::atan2(i->pos.x() - gameData->aliens->curAliens.value(i->aim).pos.x(),i->pos.y() - gameData->aliens->curAliens.value(i->aim).pos.y());
|
||||
i->angle = 180.0f*(-arctg)/M_PI;
|
||||
i->item->setRotation(i->angle);
|
||||
}
|
||||
// TODO: smooth rotate tower to aim
|
||||
if ((*i).reload < stw.reload)
|
||||
(*i).reload++;
|
||||
/// TODO: smooth rotate tower to aim
|
||||
if (i->reload < i->src->reload)
|
||||
i->reload++;
|
||||
else
|
||||
{
|
||||
if ((*i).aim > 0)
|
||||
if (i->aim > 0)
|
||||
{
|
||||
(*i).reload = 0;
|
||||
(*i).experience += stw.expByShot;
|
||||
emit shot((*i).pos);
|
||||
//qDebug("shot!");
|
||||
i->reload = 0;
|
||||
i->experience += i->src->expByShot;
|
||||
emit shot((*i));
|
||||
}
|
||||
}
|
||||
}
|
||||
//qDebug() << "aim=" << (*i).aim;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user