QTfrontend/ui/widget/bgwidget.cpp
author koda
Fri, 18 Nov 2011 00:32:52 +0100
changeset 6394 f0a9042e7387
parent 6243 9777d802be1a
child 6574 ec059b55aa72
permissions -rw-r--r--
yay, finally osx (and likely windows) fullscreen switch works like on linux! ALL textures had to be destroyed and recreated only after the new window got created. In other news, the new window must be cleaned with glClear to skip a first frame of garbage and AddProgress is only called the first time.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     1
/*
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     2
 * Hedgewars, a free turn based strategy game
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     3
 * Copyright (c) 2009 Kristian Lehmann <email@thexception.net>
4976
088d40d8aba2 Happy 2011 :)
koda
parents: 4560
diff changeset
     4
 * Copyright (c) 2009-2011 Andrey Korotaev <unC0Rr@gmail.com>
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     5
 *
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     8
 * the Free Software Foundation; version 2 of the License
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
     9
 *
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    13
 * GNU General Public License for more details.
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    14
 *
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    16
 * along with this program; if not, write to the Free Software
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    18
 */
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    19
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    20
#include "bgwidget.h"
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    21
6242
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    22
SpritePosition::SpritePosition(QWidget * parent, int sw, int sh)
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    23
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    24
    wParent = parent;
6242
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    25
    iSpriteWidth = sw;
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    26
    iSpriteHeight = sh;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    27
    reset();
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    28
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    29
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    30
SpritePosition::~SpritePosition()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    31
{
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    32
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    33
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    34
void SpritePosition::move()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    35
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    36
    fX += fXMov;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    37
    fY += fYMov;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    38
    iAngle += 4;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    39
    if (iAngle >= 360) iAngle = 0;
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
    40
    if ((fX - fXMov) > wParent->width()) reset();
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
    41
    else if ((fY - fYMov) > wParent->height()) reset();
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    42
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    43
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    44
void SpritePosition::reset()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    45
{
6242
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    46
    // random movement values
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    47
    fYMov = ((qrand() % 400)+300) / 100.0f;
6242
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    48
    fXMov = fYMov * 0.2f+((qrand()%100)/100.0f * 0.6f); //so between 0.2 and 0.8, or 0.5 +/- 0.3
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    49
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    50
    // random respawn locations
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    51
    int tmp = fXMov * (wParent->height() / fYMov);
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    52
    fX = (qrand() % (wParent->width() + tmp)) - tmp;
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    53
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    54
    // adjust respawn location to be next to (but outside) the parent's limits
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    55
    if (fX > -iSpriteWidth)
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    56
    {
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    57
        fY = -1 * iSpriteHeight;
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    58
    }
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    59
    else
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    60
    {
6243
9777d802be1a whoops, I'm a nerd
sheepluva
parents: 6242
diff changeset
    61
        fY = qrand() % wParent->height();
6242
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    62
        fX = -iSpriteWidth;
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    63
    }
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    64
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    65
    // random initial angle
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    66
    iAngle = qrand() % 360;
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    67
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    68
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    69
QPoint SpritePosition::pos()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    70
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    71
    return QPoint((int)fX,(int)fY);
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    72
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    73
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    74
int SpritePosition::getAngle()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    75
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    76
    return iAngle;
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    77
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    78
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    79
void SpritePosition::init()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    80
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    81
    fY = qrand() % (wParent->height() + 1);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    82
    fX = qrand() % (wParent->width() + 1);
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    83
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    84
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    85
BGWidget::BGWidget(QWidget * parent) : QWidget(parent)
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    86
{
2071
0faa147c47df Still trying to improve perf of stars - this seems to help a little bit
nemo
parents: 2069
diff changeset
    87
    setAttribute(Qt::WA_NoSystemBackground, true);
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    88
    sprite.load(":/res/Star.png");
2377
f3fab2b09e0c And in frontend
nemo
parents: 2071
diff changeset
    89
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    90
    setAutoFillBackground(false);
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    91
6242
27297c421bbc frontend flakes:
sheepluva
parents: 6241
diff changeset
    92
    for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i] = new SpritePosition(this, sprite.width(), sprite.height());
2377
f3fab2b09e0c And in frontend
nemo
parents: 2071
diff changeset
    93
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
    94
    for (int i = 0; i < 90; i++)
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    95
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    96
        rotatedSprites[i] = new QImage(sprite.width(), sprite.height(), QImage::Format_ARGB32);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    97
        rotatedSprites[i]->fill(0);
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
    98
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
    99
        QPoint translate(sprite.width()/2, sprite.height()/2);
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   100
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   101
        QPainter p;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   102
        p.begin(rotatedSprites[i]);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   103
    //  p.setRenderHint(QPainter::Antialiasing);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   104
        p.setRenderHint(QPainter::SmoothPixmapTransform);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   105
        p.translate(translate.x(), translate.y());
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   106
        p.rotate(4 * i);
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   107
        p.translate(-1*translate.x(), -1*translate.y());
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   108
        p.drawImage(0, 0, sprite);
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   109
    }
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   110
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   111
    timerAnimation = new QTimer();
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   112
    connect(timerAnimation, SIGNAL(timeout()), this, SLOT(animate()));
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   113
    timerAnimation->setInterval(ANIMATION_INTERVAL);
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   114
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   115
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   116
BGWidget::~BGWidget()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   117
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   118
    for (int i = 0; i < SPRITE_MAX; i++) delete spritePositions[i];
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   119
    for (int i = 0; i < 90; i++) delete rotatedSprites[i];
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   120
    delete timerAnimation;
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   121
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   122
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   123
void BGWidget::paintEvent(QPaintEvent *event)
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   124
{
4560
5d6c7f88db73 - Some work on drawMap widget and scene to allow undo, clear, save and load operations
unc0rr
parents: 2948
diff changeset
   125
    Q_UNUSED(event);
5d6c7f88db73 - Some work on drawMap widget and scene to allow undo, clear, save and load operations
unc0rr
parents: 2948
diff changeset
   126
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   127
    QPainter p;
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   128
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   129
    p.begin(this);
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   130
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   131
    for (int i = 0; i < SPRITE_MAX; i++)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   132
    {
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   133
        QPoint point = spritePositions[i]->pos();
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   134
        p.drawImage(point.x(), point.y(), *rotatedSprites[spritePositions[i]->getAngle()/4]);
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   135
    }
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   136
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   137
    p.end();
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   138
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   139
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   140
void BGWidget::animate()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   141
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   142
    for (int i = 0; i < SPRITE_MAX; i++)
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   143
    {
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   144
        QPoint oldPos = spritePositions[i]->pos();
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   145
        spritePositions[i]->move();
6241
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   146
        QPoint newPos = spritePositions[i]->pos();
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   147
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   148
        int xdiff = newPos.x() - oldPos.x();
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   149
        int ydiff = newPos.y() - oldPos.y();
e2c7771162ae frontend flakes:
sheepluva
parents: 6060
diff changeset
   150
        update(oldPos.x(), oldPos.y(), xdiff+sprite.width(), ydiff+sprite.height());
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   151
    }
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   152
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   153
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   154
void BGWidget::startAnimation()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   155
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   156
    timerAnimation->start();
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   157
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   158
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   159
void BGWidget::stopAnimation()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   160
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   161
    timerAnimation->stop();
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   162
}
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   163
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   164
void BGWidget::init()
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   165
{
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2377
diff changeset
   166
    for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i]->init();
2012
76fff564246b TheXception's patch:
unc0rr
parents:
diff changeset
   167
}