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

200 lines
6.1 KiB
C++

#include "ad_graphics.h"
#include <QGLWidget>
AD_Graphics::AD_Graphics(AD_Core *adcore, QWidget *parent) : QGraphicsView(parent)
{
data = adcore->addata;
core = adcore;
//scale(cellSize, cellSize);
setAlignment(Qt::AlignLeft | Qt::AlignTop);
scene = new QGraphicsScene();
setScene(scene);
//setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
mapimg = new QImage(data->map->rect().size()*cellSize,QImage::Format_ARGB32);
//setDragMode(RubberBandDrag);
//gsw = new QGraphicsWidget();
//scene->addWidget(new QPushButton());
QPainter p(mapimg);
for (int i=0; i<data->map->cells().size(); i++) {
for (int j=0; j<data->map->cells().at(i).size(); j++) {
QPen pen;
QBrush brush;
pen.setColor(Qt::white);
brush.setColor(Qt::white);
brush.setStyle(Qt::SolidPattern);
int cel = data->map->cells().at(i).at(j);
if (cel == Map::Wall)
{
pen.setColor(Qt::black);
brush.setColor(Qt::black);
}
// if (cel <= Map::PlayerTower && cel !=Map::Wall) {
// pen.setColor(QColor(cel%255,(cel*100)%255,(cel+100)%255));
// brush.setColor(QColor(cel%255,(cel*100)%255,(cel+100)%255));
// }
// if (cel >= Map::PlayerAlien) {
// pen.setColor(Qt::yellow);
// brush.setColor(Qt::yellow);
// }
if (cel >= Map::Free || (cel <= Map::PlayerTower && cel !=Map::Wall))
{
pen.setColor(QColor(qAbs(cel+2)*345%255,(qAbs(cel+2)*721)%255,(qAbs(cel+2)*75)%255,150));
brush.setColor(QColor(qAbs(cel+2)*345%255,(qAbs(cel+2)*721)%255,(qAbs(cel+2)*75)%255,80));
}
p.setPen(pen);
p.setBrush(brush);
p.drawRect(i*cellSize,j*cellSize,cellSize,cellSize);
}
}
startTimer(50);
show();
}
AD_Graphics::~AD_Graphics()
{
//delete gsw;
delete scene;
}
void AD_Graphics::mouseDoubleClickEvent(QMouseEvent *)
{
core->nextWave();
}
void AD_Graphics::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
core->adtowers->addTower(0,1,(QPointF(event->pos())/cellSize-QPointF(0.5,0.5)).toPoint());
if (event->button() == Qt::RightButton)
core->adtowers->addTower(0,0,(QPointF(event->pos())/cellSize-QPointF(0.5,0.5)).toPoint());
if (event->button() == Qt::MidButton)
core->adtowers->delTower((QPointF(event->pos())/cellSize-QPointF(0.5,0.5)).toPoint());
}
void AD_Graphics::timerEvent(QTimerEvent * )
{
//qDebug() << data->curAliens.size();
draw();
}
void AD_Graphics::drawBackground(QPainter * p, const QRectF & )
{
p->drawImage(0,0,*mapimg);
// for (int i=0; i<data->map->cells().size(); i++) {
// for (int j=0; j<data->map->cells().at(i).size(); j++) {
// QPen pen;
// QBrush brush;
// pen.setColor(Qt::white);
// brush.setColor(Qt::white);
// brush.setStyle(Qt::SolidPattern);
// int cel = data->map->cells().at(i).at(j);
// if (cel == Map::Wall)
// {
// pen.setColor(Qt::black);
// brush.setColor(Qt::black);
// }
// // if (cel <= Map::PlayerTower && cel !=Map::Wall) {
// // pen.setColor(QColor(cel%255,(cel*100)%255,(cel+100)%255));
// // brush.setColor(QColor(cel%255,(cel*100)%255,(cel+100)%255));
// // }
// // if (cel >= Map::PlayerAlien) {
// // pen.setColor(Qt::yellow);
// // brush.setColor(Qt::yellow);
// // }
// if (cel >= Map::Free || (cel <= Map::PlayerTower && cel !=Map::Wall))
// {
// pen.setColor(QColor(qAbs(cel+2)*345%255,(qAbs(cel+2)*721)%255,(qAbs(cel+2)*75)%255,50));
// brush.setColor(QColor(qAbs(cel+2)*345%255,(qAbs(cel+2)*721)%255,(qAbs(cel+2)*75)%255,50));
// }
// p->setPen(pen);
// p->setBrush(brush);
// p->drawRect(i*cellSize,j*cellSize,cellSize,cellSize);
// }
// }
//qDebug() << "t:" << data->curTowers.size();
for (QHash<QPoint, TowerType>::iterator i = data->curTowers.begin(); i != data->curTowers.end(); ++i)
{
//qDebug() << "draw alien";
//p->rotate(-90);
//p->scale(cellSize, cellSize);
//p->translate(rec.width()/2, rec.height()/2);
//p->rotate(-90);
//p->translate(-rec.height()/2, -rec.width()/2);
p->translate((*i).pos * cellSize+QPointF(20,20));
p->rotate((*i).angle);
//p->setPen(QColor(0,0,0,0));
//p->setBrush(brush);
//p->drawRect(QRect(-10,-10,20,20));
if ((*i).build < data->players.at((*i).PlayerId)->srcTowers.at((*i).src).buildTime)
{
QBrush brush;
brush.setColor(Qt::darkRed);
brush.setStyle(Qt::DiagCrossPattern);
p->setBrush(brush);
p->drawRect(-20,-20,40,40);
} else {
p->drawImage(QRect(-20,-20,40,40), *data->curAnimations.at((*i).imgType).images.at((*i).animIndex));
}
p->resetTransform();
}
//qDebug() << "a:" << data->curAliens.size();
for (QHash<int, AlienType>::iterator i = data->curAliens.begin(); i != data->curAliens.end(); ++i)
{
//qDebug() << "draw alien";
//p->rotate(-90);
//p->scale(cellSize, cellSize);
//p->translate(rec.width()/2, rec.height()/2);
//p->rotate(-90);
//p->translate(-rec.height()/2, -rec.width()/2);
p->translate((*i).pos * cellSize+QPointF(10,10));
p->rotate((*i).angle);
p->drawImage(QRect(-20,-20,40,40), *data->curAnimations.at((*i).imgType).images.at((*i).animIndex));
(*i).animIndex++;
if ((*i).animIndex >= data->curAnimations.at((*i).imgType).images.size())
(*i).animIndex = 0;
p->resetTransform();
}
//qDebug() << "s:" << data->curSplashes.size();
for (QHash<int, SplashType>::iterator i = data->curSplashes.begin(); i != data->curSplashes.end(); ++i)
{
//qDebug() << "draw alien";
//p->rotate(-90);
//p->scale(cellSize, cellSize);
//p->translate(rec.width()/2, rec.height()/2);
//p->rotate(-90);
//p->translate(-rec.height()/2, -rec.width()/2);
//QBrush brush;
//brush.setColor(Qt::red);
//brush.setStyle(Qt::SolidPattern);
p->translate((*i).pos * cellSize);
p->rotate((*i).angle);
//p->setBrush(brush);
//p->setPen(QColor(0,0,0,0));
//p->drawEllipse(QPoint(),5,5);
QImage img;
img = *data->curAnimations.at((*i).imgType).images.at((*i).animIndex);
p->drawImage(QPoint(-(img.size().width()/2),-(img.size().height()/2)), img);
(*i).animIndex++;
if ((*i).animIndex >= data->curAnimations.at((*i).imgType).images.size())
(*i).animIndex = 0;
p->resetTransform();
}
}
void AD_Graphics::draw()
{
scene->update();
//resetCachedContent();
//repaint();
}