• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegames API Reference
  • KDE Home
  • Contact Us
 

granatier

  • sources
  • kde-4.14
  • kdegames
  • granatier
  • src
gamescene.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2009 Mathias Kraus <k.hias@gmx.de>
3  * Copyright 2007-2008 Thomas Gallinari <tg8187@yahoo.fr>
4  * Copyright 2007-2008 Alexandre Galinier <alex.galinier@hotmail.com>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "gamescene.h"
21 #include "cell.h"
22 #include "bonus.h"
23 #include "bonusitem.h"
24 #include "settings.h"
25 #include "game.h"
26 #include "player.h"
27 #include "block.h"
28 #include "blockitem.h"
29 #include "bomb.h"
30 #include "arena.h"
31 #include "arenaitem.h"
32 #include "playeritem.h"
33 #include "bombitem.h"
34 #include "bombexplosionitem.h"
35 #include "infooverlay.h"
36 #include "infosidebar.h"
37 
38 #include <KgTheme>
39 #include <KgThemeProvider>
40 #include <KLocale>
41 #include <KStandardDirs>
42 #include <QPainter>
43 #include <QGraphicsView>
44 #include <QTimer>
45 
46 #include <KGameRenderer>
47 #include <KGameRenderedItem>
48 
49 #include <cmath>
50 
51 GameScene::GameScene(Game* p_game, KgThemeProvider* p_themeProvider) : m_game(p_game), m_themeProvider(p_themeProvider)
52 {
53  connect(p_game, SIGNAL(gameStarted()), this, SLOT(start()));
54  connect(p_game, SIGNAL(pauseChanged(bool,bool)), this, SLOT(setPaused(bool,bool)));
55  connect(p_game, SIGNAL(bombCreated(Bomb*)), this, SLOT(createBombItem(Bomb*)));
56  connect(p_game, SIGNAL(infoChanged(Granatier::Info::Type)), this, SLOT(updateInfo(Granatier::Info::Type)));
57 
58  m_SvgScaleFactor = 1;
59 
60  m_backgroundResizeTimer = new QTimer();
61  m_backgroundResizeTimer->setSingleShot(true);
62  connect(m_backgroundResizeTimer, SIGNAL(timeout()), this, SLOT(resizeBackground()));
63 
64  // Create the PlayerItems and the points labels
65  QList <Player*> players = p_game->getPlayers();
66 
67  PlayerItem* playerItem;
68  for(int i = 0; i < players.size(); i++)
69  {
70  const QString desktopPath = players[i]->getDesktopFilePath();
71  KgTheme* theme = new KgTheme(desktopPath.toUtf8());
72  theme->readFromDesktopFile(KStandardDirs::locate("appdata", desktopPath));
73  KGameRenderer* playerRenderer = new KGameRenderer(theme);
74  m_mapRendererPlayerItems.insert(players[i], playerRenderer);
75  playerItem = new PlayerItem(players[i], playerRenderer);
76  // Corrects the position of the player
77  playerItem->update(players[i]->getX(), players[i]->getY());
78  // Stops the player animation
79  playerItem->stopAnim();
80 
81  m_playerItems.append(playerItem);
82 
83  connect(this, SIGNAL(resizeGraphics(qreal)), playerItem, SLOT(updateGraphics(qreal)));
84  connect (playerItem, SIGNAL(bonusItemTaken(BonusItem*)), this, SLOT(removeBonusItem(BonusItem*)));
85  }
86 
87  // The remaining time
88  m_remainingTimeLabel = new QGraphicsTextItem(i18n("0:00"));
89  m_remainingTimeLabel->setFont(QFont("Helvetica", Granatier::CellSize * 0.35, QFont::Bold, false));
90  m_remainingTimeLabel->setDefaultTextColor(QColor("#FFFF00"));
91  m_remainingTimeLabel->setZValue(1000);
92 
93  m_arenaNameLabel = new QGraphicsTextItem(i18n("Arena Name"));
94  m_arenaNameLabel->setFont(QFont("Helvetica", Granatier::CellSize * 0.35, QFont::Bold, false));
95  m_arenaNameLabel->setDefaultTextColor(QColor("#FFFF00"));
96  m_arenaNameLabel->setZValue(1000);
97 
98  // setup the theme renderer
99  m_rendererSelectedTheme = new KGameRenderer(m_themeProvider);
100  m_rendererDefaultTheme = 0;
101  setupThemeRenderer();
102 
103  connect(m_themeProvider, SIGNAL(currentThemeChanged(const KgTheme*)), this, SLOT(themeChanged()));
104 
105  // create the info overlay
106  m_infoOverlay = new InfoOverlay(m_game, this);
107  connect(this, SIGNAL(resizeGraphics(qreal)), m_infoOverlay, SLOT(updateGraphics(qreal)));
108 
109  init();
110 }
111 
112 void GameScene::setupThemeRenderer()
113 {
114  bool selectedThemeIsDefault = true;
115 
116  if(m_themeProvider->currentTheme() != m_themeProvider->defaultTheme())
117  {
118  // Load the default SVG file as fallback
119  selectedThemeIsDefault = false;
120  if(m_rendererDefaultTheme == 0)
121  {
122  KgTheme* theme = new KgTheme(m_themeProvider->defaultTheme()->identifier());
123  theme->setGraphicsPath(m_themeProvider->defaultTheme()->graphicsPath());
124  m_rendererDefaultTheme = new KGameRenderer(theme);
125  }
126  }
127 
128  if(selectedThemeIsDefault || m_rendererSelectedTheme->spriteExists("background"))
129  {
130  m_rendererBackground = m_rendererSelectedTheme;
131  }
132  else
133  {
134  m_rendererBackground = m_rendererDefaultTheme;
135  }
136 
137  // set the renderer for the arena items TODO: add all the arena items
138  if(selectedThemeIsDefault || (m_rendererSelectedTheme->spriteExists("arena_ground") &&
139  m_rendererSelectedTheme->spriteExists("arena_wall") &&
140  m_rendererSelectedTheme->spriteExists("arena_block") &&
141  m_rendererSelectedTheme->spriteExists("arena_block_highlight") &&
142  m_rendererSelectedTheme->spriteExists("arena_ice") &&
143  m_rendererSelectedTheme->spriteExists("arena_bomb_mortar") &&
144  m_rendererSelectedTheme->spriteExists("arena_arrow_up") &&
145  m_rendererSelectedTheme->spriteExists("arena_arrow_right") &&
146  m_rendererSelectedTheme->spriteExists("arena_arrow_down") &&
147  m_rendererSelectedTheme->spriteExists("arena_arrow_left")))
148  {
149  m_rendererArenaItems = m_rendererSelectedTheme;
150  }
151  else
152  {
153  m_rendererArenaItems = m_rendererDefaultTheme;
154  }
155 
156  // set the renderer for the bonus items TODO: add all the bonus items
157  if(selectedThemeIsDefault || (m_rendererSelectedTheme->spriteExists("bonus_speed") &&
158  m_rendererSelectedTheme->spriteExists("bonus_bomb") &&
159  m_rendererSelectedTheme->spriteExists("bonus_power") &&
160  m_rendererSelectedTheme->spriteExists("bonus_shield") &&
161  m_rendererSelectedTheme->spriteExists("bonus_throw") &&
162  m_rendererSelectedTheme->spriteExists("bonus_kick") &&
163  m_rendererSelectedTheme->spriteExists("bonus_bad_slow") &&
164  m_rendererSelectedTheme->spriteExists("bonus_bad_hyperactive") &&
165  m_rendererSelectedTheme->spriteExists("bonus_bad_mirror") &&
166  m_rendererSelectedTheme->spriteExists("bonus_bad_scatty") &&
167  m_rendererSelectedTheme->spriteExists("bonus_bad_restrain") &&
168  m_rendererSelectedTheme->spriteExists("bonus_neutral_pandora") &&
169  m_rendererSelectedTheme->spriteExists("bonus_neutral_resurrect")))
170  {
171  m_rendererBonusItems = m_rendererSelectedTheme;
172  }
173  else
174  {
175  m_rendererBonusItems = m_rendererDefaultTheme;
176  }
177 
178  // set the renderer for the bomb items
179  if(selectedThemeIsDefault || (m_rendererSelectedTheme->spriteExists("bomb") &&
180  m_rendererSelectedTheme->spriteExists("bomb_blast_core_0") &&
181  m_rendererSelectedTheme->spriteExists("bomb_blast_north_0") &&
182  m_rendererSelectedTheme->spriteExists("bomb_blast_east_0") &&
183  m_rendererSelectedTheme->spriteExists("bomb_blast_south_0") &&
184  m_rendererSelectedTheme->spriteExists("bomb_blast_west_0")))
185  {
186  m_rendererBombItems = m_rendererSelectedTheme;
187  }
188  else
189  {
190  m_rendererBombItems = m_rendererDefaultTheme;
191  }
192 
193  // set the renderer for the score items
194  if(selectedThemeIsDefault || (m_rendererSelectedTheme->spriteExists("score_star_enabled") &&
195  m_rendererSelectedTheme->spriteExists("score_star_disabled")))
196  {
197  m_rendererScoreItems = m_rendererSelectedTheme;
198  }
199  else
200  {
201  m_rendererScoreItems = m_rendererDefaultTheme;
202  }
203 }
204 
205 void GameScene::init()
206 {
207  initItemsWithGraphicsFromTheme();
208 
209  // Display each PlayerItem
210  for (int i = 0; i < m_playerItems.size(); i++)
211  {
212  if(!items().contains(m_playerItems[i]))
213  {
214  addItem(m_playerItems[i]);
215  }
216  m_playerItems[i]->resurrect();
217  }
218 
219  if (!items().contains(m_remainingTimeLabel))
220  {
221  addItem(m_remainingTimeLabel);
222  }
223  m_remainingTimeLabel->setDefaultTextColor(QColor("#FFFF00"));
224  int nTime = m_game->getRemainingTime();
225  m_remainingTimeLabel->setPlainText(QString("%1:%2").arg(nTime/60).arg(nTime%60, 2, 10, QChar('0')));
226  m_remainingTimeLabel->setPos(Granatier::CellSize * m_game->getArena()->getNbColumns() - m_remainingTimeLabel->boundingRect().width(), - m_remainingTimeLabel->boundingRect().height());
227 
228  if (!items().contains(m_arenaNameLabel))
229  {
230  addItem(m_arenaNameLabel);
231  }
232  m_arenaNameLabel->setPlainText(m_game->getArena()->getName());
233  m_arenaNameLabel->setPos(0, - m_arenaNameLabel->boundingRect().height());
234 
235  //this is needed for info sidebar
236  setSceneRect(0, -m_remainingTimeLabel->boundingRect().height(),
237  m_game->getArena()->getNbColumns()*Granatier::CellSize,
238  m_game->getArena()->getNbRows()*Granatier::CellSize + m_remainingTimeLabel->boundingRect().height());
239 
240  // create the info sidebar
241  m_infoSidebar = new InfoSidebar(m_game, this);
242  connect(this, SIGNAL(resizeGraphics(qreal)), m_infoSidebar, SLOT(updateGraphics(qreal)));
243 
244  //update the sceneRect
245  QRectF oldSceneRect = sceneRect();
246  QRectF sidebarRect = m_infoSidebar->rect();
247  QRectF newSceneRect;
248  newSceneRect.setLeft(oldSceneRect.left() < sidebarRect.left() ? oldSceneRect.left() : sidebarRect.left());
249  newSceneRect.setRight(oldSceneRect.right() > sidebarRect.right() ? oldSceneRect.right() : sidebarRect.right());
250  newSceneRect.setTop(oldSceneRect.top() < sidebarRect.top() ? oldSceneRect.top() : sidebarRect.top());
251  newSceneRect.setBottom(oldSceneRect.bottom() > sidebarRect.bottom() ? oldSceneRect.bottom() : sidebarRect.bottom());
252  newSceneRect.adjust(-5, -5, 5, 5);
253  setSceneRect(newSceneRect);
254  m_infoSidebar->reset();
255 
256  m_infoOverlay->showGetReady();
257 
258  //set the minimum size for the scene
259  m_minSize = sceneRect();
260  int minWidth = ((int) (m_minSize.width() / Granatier::CellSize + 1.1)) * Granatier::CellSize;
261  int minHeight = ((int) (m_minSize.height() / Granatier::CellSize + 1.1)) * Granatier::CellSize;
262  m_minSize.setX(m_minSize.x() + (m_minSize.width() - minWidth) / 10);
263  m_minSize.setY(m_minSize.y() + (m_minSize.height() - minHeight) / 4);
264  m_minSize.setWidth(minWidth);
265  m_minSize.setHeight(minHeight);
266  setSceneRect(m_minSize);
267 
268  resizeSprites();
269 }
270 
271 void GameScene::initItemsWithGraphicsFromTheme()
272 {
273  // Create the ArenaItems
274  m_arenaItem = new ArenaItem**[m_game->getArena()->getNbRows()];
275 
276  for (int i = 0; i < m_game->getArena()->getNbRows(); ++i)
277  {
278  m_arenaItem[i] = new ArenaItem*[m_game->getArena()->getNbColumns()];
279  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
280  {
281  // Create the ArenaItem and set the image
282  ArenaItem* arenaItem = new ArenaItem(j * Granatier::CellSize, i * Granatier::CellSize, m_rendererArenaItems, "");
283  connect(this, SIGNAL(resizeGraphics(qreal)), arenaItem, SLOT(updateGraphics(qreal)));
284 
285  //TODO: use this function call
286  //arenaItem->setElementId(m_game->getArena()->getCell(i,j).getElement()->getImageId());
287  switch(m_game->getArena()->getCell(i,j).getType())
288  {
289  case Granatier::Cell::WALL:
290  arenaItem->setSpriteKey("arena_wall");
291  arenaItem->setZValue(-2);
292  break;
293  case Granatier::Cell::HOLE:
294  delete arenaItem;
295  arenaItem = NULL;
296  break;
297  case Granatier::Cell::ICE:
298  arenaItem->setSpriteKey("arena_ice");
299  arenaItem->setZValue(0);
300  break;
301  case Granatier::Cell::BOMBMORTAR:
302  arenaItem->setSpriteKey("arena_bomb_mortar");
303  arenaItem->setZValue(0);
304  break;
305  case Granatier::Cell::ARROWUP:
306  arenaItem->setSpriteKey("arena_arrow_up");
307  arenaItem->setZValue(0);
308  break;
309  case Granatier::Cell::ARROWRIGHT:
310  arenaItem->setSpriteKey("arena_arrow_right");
311  arenaItem->setZValue(0);
312  break;
313  case Granatier::Cell::ARROWDOWN:
314  arenaItem->setSpriteKey("arena_arrow_down");
315  arenaItem->setZValue(0);
316  break;
317  case Granatier::Cell::ARROWLEFT:
318  arenaItem->setSpriteKey("arena_arrow_left");
319  arenaItem->setZValue(0);
320  break;
321  case Granatier::Cell::GROUND:
322  case Granatier::Cell::BLOCK:
323  default:
324  arenaItem->setSpriteKey("arena_ground");
325  arenaItem->setZValue(-1);
326  }
327  m_arenaItem[i][j] = arenaItem;
328  }
329  }
330 
331  // Create the Block and Bonus items
332  m_blockItems = new BlockItem**[m_game->getArena()->getNbRows()];
333  m_bonusItems = new BonusItem**[m_game->getArena()->getNbRows()];
334  QList<Element*> blockElements;
335  for (int i = 0; i < m_game->getArena()->getNbRows(); ++i)
336  {
337  m_blockItems[i] = new BlockItem*[m_game->getArena()->getNbColumns()];
338  m_bonusItems[i] = new BonusItem*[m_game->getArena()->getNbColumns()];
339  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
340  {
341  blockElements = m_game->getArena()->getCell(i, j).getElements(Granatier::Element::BLOCK);
342  if (!blockElements.isEmpty())
343  {
344  // Create the element item and set the image
345  foreach(Element* element, blockElements)
346  {
347  Block* block = dynamic_cast <Block*> (element);
348  BlockItem* blockItem = new BlockItem(block, m_rendererArenaItems);
349  connect(this, SIGNAL(resizeGraphics(qreal)), blockItem, SLOT(updateGraphics(qreal)));
350  blockItem->setSpriteKey(block->getImageId());
351  blockItem->update(block->getX(), block->getY());
352  blockItem->setZValue(200);
353  if(Settings::self()->showAllTiles() == 1)
354  {
355  blockItem->setZValue(99);
356  }
357  connect(this, SIGNAL(resizeGraphics(qreal)), blockItem, SLOT(updateGraphics(qreal)));
358  connect(blockItem, SIGNAL(blockItemDestroyed(BlockItem*)), this, SLOT(removeBlockItem(BlockItem*)));
359  m_blockItems[i][j] = blockItem;
360  // if the block contains a hidden bonus, create the bonus item
361  Bonus* bonus = block->getBonus();
362  if(bonus)
363  {
364  BonusItem* bonusItem = new BonusItem(bonus, m_rendererBonusItems);
365  switch(bonus->getBonusType())
366  {
367  case Granatier::Bonus::SPEED:
368  bonusItem->setSpriteKey("bonus_speed");
369  break;
370  case Granatier::Bonus::BOMB:
371  bonusItem->setSpriteKey("bonus_bomb");
372  break;
373  case Granatier::Bonus::POWER:
374  bonusItem->setSpriteKey("bonus_power");
375  break;
376  case Granatier::Bonus::SHIELD:
377  bonusItem->setSpriteKey("bonus_shield");
378  break;
379  case Granatier::Bonus::THROW:
380  bonusItem->setSpriteKey("bonus_throw");
381  break;
382  case Granatier::Bonus::KICK:
383  bonusItem->setSpriteKey("bonus_kick");
384  break;
385  case Granatier::Bonus::HYPERACTIVE:
386  bonusItem->setSpriteKey("bonus_bad_hyperactive");
387  break;
388  case Granatier::Bonus::SLOW:
389  bonusItem->setSpriteKey("bonus_bad_slow");
390  break;
391  case Granatier::Bonus::MIRROR:
392  bonusItem->setSpriteKey("bonus_bad_mirror");
393  break;
394  case Granatier::Bonus::SCATTY:
395  bonusItem->setSpriteKey("bonus_bad_scatty");
396  break;
397  case Granatier::Bonus::RESTRAIN:
398  bonusItem->setSpriteKey("bonus_bad_restrain");
399  break;
400  case Granatier::Bonus::RESURRECT:
401  bonusItem->setSpriteKey("bonus_neutral_resurrect");
402  break;
403  default:
404  bonusItem->setSpriteKey("bonus_neutral_pandora");
405  }
406 
407  if((qrand()/1.0)/RAND_MAX * 10 > 9 && bonusItem->spriteKey() != "bonus_neutral_resurrect")
408  {
409  bonusItem->setSpriteKey("bonus_neutral_pandora");
410  }
411 
412  bonusItem->update(bonus->getX(), bonus->getY());
413  bonusItem->setZValue(100);
414  m_bonusItems[i][j] = bonusItem;
415 
416  connect(this, SIGNAL(resizeGraphics(qreal)), bonusItem, SLOT(updateGraphics(qreal)));
417  connect(bonusItem, SIGNAL(bonusItemDestroyed(BonusItem*)), this, SLOT(removeBonusItem(BonusItem*)));
418 
419  addItem(bonusItem);
420  if(Settings::self()->showAllTiles() == 0)
421  {
422  bonusItem->hide();
423  }
424  }
425  else
426  {
427  m_bonusItems[i][j] = NULL;
428  }
429  }
430  }
431  else
432  {
433  m_blockItems[i][j] = NULL;
434  m_bonusItems[i][j] = NULL;
435  }
436  }
437  }
438 
439  // Create the Bomb items
440  foreach(Bomb* bomb, m_tempBombList)
441  {
442  createBombItem(bomb);
443  }
444  if(!m_tempBombList.isEmpty())
445  {
446  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
447  while (i != m_bombItems.end())
448  {
449  i.key()->pauseAnim();
450  i++;
451  }
452  }
453 
454  // Display the ArenaItem
455  for (int i = 0; i < m_game->getArena()->getNbRows();++i)
456  {
457  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
458  {
459  if(m_arenaItem[i][j] != NULL)
460  {
461  addItem(m_arenaItem[i][j]);
462  }
463  }
464  }
465 
466  // Display the Block Items
467  for (int i = 0; i < m_game->getArena()->getNbRows(); ++i)
468  {
469  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
470  {
471  if (m_blockItems[i][j] != NULL)
472  {
473  if (!items().contains(m_blockItems[i][j]))
474  {
475  addItem(m_blockItems[i][j]);
476  }
477  }
478  }
479  }
480 
481  //create the background
482  m_arenaBackground = new KGameRenderedItem(m_rendererBackground, "background");
483  m_arenaBackground->setZValue(-5);
484  m_arenaBackground->setPos(0, 0);
485  m_arenaBackground->setCacheMode(QGraphicsItem::NoCache); // if cache is set, there are some artifacts; pay attention, that the KGameRenderer cache is used nevertheless
486  m_arenaBackground->setRenderSize(QSize(100, 100)); //just to get something in the background, until the right size is rendered
487  addItem(m_arenaBackground);
488 
489  resizeSprites();
490 }
491 
492 GameScene::~GameScene()
493 {
494  delete m_backgroundResizeTimer;
495 
496  cleanUp();
497 
498  delete m_infoOverlay;
499 
500  for (int i = 0; i < m_playerItems.size(); i++)
501  {
502  if(items().contains(m_playerItems[i]))
503  {
504  removeItem(m_playerItems[i]);
505  }
506  m_playerItems[i]->stopAnim();
507  delete m_playerItems[i];
508  }
509 
510  QMap <Player*, KGameRenderer*>::iterator iteratorRendererPlayer = m_mapRendererPlayerItems.begin();
511  while (iteratorRendererPlayer != m_mapRendererPlayerItems.end())
512  {
513  delete iteratorRendererPlayer.value();
514  iteratorRendererPlayer++;
515  }
516 
517  delete m_rendererSelectedTheme;
518  delete m_rendererDefaultTheme;
519 }
520 
521 void GameScene::cleanUp()
522 {
523  cleanUpItemsWithGraphicsFromTheme();
524 
525  delete m_infoSidebar;
526 
527  if(items().contains(m_remainingTimeLabel))
528  {
529  removeItem(m_remainingTimeLabel);
530  }
531 
532  if(items().contains(m_arenaNameLabel))
533  {
534  removeItem(m_arenaNameLabel);
535  }
536 }
537 
538 void GameScene::cleanUpItemsWithGraphicsFromTheme()
539 {
540  // remove the arena items
541  for (int i = 0; i < m_game->getArena()->getNbRows();++i)
542  {
543  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
544  {
545  if (m_arenaItem[i][j] != NULL)
546  {
547  if (items().contains(m_arenaItem[i][j]))
548  {
549  removeItem(m_arenaItem[i][j]);
550  }
551  delete m_arenaItem[i][j];
552  }
553  }
554  delete[] m_arenaItem[i];
555  }
556  delete[] m_arenaItem;
557 
558  // Find the BombItem and remove it
559  BombExplosionItem* bombExplosionItem;
560  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
561  while (i != m_bombItems.end())
562  {
563  while(!i.value().isEmpty())
564  {
565  bombExplosionItem = i.value().takeFirst();
566  if(items().contains(bombExplosionItem))
567  {
568  removeItem(bombExplosionItem);
569  }
570  delete bombExplosionItem;
571  }
572  if(items().contains(i.key()))
573  {
574  removeItem(i.key());
575  }
576  if(dynamic_cast <Bomb*> (i.key()->getModel())->isDetonated())
577  {
578  dynamic_cast <Bomb*> (i.key()->getModel())->slot_detonationCompleted();
579  }
580  delete i.key();
581  i = m_bombItems.erase(i);
582  }
583 
584  // Find the BlockItems and BonusItems and remove it
585  for (int i = 0; i < m_game->getArena()->getNbRows();++i)
586  {
587  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
588  {
589  if (m_blockItems[i][j] != NULL)
590  {
591  if (items().contains(m_blockItems[i][j]))
592  {
593  removeItem(m_blockItems[i][j]);
594  }
595  delete m_blockItems[i][j];
596  }
597  if (m_bonusItems[i][j] != NULL)
598  {
599  if (items().contains(m_bonusItems[i][j]))
600  {
601  removeItem(m_bonusItems[i][j]);
602  }
603  delete m_bonusItems[i][j];
604  }
605  }
606  delete[] m_blockItems[i];
607  delete[] m_bonusItems[i];
608  }
609  delete[] m_blockItems;
610  delete[] m_bonusItems;
611 
612  removeItem(m_arenaBackground);
613  delete m_arenaBackground;
614 }
615 
616 void GameScene::themeChanged()
617 {
618  m_tempBombList.clear();
619  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
620  while (i != m_bombItems.end())
621  {
622  if(!(dynamic_cast <Bomb*> (i.key()->getModel())->isDetonated()))
623  {
624  m_tempBombList.append(dynamic_cast <Bomb*> (i.key()->getModel()));
625  }
626  i++;
627  }
628 
629  cleanUpItemsWithGraphicsFromTheme();
630  setupThemeRenderer();
631  initItemsWithGraphicsFromTheme();
632  m_infoSidebar->themeChanged();
633  m_infoOverlay->themeChanged();
634 
635  m_tempBombList.clear();
636 }
637 
638 KGameRenderer* GameScene::renderer(Granatier::Element::Type type, Player* player)
639 {
640  switch(type)
641  {
642  case Granatier::Element::BLOCK:
643  return m_rendererArenaItems;
644  case Granatier::Element::BONUS:
645  return m_rendererBonusItems;
646  case Granatier::Element::BOMB:
647  return m_rendererBombItems;
648  case Granatier::Element::PLAYER:
649  return m_mapRendererPlayerItems.value(player);
650  case Granatier::Element::SCORE:
651  return m_rendererScoreItems;
652  default:
653  return NULL;
654  }
655 }
656 
657 void GameScene::showScore()
658 {
659  m_infoOverlay->showScore();
660 }
661 
662 void GameScene::resizeSprites(int delayForBackground)
663 {
664  if(views().isEmpty())
665  {
666  return;
667  }
668 
669  //calculate the scaling factor for the SVGs
670  int horizontalPixelsPerCell = views().first()->size().width() / (m_minSize.width()/Granatier::CellSize);
671  int verticalPixelsPerCell = views().first()->size().height() / (m_minSize.height()/Granatier::CellSize);
672  if(horizontalPixelsPerCell < verticalPixelsPerCell)
673  {
674  m_SvgScaleFactor = Granatier::CellSize / horizontalPixelsPerCell;
675  }
676  else
677  {
678  m_SvgScaleFactor = Granatier::CellSize / verticalPixelsPerCell;
679  }
680  QTransform transform;
681  transform.scale(1/m_SvgScaleFactor, 1/m_SvgScaleFactor);
682  views().first()->setTransform(transform);
683  views().first()->centerOn(sceneRect().center());
684  views().first()->updateSceneRect(m_minSize);;
685 
686  //update pixmaps
687  emit resizeGraphics(m_SvgScaleFactor);
688 
689  //update overlay
690  QRect viewRect = views().first()->rect();
691  QRectF viewRectToScene = QRectF(views().first()->mapToScene(viewRect.topLeft()), views().first()->mapToScene(viewRect.bottomRight()));
692  m_infoOverlay->resizeDimmOverlay(viewRectToScene.x(), viewRectToScene.y(), viewRectToScene.width(), viewRectToScene.height());
693 
694  //update background pixmap
695  m_arenaBackground->setPos(views().first()->mapToScene(viewRect.topLeft()));
696  m_arenaBackground->setScale(m_SvgScaleFactor);
697 
698  m_arenaBackground->setPixmap(m_arenaBackground->pixmap().scaled(viewRect.size()));
699 
700  m_backgroundResizeTimer->stop();
701  m_backgroundResizeTimer->start(delayForBackground);
702 }
703 
704 void GameScene::resizeBackground()
705 {
706  if(views().isEmpty())
707  {
708  return;
709  }
710  QRect viewRect = views().first()->rect();
711  m_arenaBackground->setRenderSize(viewRect.size());
712 }
713 
714 Game* GameScene::getGame() const
715 {
716  return m_game;
717 }
718 
719 void GameScene::start()
720 {
721  // hide the info items
722  m_infoOverlay->hideItems();
723 }
724 
725 void GameScene::setPaused(const bool p_pause, const bool p_fromUser)
726 {
727  // If the game has paused
728  if (p_pause)
729  {
730  // If the pause is due to an action from the user
731  if (p_fromUser)
732  {
733  m_infoOverlay->showPause();
734  }
735 
736  // Stop player animation
737  for (int i = 0; i < m_playerItems.size(); i++)
738  {
739  m_playerItems[i]->pauseAnim();
740  }
741  // Stop bomb animation
742  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
743  while (i != m_bombItems.end())
744  {
745  i.key()->pauseAnim();
746  ++i;
747  }
748  }
749  else
750  { // If the game has resumed, hide the info items
751  m_infoOverlay->hideItems();
752 
753  // Resume player animation
754  for (int i = 0; i < m_playerItems.size(); i++)
755  {
756  m_playerItems[i]->resumeAnim();
757  }
758  // Resume bomb animation
759  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
760  while (i != m_bombItems.end())
761  {
762  i.key()->resumeAnim();
763  ++i;
764  }
765  }
766 }
767 
768 void GameScene::removeBlockItem(BlockItem* blockItem)
769 {
770  // remove the Bonus Items
771  for (int i = 0; i < m_game->getArena()->getNbRows(); ++i)
772  {
773  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
774  {
775  if (m_blockItems[i][j] != NULL && m_blockItems[i][j] == blockItem)
776  {
777  if (items().contains(m_blockItems[i][j]))
778  {
779  removeItem(m_blockItems[i][j]);
780  m_blockItems[i][j] = NULL;
781  m_game->blockDestroyed(i, j, dynamic_cast <Block*> (blockItem->getModel()));
782  delete blockItem;
783  }
784  }
785  }
786  }
787 }
788 
789 void GameScene::removeBonusItem(BonusItem* bonusItem)
790 {
791  // remove the Bonus Items
792  for (int i = 0; i < m_game->getArena()->getNbRows(); ++i)
793  {
794  for (int j = 0; j < m_game->getArena()->getNbColumns(); ++j)
795  {
796  if (m_bonusItems[i][j] != NULL && m_bonusItems[i][j] == bonusItem)
797  {
798  if (items().contains(m_bonusItems[i][j]))
799  {
800  removeItem(m_bonusItems[i][j]);
801  m_bonusItems[i][j] = NULL;
802  m_game->removeBonus(dynamic_cast <Bonus*> (bonusItem->getModel()));
803  delete bonusItem;
804  }
805  }
806  }
807  }
808 }
809 
810 void GameScene::updateInfo(const Granatier::Info::Type p_info)
811 {
812  if(p_info == Granatier::Info::TimeInfo)
813  {
814  int nTime = m_game->getRemainingTime();
815  if(nTime > 0)
816  {
817  m_remainingTimeLabel->setPlainText(QString("%1:%2").arg(nTime/60).arg(nTime%60, 2, 10, QChar('0')));
818  }
819  else
820  {
821  m_remainingTimeLabel->setPlainText(i18n("Sudden Death"));
822  m_remainingTimeLabel->setDefaultTextColor(QColor("#FF0000"));
823  m_remainingTimeLabel->setPos(Granatier::CellSize * m_game->getArena()->getNbColumns() - m_remainingTimeLabel->boundingRect().width(), - m_remainingTimeLabel->boundingRect().height());
824  }
825  }
826 }
827 
828 void GameScene::createBombItem(Bomb* bomb)
829 {
830  // Create the Bombs
831  BombItem* bombItem = new BombItem(bomb, m_rendererBombItems);
832  // Corrects the position of the BombItem
833  bombItem->update(bomb->getX(), bomb->getY());
834  addItem(bombItem);
835  m_bombItems[bombItem].append(NULL);
836 
837  bombItem->updateGraphics(m_SvgScaleFactor); //TODO: use a Renderer class and get the scale factor from a static function during initialization
838 
839  connect(this, SIGNAL(resizeGraphics(qreal)), bombItem, SLOT(updateGraphics(qreal)));
840  connect(bomb, SIGNAL(mortar(int,int,int,int)), bombItem, SLOT(updateMortar(int,int,int,int)));
841  connect(bomb, SIGNAL(bombDetonated(Bomb*)), this, SLOT(bombDetonated(Bomb*)));
842  connect(bombItem, SIGNAL(bombItemFinished(BombItem*)), this, SLOT(removeBombItem(BombItem*)));
843  connect(bombItem, SIGNAL(animationFrameChanged(BombItem*,int)), this, SLOT(updateBombExplosionItemAnimation(BombItem*,int)));
844 }
845 
846 void GameScene::removeBombItem(BombItem* bombItem)
847 {
848  m_game->removeBomb(dynamic_cast <Bomb*> (bombItem->getModel()));
849  // Find the BombItem and remove it
850  BombExplosionItem* bombExplosionItem;
851  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
852  while (i != m_bombItems.end())
853  {
854  if(i.key() == bombItem)
855  {
856  while(!i.value().isEmpty())
857  {
858  bombExplosionItem = i.value().takeFirst();
859  if(items().contains(bombExplosionItem))
860  {
861  removeItem(bombExplosionItem);
862  }
863  delete bombExplosionItem;
864  }
865  if(items().contains(i.key()))
866  {
867  removeItem(i.key());
868  }
869  delete i.key();
870  i = m_bombItems.erase(i);
871  break;
872  }
873  else
874  {
875  ++i;
876  }
877  }
878 }
879 
880 void GameScene::bombDetonated(Bomb* bomb)
881 {
882  BombItem* bombItem = NULL;
883  BombExplosionItem* bombExplosionItem = NULL;
884  QList<Element*> blockElements;
885  QList<Element*> bombElements;
886  int nBombPower = bomb->bombPower();
887  int nNumberOfColums = m_game->getArena()->getNbColumns();
888  int nNumberOfRows = m_game->getArena()->getNbRows();
889  int nColumn;
890  int nRow;
891  qreal xPos = 0;
892  qreal yPos = 0;
893  bool abDirectionsDone[] = {false, false, false, false};
894  int nDetonationCountdown = 75;
895  int anDirectionDetonationCountdown[] = {nDetonationCountdown, nDetonationCountdown, nDetonationCountdown, nDetonationCountdown};
896 
897  // Find the BombItem from the Bomb
898  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
899  while (i != m_bombItems.end())
900  {
901  if(i.key()->getModel() == bomb)
902  {
903  bombItem = i.key();
904  break;
905  }
906  ++i;
907  }
908 
909  if(!bombItem)
910  {
911  return;
912  }
913 
914  //check if there is a bomb or block at the position where the bomb exploded (possible when thrown)
915  nColumn = m_game->getArena()->getColFromX(bomb->getX());
916  nRow = m_game->getArena()->getRowFromY(bomb->getY());
917  if(nColumn >= 0 && nColumn < nNumberOfColums && nRow >= 0 && nRow < nNumberOfRows)
918  {
919  bombElements = m_game->getArena()->getCell(nRow, nColumn).getElements(Granatier::Element::BOMB);
920  int tempBombDetonationCountdown = nDetonationCountdown;
921  foreach(Element* element, bombElements)
922  {
923  if(dynamic_cast <Bomb*> (element) != bomb && !(dynamic_cast <Bomb*> (element)->isDetonated()))
924  {
925  dynamic_cast <Bomb*> (element)->initDetonation(bomb->explosionID(), tempBombDetonationCountdown);
926  tempBombDetonationCountdown += 10;
927  }
928  }
929 
930  blockElements = m_game->getArena()->getCell(nRow, nColumn).getElements(Granatier::Element::BLOCK);
931  if(!blockElements.isEmpty())
932  {
933  foreach(Element* element, blockElements)
934  {
935  dynamic_cast <Block*> (element)->startDestruction();
936  if (m_blockItems[nRow][nColumn] != NULL)
937  {
938  //display bonus if available
939  if (m_bonusItems[nRow][nColumn] != NULL)
940  {
941  m_bonusItems[nRow][nColumn]->setUndestroyable(bomb->explosionID());
942  m_bonusItems[nRow][nColumn]->show();
943  }
944  }
945  }
946  }
947  else if(m_bonusItems[nRow][nColumn] != NULL)
948  {
949  m_bonusItems[nRow][nColumn]->initDestruction(bomb->explosionID());
950  }
951  }
952 
953  for(int i = 0; i < nBombPower; i++)
954  {
955  Granatier::Direction::Type direction = Granatier::Direction::NORTH;
956  do
957  {
958  switch(direction)
959  {
960  case Granatier::Direction::NORTH:
961  xPos = bomb->getX();
962  yPos = bomb->getY() - (i+1)*Granatier::CellSize;
963  break;
964  case Granatier::Direction::EAST:
965  xPos = bomb->getX() + (i+1)*Granatier::CellSize;
966  yPos = bomb->getY();
967  break;
968  case Granatier::Direction::SOUTH:
969  xPos = bomb->getX();
970  yPos = bomb->getY() + (i+1)*Granatier::CellSize;
971  break;
972  case Granatier::Direction::WEST:
973  xPos = bomb->getX() - (i+1)*Granatier::CellSize;
974  yPos = bomb->getY();
975  break;
976  }
977  nColumn = m_game->getArena()->getColFromX(xPos);
978  nRow = m_game->getArena()->getRowFromY(yPos);
979 
980  if(!abDirectionsDone[direction] && nColumn >= 0 && nColumn < nNumberOfColums && nRow >= 0 && nRow < nNumberOfRows)
981  {
982  bombElements = m_game->getArena()->getCell(nRow, nColumn).getElements(Granatier::Element::BOMB);
983  blockElements = m_game->getArena()->getCell(nRow, nColumn).getElements(Granatier::Element::BLOCK);
984  if(m_game->getArena()->getCell(nRow, nColumn).getType() != Granatier::Cell::WALL)
985  {
986  int tempBombDetonationCountdown = anDirectionDetonationCountdown[direction];
987  bool increaseDetonationTimeout = false;
988  foreach(Element* element, bombElements)
989  {
990  if(dynamic_cast <Bomb*> (element) != bomb && !(dynamic_cast <Bomb*> (element)->isDetonated()))
991  {
992  dynamic_cast <Bomb*> (element)->initDetonation(bomb->explosionID(), tempBombDetonationCountdown);
993  tempBombDetonationCountdown += 10;
994  increaseDetonationTimeout = true;
995  }
996  }
997  if(increaseDetonationTimeout)
998  {
999  anDirectionDetonationCountdown[direction] += nDetonationCountdown;
1000  }
1001 
1002  if(!blockElements.isEmpty())
1003  {
1004  abDirectionsDone[direction] = true;
1005  foreach(Element* element, blockElements)
1006  {
1007  dynamic_cast <Block*> (element)->startDestruction();
1008  if (m_blockItems[nRow][nColumn] != NULL)
1009  {
1010  //display bonus if available
1011  if (m_bonusItems[nRow][nColumn] != NULL)
1012  {
1013  m_bonusItems[nRow][nColumn]->setUndestroyable(bomb->explosionID());
1014  m_bonusItems[nRow][nColumn]->show();
1015  }
1016  }
1017  }
1018  }
1019  else if(m_bonusItems[nRow][nColumn] != NULL)
1020  {
1021  m_bonusItems[nRow][nColumn]->initDestruction(bomb->explosionID());
1022  }
1023 
1024  bombExplosionItem = new BombExplosionItem (bomb, direction, nBombPower - i, m_rendererBombItems, m_SvgScaleFactor);
1025  bombExplosionItem->setPosition(xPos, yPos);
1026  connect(this, SIGNAL(resizeGraphics(qreal)), bombExplosionItem, SLOT(updateGraphics(qreal)));
1027  addItem(bombExplosionItem);
1028  m_bombItems[bombItem].append(bombExplosionItem);
1029  }
1030  else
1031  {
1032  abDirectionsDone[direction] = true;
1033  }
1034  }
1035  else
1036  {
1037  abDirectionsDone[direction] = true;
1038  }
1039 
1040  switch(direction)
1041  {
1042  case Granatier::Direction::NORTH:
1043  direction = Granatier::Direction::EAST;
1044  break;
1045  case Granatier::Direction::EAST:
1046  direction = Granatier::Direction::SOUTH;
1047  break;
1048  case Granatier::Direction::SOUTH:
1049  direction = Granatier::Direction::WEST;
1050  break;
1051  case Granatier::Direction::WEST:
1052  direction = Granatier::Direction::NORTH;
1053  break;
1054  }
1055  }
1056  while(direction != Granatier::Direction::NORTH);
1057  }
1058 }
1059 
1060 void GameScene::updateBombExplosionItemAnimation(BombItem* bombItem, int nFrame)
1061 {
1062  // Find the BombItems and update the frame
1063  BombExplosionItem* bombExplosionItem;
1064  QHash<BombItem*, QList<BombExplosionItem*> >::iterator i = m_bombItems.begin();
1065  while (i != m_bombItems.end())
1066  {
1067  if(i.key() == bombItem)
1068  {
1069  for(int nIndex = 0; nIndex < i.value().count(); nIndex++)
1070  {
1071  bombExplosionItem = i.value().at(nIndex);
1072  if(bombExplosionItem)
1073  {
1074  bombExplosionItem->updateAnimationn(nFrame);
1075  }
1076  }
1077  break;
1078  }
1079  else
1080  {
1081  ++i;
1082  }
1083  }
1084 }
QGraphicsTextItem::setFont
void setFont(const QFont &font)
Granatier::Cell::GROUND
Definition: granatierglobals.h:74
QTransform
QList::clear
void clear()
Granatier::Cell::ICE
Definition: granatierglobals.h:77
QRect::size
QSize size() const
Element::getX
qreal getX() const
Gets the Element x-coordinate.
Definition: element.cpp:46
ElementItem::update
virtual void update(qreal p_x, qreal p_y)
Updates the ElementItem coordinates.
Definition: elementitem.cpp:55
bombitem.h
playeritem.h
QHash::key
const Key key(const T &value) const
GameScene::resizeGraphics
void resizeGraphics(qreal svgScaleFactor)
Signals that the graphics need an update.
Granatier::Bonus::KICK
Definition: granatierglobals.h:111
Bonus
This class represents a Bonus for the Player.
Definition: bonus.h:29
Granatier::Bonus::SHIELD
Definition: granatierglobals.h:109
GameScene::showScore
void showScore()
Shows the labels with the points.
Definition: gamescene.cpp:657
infosidebar.h
QRectF::x
qreal x() const
QRectF::y
qreal y() const
Arena::getNbColumns
int getNbColumns() const
Gets the number of columns of the Arena.
Definition: arena.cpp:164
QGraphicsScene::items
QList< QGraphicsItem * > items() const
Granatier::Cell::ARROWDOWN
Definition: granatierglobals.h:80
QRectF::setRight
void setRight(qreal x)
BombItem
This class is the graphical representation of a Bomb.
Definition: bombitem.h:31
Granatier::Element::PLAYER
Definition: granatierglobals.h:93
QChar
QFont
QGraphicsTextItem::boundingRect
virtual QRectF boundingRect() const
QMap
QRect::bottomRight
QPoint bottomRight() const
arenaitem.h
Bonus::getBonusType
Granatier::Bonus::Type getBonusType() const
Definition: bonus.cpp:42
QGraphicsScene::setSceneRect
void setSceneRect(const QRectF &rect)
Cell::getElements
QList< Element * > getElements() const
Gets all the Elements that are on the Cell.
Definition: cell.cpp:62
Element::getImageId
QString getImageId() const
Gets the path to the Element image.
Definition: element.cpp:73
QRectF::top
qreal top() const
Granatier::Element::BONUS
Definition: granatierglobals.h:95
GameScene::~GameScene
~GameScene()
Deletes the Game instance.
Definition: gamescene.cpp:492
Granatier::Direction::Type
Type
Definition: granatierglobals.h:124
game.h
Game::getArena
Arena * getArena() const
Definition: game.cpp:306
bombexplosionitem.h
InfoOverlay
This class the game info if paused or a round is over.
Definition: infooverlay.h:35
QRectF::left
qreal left() const
QRectF::adjust
void adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)
Game::removeBonus
void removeBonus(Bonus *bonus)
Definition: game.cpp:417
player.h
Granatier::Bonus::BOMB
Definition: granatierglobals.h:107
QRectF::setLeft
void setLeft(qreal x)
Granatier::Info::TimeInfo
Definition: granatierglobals.h:139
QList::size
int size() const
ElementItem::getModel
Element * getModel() const
Gets the Element model.
Definition: elementitem.cpp:43
BonusItem
This class is the graphical representation of a Bonus.
Definition: bonusitem.h:30
QRectF::setHeight
void setHeight(qreal height)
Granatier::Bonus::SCATTY
Definition: granatierglobals.h:115
Granatier::Bonus::HYPERACTIVE
Definition: granatierglobals.h:113
Settings::self
static Settings * self()
Definition: settings.cpp:17
QRectF::bottom
qreal bottom() const
GameScene::GameScene
GameScene(Game *p_game, KgThemeProvider *p_themeProvider)
Creates a new GameScene instance.
Definition: gamescene.cpp:51
QRect
Granatier::CellSize
const qreal CellSize
The Cell size.
Definition: granatierglobals.h:31
cell.h
QList::append
void append(const T &value)
Granatier::Cell::ARROWRIGHT
Definition: granatierglobals.h:82
bonusitem.h
BombItem::update
virtual void update(qreal p_x, qreal p_y)
Updates the BombItem coordinates.
Definition: bombitem.cpp:113
Game::getPlayers
QList< Player * > getPlayers() const
Definition: game.cpp:291
QTransform::scale
QTransform & scale(qreal sx, qreal sy)
GameScene::initItemsWithGraphicsFromTheme
void initItemsWithGraphicsFromTheme()
Initializes all items with graphics from the theme.
Definition: gamescene.cpp:271
QTimer
Granatier::Direction::WEST
Definition: granatierglobals.h:129
QGraphicsScene::removeItem
void removeItem(QGraphicsItem *item)
QHash
BombExplosionItem
This class is the graphical representation of a Bomb explosion.
Definition: bombexplosionitem.h:33
ArenaItem
This class is the graphical view of the Arena.
Definition: arenaitem.h:30
InfoOverlay::resizeDimmOverlay
void resizeDimmOverlay(qreal x, qreal y, qreal width, qreal height)
Resize dimm overlay.
Definition: infooverlay.cpp:303
BonusItem::setUndestroyable
void setUndestroyable(int nExplosionID)
Sets the undestroyable explosion IDs.
Definition: bonusitem.cpp:38
QGraphicsItem::setPos
void setPos(const QPointF &pos)
QGraphicsScene::views
QList< QGraphicsView * > views() const
QList::isEmpty
bool isEmpty() const
Game
This class manages the game main loop : it regularly checks the key press events, computes the charac...
Definition: game.h:43
Bomb
This class describes the common characteristics and behaviour of the bomb item.
Definition: bomb.h:30
QHash::begin
iterator begin()
Granatier::Bonus::RESURRECT
Definition: granatierglobals.h:117
QGraphicsTextItem
Game::getRemainingTime
int getRemainingTime() const
Definition: game.cpp:301
Game::removeBomb
void removeBomb(Bomb *bomb)
Removes exploded bombs from the bomb list.
Definition: game.cpp:719
Granatier::Info::Type
Type
Definition: granatierglobals.h:136
Granatier::Cell::WALL
Definition: granatierglobals.h:75
BonusItem::initDestruction
void initDestruction(int nExplosionID)
Inits the destruction.
Definition: bonusitem.cpp:43
QString
QList< Player * >
QMap::end
iterator end()
QColor
gamescene.h
GameScene::getGame
Game * getGame() const
Definition: gamescene.cpp:714
QMap::begin
iterator begin()
InfoOverlay::showScore
void showScore()
Shows the score info.
Definition: infooverlay.cpp:175
QHash::erase
iterator erase(iterator pos)
bonus.h
InfoOverlay::hideItems
void hideItems()
Hides the info items.
Definition: infooverlay.cpp:237
BlockItem
This class is the graphical representation of a Block.
Definition: blockitem.h:30
Granatier::Bonus::THROW
Definition: granatierglobals.h:110
Granatier::Element::Type
Type
Definition: granatierglobals.h:89
QHash::value
const T value(const Key &key) const
Element
This class describes the common characteristics and behaviour of any game Element (character or item)...
Definition: element.h:32
QRectF::right
qreal right() const
Granatier::Element::BOMB
Definition: granatierglobals.h:94
Granatier::Direction::NORTH
Definition: granatierglobals.h:126
QSize
Bomb::explosionID
int explosionID()
Definition: bomb.cpp:488
QTimer::stop
void stop()
Granatier::Bonus::MIRROR
Definition: granatierglobals.h:114
Element::getY
qreal getY() const
Gets the Element y-coordinate.
Definition: element.cpp:51
Bomb::bombPower
int bombPower()
Power of the bomb.
Definition: bomb.cpp:445
Game::blockDestroyed
void blockDestroyed(const int row, const int col, Block *block)
remove Block from list and decide to give bonus
Definition: game.cpp:739
Arena::getName
QString getName() const
Returns the Arean name.
Definition: arena.cpp:53
Granatier::Bonus::RESTRAIN
Definition: granatierglobals.h:116
Granatier::Bonus::SPEED
Definition: granatierglobals.h:106
PlayerItem::stopAnim
void stopAnim()
Stops the PlayerItem animation.
Definition: playeritem.cpp:244
GameScene::resizeSprites
void resizeSprites(int delayForBackground=0)
Updates the sprites after a resize.
Definition: gamescene.cpp:662
QRectF::width
qreal width() const
settings.h
QRectF::setBottom
void setBottom(qreal y)
InfoOverlay::showGetReady
void showGetReady()
Shows the get ready info.
Definition: infooverlay.cpp:135
QRectF
QRectF::setTop
void setTop(qreal y)
QRectF::setWidth
void setWidth(qreal width)
GameScene::renderer
KGameRenderer * renderer(Granatier::Element::Type type, Player *player=NULL)
Returns the renderer for the requestet Element Type.
Definition: gamescene.cpp:638
InfoOverlay::showPause
void showPause()
Shows the pause info.
Definition: infooverlay.cpp:155
BombExplosionItem::setPosition
virtual void setPosition(qreal p_x, qreal p_y)
Updates the BombExplosionItem coordinates.
Definition: bombexplosionitem.cpp:97
PlayerItem::update
void update(qreal p_x, qreal p_y)
Updates the PlayerItem coordinates.
Definition: playeritem.cpp:206
PlayerItem
This class manage the display of the Player.
Definition: playeritem.h:32
Granatier::Element::BLOCK
Definition: granatierglobals.h:92
Arena::getColFromX
int getColFromX(const qreal p_x) const
Gets the column index corresponding to the given x-coordinate.
Definition: arena.cpp:154
GameScene::init
void init()
Initializes class.
Definition: gamescene.cpp:205
QRect::topLeft
QPoint topLeft() const
KGameRenderedItem
Granatier::Cell::ARROWUP
Definition: granatierglobals.h:79
InfoSidebar
This class represents the game sidebar with game information about the player.
Definition: infosidebar.h:53
Granatier::Direction::EAST
Definition: granatierglobals.h:128
arena.h
BombExplosionItem::updateAnimationn
void updateAnimationn(int nFrame)
updates the animation
Definition: bombexplosionitem.cpp:127
QTimer::start
void start(int msec)
QGraphicsTextItem::setPlainText
void setPlainText(const QString &text)
QRectF::height
qreal height() const
GameScene::cleanUp
void cleanUp()
Cleans class.
Definition: gamescene.cpp:521
blockitem.h
QMap::insert
iterator insert(const Key &key, const T &value)
ElementItem::updateGraphics
virtual void updateGraphics(qreal svgScaleFactor)
Updates the graphics after a resize.
Definition: elementitem.cpp:65
QRectF::setX
void setX(qreal x)
QRectF::setY
void setY(qreal y)
QHash::end
iterator end()
QGraphicsTextItem::setDefaultTextColor
void setDefaultTextColor(const QColor &col)
InfoSidebar::themeChanged
void themeChanged()
Handles theme changes.
Definition: infosidebar.cpp:283
GameScene::cleanUpItemsWithGraphicsFromTheme
void cleanUpItemsWithGraphicsFromTheme()
Initializes all items with graphics from the theme.
Definition: gamescene.cpp:538
Granatier::Bonus::POWER
Definition: granatierglobals.h:108
QGraphicsScene::addItem
void addItem(QGraphicsItem *item)
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Granatier::Cell::BOMBMORTAR
Definition: granatierglobals.h:78
Granatier::Cell::ARROWLEFT
Definition: granatierglobals.h:81
infooverlay.h
Granatier::Cell::HOLE
Definition: granatierglobals.h:73
Block::getBonus
Bonus * getBonus()
Returns the Bonus which is contained by the Block.
Definition: block.cpp:39
QGraphicsItem::setZValue
void setZValue(qreal z)
GameScene::setupThemeRenderer
void setupThemeRenderer()
setup the KGameRenderer for the selected theme and if necessary the default theme ...
Definition: gamescene.cpp:112
Arena::getNbRows
int getNbRows() const
Gets the number of rows of the Arena.
Definition: arena.cpp:169
Player
This class represents the main character of the game.
Definition: player.h:33
Block
This class represents a block with the possibility of a bonus inside.
Definition: block.h:30
InfoOverlay::themeChanged
void themeChanged()
Handles theme changes.
Definition: infooverlay.cpp:388
bomb.h
Cell::getType
Granatier::Cell::Type getType() const
Gets the Cell type.
Definition: cell.cpp:52
Arena::getCell
Cell getCell(const int p_row, const int p_column) const
Gets the Cell at the given coordinates.
Definition: arena.cpp:120
block.h
Granatier::Direction::SOUTH
Definition: granatierglobals.h:127
Granatier::Bonus::SLOW
Definition: granatierglobals.h:112
Arena::getRowFromY
int getRowFromY(const qreal p_y) const
Gets the row index corresponding to the given y-coordinate.
Definition: arena.cpp:144
QMap::value
const T value(const Key &key) const
QTimer::setSingleShot
void setSingleShot(bool singleShot)
Granatier::Element::SCORE
Definition: granatierglobals.h:96
Granatier::Cell::BLOCK
Definition: granatierglobals.h:76
QString::toUtf8
QByteArray toUtf8() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:18:10 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

granatier

Skip menu "granatier"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdegames API Reference

Skip menu "kdegames API Reference"
  • granatier
  • kapman
  • kblackbox
  • kgoldrunner
  • kigo
  • kmahjongg
  • KShisen
  • ksquares
  • libkdegames
  •   highscore
  •   libkdegamesprivate
  •     kgame
  • libkmahjongg
  • palapeli
  •   libpala

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal