Files
aliendefender/towers.cpp
buull 8fa6b8e2a6 added animation
but not full in ADeditor
2010-09-05 16:25:23 +04:00

117 lines
3.0 KiB
C++

#include "towers.h"
#include <cmath>
Towers::Towers(Game_Data *gd, 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())
{
qCritical("ERROR out of towers range");
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;
TowerType tw;
tw.src = srcId;
tw.imgType = gameData->players.at(playerId)->srcTowers.at(srcId).imgType;
tw.animIndex = 0;
tw.PlayerId = playerId;
tw.angle = 0;
tw.build = 0;
tw.reload = 0;
tw.aim = -1;
tw.experience = 0;
//tw .oldAim = -1;
if (gameData->map->addTowerOnMap(playerId,pos))
{
tw.pos = pos;
//qDebug() << "tw" << pos;
//gameData->map->printMap();
gameData->curTowers.insert(tw.pos,tw);
return true;
}
return false;
}
void Towers::delTower(QPoint pos)
{
if (gameData->curTowers.contains(pos))
{
gameData->map->delTowerOnMap(gameData->curTowers.value(pos).PlayerId,pos);
gameData->curTowers.remove(pos);
}
}
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)
{
(*i).build++;
//qDebug() << "building tower ..." << (*i).build;
} else {
if (!(gameData->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 (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;
}
if ((*i).aim < 0)
{
for (QHash<int, AlienType>::iterator j = gameData->curAliens.begin(); j != gameData->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;
}
}
// TODO: calculate tower angl
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;
}
// TODO: smooth rotate tower to aim
if ((*i).reload < stw.reload)
(*i).reload++;
else
{
if ((*i).aim > 0)
{
(*i).reload = 0;
(*i).experience += stw.expByShot;
emit shot((*i).pos);
//qDebug("shot!");
}
}
}
//qDebug() << "aim=" << (*i).aim;
}
}