Files
aliendefender/aliens.cpp
buull da42fe8f58 add loader
add schema
new loader model using xml
separated work and load data
validation using schema
map data in xml
new core model... proecting
2010-08-19 20:52:32 +03:00

112 lines
2.8 KiB
C++

#include "aliens.h"
#include <cmath>
Aliens::Aliens(Game_Data *gd, QObject *parent) :
QObject(parent)
{
gameData = gd;
nextId = 0;
}
void Aliens::AddAlien(int srcId)
{
if (srcId < 0 || srcId >= gameData->srcAliens.size())
{
qCritical("ERROR out of aliens range");
return;
}
Alien al = gameData->srcAliens.at(srcId);
al.Id = nextId;
al.finish = gameData->map->finishs.at(qrand()%gameData->map->finishs.size());
qDebug()<<gameData->map->finishs.size()<<qrand()%gameData->map->finishs.size();
al.pos = QPointF(gameData->map->starts.at(qrand()%gameData->map->starts.size()));
al.path = gameData->map->CreatePath(al.pos.toPoint(),al.finish);
al.pathIndex = 1;
if (al.path.isEmpty()) qFatal("ERROR create path");
qDebug() << al.path;
//gameData->map->printMap();
gameData->curAliens.insert(al.Id,al);
nextId++;
}
void Aliens::retrace(bool *OK)
{
qDebug("re-trace!");
gameData->map->removeAliensPath();
for (int i=0; i<gameData->curAliens.size(); i++)
{
Alien al = gameData->curAliens.take(i);
al.path = gameData->map->CreatePath(al.pos.toPoint(),al.finish);
al.pathIndex = 1;
if (al.path.isEmpty()) *OK = false;
}
}
void Aliens::DelAlien(int Id)
{
gameData->curAliens.remove(Id);
}
void Aliens::update()
{
QList <int> missIndex;
for (int i=0; i<gameData->curAliens.size(); i++)
{
Alien al = gameData->curAliens.values().at(i);
//qDebug() << i;
//if (al.health < 0) emit AlienKill();
float tmpdx,tmpdy,angl,arctg = 0;
qDebug() <<"alien"<< i << " path index" << al.pathIndex << " pos" << al.pos;
tmpdx = al.pos.x() - al.path.at(al.pathIndex).x();
tmpdy = al.pos.y() - al.path.at(al.pathIndex).y();
while (std::sqrt(tmpdx*tmpdx +tmpdy*tmpdy) < 2*al.speed)
{
al.pathIndex++;
if (al.pathIndex >= al.path.size())
{
qDebug("Missing alien!");
missIndex.push_back(al.Id);
break;
}
/*{
PathIndex = 0;
position = game->start*game->cellsize;
}*/
tmpdx = al.pos.x() - al.path.at(al.pathIndex).x();
tmpdy = al.pos.y() - al.path.at(al.pathIndex).y();
//qDebug() << "next";
}
arctg = std::atan(tmpdx/tmpdy);
if (tmpdy < 0) arctg=arctg+M_PI;
angl = 180.0f*(-arctg)/M_PI;
/*if (PathIndex > 1)
{
if ((Position.angle-angl < -5 || Position.angle-angl > 5) && angl < 175 && angl > -175)
{
if (angl > Position.angle) Position.angle += 5;
else Position.angle -= 5;
}
else Position.angle = angl;
}
else*/
al.angle = angl;
//qDebug() << "[" << PathIndex << ";" << PicIndex << "]" << "angle:" << Position.angle << "arctg:" << arctg << "Pos:" << Position.pnt;
al.pos.setX(al.pos.x()
-al.speed*std::sin(arctg));
al.pos.setY(al.pos.y()
-al.speed*std::cos(arctg));
//return true;
gameData->curAliens[al.Id] = al;
}
for (int j=0; j<missIndex.size(); j++)
{
gameData->missingAliens++;
DelAlien(missIndex.at(j));
}
}