2
Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; either version 2 of the License, or
7
(at your option) any later version.
10
#include "battlefieldview.h"
15
#include "kbsrenderer.h"
18
#include "animation.h"
19
#include "welcomescreen.h"
21
BattleFieldView::BattleFieldView(KGameCanvasWidget* parent, KBSRenderer* renderer, const QString& bgID, int gridSize)
22
: KGameCanvasGroup(parent)
23
, m_renderer(renderer)
24
, m_factory(this, renderer)
26
, m_gridSize(gridSize)
31
m_background_lower = new KGameCanvasPixmap(
32
m_renderer->render(bgID + "-layer1", false, m_gridSize, m_gridSize), this);
33
m_background_lower->moveTo(0, 0);
34
m_background_lower->setOpacity(250);
35
m_background_lower->show();
37
m_background = new KGameCanvasPixmap(
38
m_renderer->render(bgID + "-layer2", false, m_gridSize, m_gridSize), this);
39
m_background->moveTo(0, 0);
40
m_background->setOpacity(250);
41
m_background->stackOver(m_background_lower);
44
m_screen = new WelcomeScreen(this, parent->font());
45
m_screen->stackOver(m_background);
48
for (Sprites::iterator i = m_sprites.begin();
55
QSize BattleFieldView::size() const
57
return m_renderer->size() * m_gridSize;
60
void BattleFieldView::drawGrid(bool show)
66
void BattleFieldView::update()
68
// update welcome screen
69
m_screen->moveTo(0, 0);
70
m_screen->resize(size());
76
width = size().width();
77
height = size().height();
78
distw = width / m_gridSize;
79
disth = height / m_gridSize;
80
QPixmap pixgrid = m_renderer->render(m_bgID + "-layer1", false, m_gridSize, m_gridSize);
83
for(int i = 0; i < m_gridSize - 1; i++) {
85
p.drawLine(QPointF((i + 1) * distw, 0.0), QPointF(( i + 1) * distw, height));
87
p.drawLine(QPointF(0.0, (i + 1) * disth), QPointF(width, (i + 1) * disth));
90
m_background_lower->setPixmap(pixgrid);
93
m_background_lower->setPixmap(
94
m_renderer->render(m_bgID + "-layer1", false, m_gridSize, m_gridSize));
96
m_background_lower->moveTo(0, 0);
97
m_background->setPixmap(
98
m_renderer->render(m_bgID + "-layer2", false, m_gridSize, m_gridSize));
99
m_background->moveTo(0, 0);
102
if (m_preview.sprite) {
103
m_preview.sprite->update(m_renderer);
104
m_preview.sprite->moveTo(m_renderer->toReal(m_preview.pos));
108
for (Sprites::const_iterator i = m_sprites.constBegin();
109
i != m_sprites.constEnd();
111
i.value()->update(m_renderer);
112
i.value()->moveTo(m_renderer->toReal(i.key()));
116
void BattleFieldView::setPreview(const QPoint& pos, Ship* ship)
118
if (!m_preview.sprite) {
119
m_preview.ship = ship;
120
m_preview.sprite = m_factory.createShip(ship);
121
kDebug() << "created preview: dir =" << ship->direction();
122
m_preview.sprite->setOpacity(PREVIEW_OPACITY);
123
m_preview.sprite->show();
126
m_preview.pos = m_renderer->toLogical(pos);
127
m_preview.sprite->moveTo(m_renderer->toReal(m_preview.pos));
130
void BattleFieldView::cancelPreview()
132
delete m_preview.sprite;
133
m_preview.sprite = 0;
137
void BattleFieldView::addSprite(const Coord& c, Sprite* sprite)
139
m_sprites.insert(c, sprite);
141
sprite->moveTo(m_renderer->toReal(c));
145
void BattleFieldView::add(const Coord& c, Ship* ship)
147
Sprite* sprite = m_factory.createShip(ship);
148
addSprite(c, sprite);
150
sprite->stackOver(m_background);
153
if (ship == m_preview.ship) {
154
Animation* a = new FadeAnimation(sprite, PREVIEW_OPACITY, 255, 1000);
155
Animator::instance()->add(a);
158
else if (!ship->alive()) {
159
Animation* a = new FadeAnimation(sprite, 0, 200, 1000);
160
Animator::instance()->add(a);
164
void BattleFieldView::sink(const Coord& c, Ship* ship)
167
Sprite* ship_sprite = 0;
170
for (unsigned int i = 0;
172
i++, p += ship->increment()) {
173
foreach (Sprite* s, m_sprites.values(p)) {
174
if (s->name().startsWith("ship")) {
177
else if (s->name().startsWith("hit")) {
178
s->setName("hit-end");
179
s->update(m_renderer);
180
s->stackOver(m_background_lower);
185
ship_sprite->stackOver(m_background_lower);
189
void BattleFieldView::hit(const Coord& c)
192
m_last_hit = m_factory.createHit();
193
addSprite(c, m_last_hit);
196
void BattleFieldView::miss(const Coord& c)
199
m_impact = m_factory.createImpact();
200
addSprite(c, m_impact);
203
void BattleFieldView::removeImpact() {
205
m_impact->setName("water");
206
m_impact->update(m_renderer);
210
m_last_hit->setName("hit-after");
211
m_last_hit->update(m_renderer);
216
void BattleFieldView::clear()
218
delete m_preview.sprite;
219
m_preview.sprite = 0;
225
foreach (Sprite* s, m_sprites) {
231
void BattleFieldView::onMousePress(const QPoint& p)
233
if (m_screen->active()) {
234
m_screen->onMousePress(p);
238
void BattleFieldView::onMouseRelease(const QPoint& p)
240
if (m_screen->active()) {
241
m_screen->onMouseRelease(p);
245
void BattleFieldView::onMouseMove(const QPoint& p)
247
if (m_screen->active()) {
248
m_screen->onMouseMove(p);
252
void BattleFieldView::onMouseLeave()
254
if (m_screen->active()) {
255
m_screen->onMouseLeave();
259
WelcomeScreen* BattleFieldView::screen() const