some bugfix in splashes
This commit is contained in:
131
splashes.cpp
131
splashes.cpp
@@ -11,8 +11,11 @@ Splashes::Splashes(Game_Data *gd, QObject *parent) :
|
||||
|
||||
bool Splashes::addSplash(int srcId, QPointF pos)
|
||||
{
|
||||
qFatal("don't use this function addSplash(int srcId, QPointF pos)");
|
||||
if (srcId < 0 || srcId >= gameData->srcSplashes.size())
|
||||
qDebug("don't use this function addSplash(int srcId, QPointF pos)");
|
||||
return false;
|
||||
// FIXME: говнокод
|
||||
// TODO: find and correct errors here
|
||||
/* if (srcId < 0 || srcId >= gameData->srcSplashes.size())
|
||||
{
|
||||
qCritical("ERROR out of splashes range");
|
||||
return false;
|
||||
@@ -42,36 +45,61 @@ bool Splashes::addSplash(int srcId, QPointF pos)
|
||||
}
|
||||
gameData->curSplashes.insert(spl.id,spl);
|
||||
nextId++;
|
||||
return true;
|
||||
return true;*/
|
||||
}
|
||||
|
||||
|
||||
void Splashes::addSplash(srcSplashType src, int index, TowerType tw)
|
||||
void Splashes::addSplash(QPoint curTowerId)
|
||||
{
|
||||
SplashType spl;
|
||||
spl.id = nextId;
|
||||
spl.TowerId = tw.pos;
|
||||
if (!gameData->curAliens.contains(tw.aim))
|
||||
qFatal("Error finding splash aim! Tower has nvalid aim!");
|
||||
spl.destination = gameData->curAliens.value(tw.aim).pos;
|
||||
if (src.autoControl)
|
||||
spl.AlienId = tw.aim;
|
||||
else
|
||||
spl.AlienId = -1;
|
||||
spl.angle = tw.angle; // FIXME: tower not rotate
|
||||
spl.pos = tw.pos; // FIXME: pos not in center or left-angle of tower
|
||||
spl.imgType = src.imgType;
|
||||
spl.life = 0;
|
||||
spl.src = index;
|
||||
TriggerType trig;
|
||||
for(int i=0; i<src.triggerIndexes.size(); i++)
|
||||
if (gameData->curTowers.contains(curTowerId))
|
||||
{
|
||||
trig.timer = gameData->players.at(tw.PlayerId)->srcTowers.at(tw.src).triggers.at(src.triggerIndexes.at(i)).timer;
|
||||
trig.src = src.triggerIndexes.at(i);
|
||||
spl.triggers.push_back(trig);
|
||||
TowerType tw = gameData->curTowers.value(curTowerId);
|
||||
srcSplashType src = gameData->players.at(tw.PlayerId)->srcTowers.at(tw.src).splashes.at(0);
|
||||
SplashType spl;
|
||||
spl.id = nextId;
|
||||
spl.TowerId = curTowerId;
|
||||
spl.srcTower = tw.src;
|
||||
spl.PlayerId = tw.PlayerId;
|
||||
if (!gameData->curAliens.contains(tw.aim))
|
||||
qFatal("Error finding splash aim! Tower has nvalid aim!");
|
||||
spl.destination = gameData->curAliens.value(tw.aim).pos;
|
||||
if (src.autoControl)
|
||||
spl.AlienId = tw.aim;
|
||||
else
|
||||
spl.AlienId = -1;
|
||||
spl.angle = tw.angle;
|
||||
spl.pos = tw.pos; // FIXME: splash do not create in center or left-angle of tower, it must be in tower's side
|
||||
spl.imgType = src.imgType;
|
||||
spl.life = 0;
|
||||
spl.src = 0;
|
||||
//TriggerType trig;
|
||||
for(int i=0; i<src.triggerIndexes.size(); i++)
|
||||
{
|
||||
srcTriggerType trig;
|
||||
TriggerOnDest tod;
|
||||
TriggerOnAlien toa;
|
||||
TriggerOnTimer tot;
|
||||
trig = gameData->players.at(tw.PlayerId)->srcTowers.at(tw.src).triggers.at(src.triggerIndexes.at(i));
|
||||
switch (trig.type)
|
||||
{
|
||||
case srcTriggerType::onDestination :
|
||||
tod.src = src.triggerIndexes.at(i);
|
||||
spl.trigsOnDest.append(tod);
|
||||
break;
|
||||
case srcTriggerType::onAlienInRadius :
|
||||
toa.src = src.triggerIndexes.at(i);
|
||||
spl.trigsOnAlien.append(toa);
|
||||
break;
|
||||
case srcTriggerType::onTimer :
|
||||
tot.src = src.triggerIndexes.at(i);
|
||||
tot.timer = trig.timer;
|
||||
spl.trigsOnTimer.append(tot);
|
||||
break;
|
||||
}
|
||||
}
|
||||
gameData->curSplashes.insert(spl.id,spl);
|
||||
nextId++;
|
||||
}
|
||||
gameData->curSplashes.insert(spl.id,spl);
|
||||
nextId++;
|
||||
}
|
||||
|
||||
|
||||
@@ -94,30 +122,39 @@ void Splashes::update()
|
||||
//isTowerSplash = true;
|
||||
//if (!isTowerSplash)
|
||||
// src = gameData->srcSplashes.at(spl.src);
|
||||
if (src.autoControl)
|
||||
if (src.autoControl)
|
||||
{
|
||||
bool badAl = false;
|
||||
if (gameData->curAliens.contains(spl.AlienId))
|
||||
spl.destination = gameData->curAliens.value(spl.AlienId).pos;
|
||||
else
|
||||
badAl = true;
|
||||
if (distance2(spl.pos, spl.destination) < src.speed*src.speed)
|
||||
{
|
||||
if (distance2(spl.pos, spl.destination) < src.speed*src.speed)
|
||||
if (badAl)
|
||||
deadIndexes.push_back(spl.id);
|
||||
if (gameData->curAliens.contains(spl.AlienId))
|
||||
spl.destination = gameData->curAliens.value(spl.AlienId).pos;
|
||||
arctg = std::atan2(spl.pos.x() - spl.destination.x(),spl.pos.y() - spl.destination.y());
|
||||
//if (tmpdy < 0) arctg=arctg+M_PI;
|
||||
angl = 180.0f*(-arctg)/M_PI;
|
||||
|
||||
spl.angle = angl;
|
||||
|
||||
spl.pos.setX(spl.pos.x()
|
||||
-src.speed*std::sin(arctg));
|
||||
spl.pos.setY(spl.pos.y()
|
||||
-src.speed*std::cos(arctg));
|
||||
} else {
|
||||
if (!gameData->map->rect().contains(spl.pos.toPoint()))
|
||||
deadIndexes.push_back(spl.id);
|
||||
spl.pos.setX(spl.pos.x()
|
||||
-src.speed*std::sin(-spl.angle*M_PI/180.f));
|
||||
spl.pos.setY(spl.pos.y()
|
||||
-src.speed*std::cos(-spl.angle*M_PI/180.f));
|
||||
spl.pos = spl.destination;
|
||||
for (int k=0; k<spl.trigsOnDest.size(); k++)
|
||||
{
|
||||
// TODO: activate trigger
|
||||
}
|
||||
}
|
||||
arctg = std::atan2(spl.pos.x() - spl.destination.x(),spl.pos.y() - spl.destination.y());
|
||||
//if (tmpdy < 0) arctg=arctg+M_PI;
|
||||
angl = 180.0f*(-arctg)/M_PI;
|
||||
spl.angle = angl;
|
||||
spl.pos.setX(spl.pos.x()
|
||||
-src.speed*std::sin(arctg));
|
||||
spl.pos.setY(spl.pos.y()
|
||||
-src.speed*std::cos(arctg));
|
||||
} else {
|
||||
if (!gameData->map->rect().contains(spl.pos.toPoint()))
|
||||
deadIndexes.push_back(spl.id);
|
||||
spl.pos.setX(spl.pos.x()
|
||||
-src.speed*std::sin(-spl.angle*M_PI/180.f));
|
||||
spl.pos.setY(spl.pos.y()
|
||||
-src.speed*std::cos(-spl.angle*M_PI/180.f));
|
||||
}
|
||||
// TODO: smooth splash rotate
|
||||
// TODO: activate trigger and more...
|
||||
gameData->curSplashes.insert(spl.id,spl);
|
||||
|
||||
Reference in New Issue
Block a user