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

kgoldrunner

  • sources
  • kde-4.14
  • kdegames
  • kgoldrunner
  • src
kgrrenderer.cpp
Go to the documentation of this file.
1 /****************************************************************************
2  * Copyright 2012 Ian Wadham <iandw.au@gmail.com> *
3  * *
4  * This program is free software; you can redistribute it and/or *
5  * modify it under the terms of the GNU General Public License as *
6  * published by the Free Software Foundation; either version 2 of *
7  * the License, or (at your option) any later version. *
8  * *
9  * This program is distributed in the hope that it will be useful, *
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12  * GNU General Public License for more details. *
13  * *
14  * You should have received a copy of the GNU General Public License *
15  * along with this program. If not, see <http://www.gnu.org/licenses/>. *
16  ****************************************************************************/
17 
18  // TODO - Border tiles, display tiles.
19  // TODO - Add attributes to theme: HasBorderTiles, HasDisplayTiles.
20 
21 #include <KGameRenderer>
22 #include <KGameRenderedItem>
23 #include <KgThemeProvider>
24 #include <KgThemeSelector>
25 #include <KLocalizedString>
26 
27 #include <QDebug>
28 #include <QString>
29 
30 #include "kgrglobals.h"
31 #include "kgrthemetypes.h"
32 #include "kgrrenderer.h"
33 #include "kgrscene.h"
34 
35 #include <cmath>
36 
37 KGrRenderer::KGrRenderer (KGrScene * scene)
38  :
39  QObject (scene),
40  m_scene (scene)
41 {
42  // Set up two theme providers: for the Set and the Actors.
43  m_setProvider = new KgThemeProvider("Theme", this); // Save config.
44  m_actorsProvider = new KgThemeProvider("", this); // Do not save.
45 
46  // Find SVG files for the Set, i.e. tiles and backgrounds.
47  const QMetaObject * setThemeClass = & KGrSetTheme::staticMetaObject;
48  m_setProvider->discoverThemes ("appdata", QLatin1String ("themes"),
49  QLatin1String ("egypt"), setThemeClass);
50 
51  // Find SVG files for the Actors, i.e. hero and enemies.
52  const QMetaObject * actorsThemeClass = & KGrActorsTheme::staticMetaObject;
53  m_actorsProvider->discoverThemes ("appdata", QLatin1String ("themes"),
54  QLatin1String ("egypt"), actorsThemeClass);
55 
56  // Set up a dialog for selecting themes.
57  m_themeSelector = new KgThemeSelector (m_setProvider,
58  KgThemeSelector::DefaultBehavior,
59  0); // No parent: modeless dialog.
60 
61  // Set up the renderer for the Set, i.e. tiles and backgrounds.
62  m_setRenderer = new KGameRenderer (m_setProvider);
63  m_setRenderer->setParent (this);
64  m_setRenderer->setFrameSuffix ("_%1");
65  m_setRenderer->setFrameBaseIndex (1);
66 
67  // Set up the renderer for the Actors, i.e. hero and enemies.
68  m_actorsRenderer = new KGameRenderer (m_actorsProvider);
69  m_actorsRenderer->setParent (this);
70  m_actorsRenderer->setFrameSuffix ("_%1");
71  m_actorsRenderer->setFrameBaseIndex (1);
72 
73  // Match the Actors SVG theme to the Set theme, whenever the theme changes.
74  connect (m_setProvider, SIGNAL(currentThemeChanged(const KgTheme*)),
75  this, SLOT(currentThemeChanged(const KgTheme*)));
76 
77  // Match the starting SVG theme for the Actors to the one for the Set.
78  matchThemes (m_setProvider->currentTheme());
79 }
80 
81 KGrRenderer::~KGrRenderer()
82 {
83  delete m_themeSelector;
84 }
85 
86 void KGrRenderer::matchThemes (const KgTheme * currentSetTheme)
87 {
88  // Start of game or change of theme: initialise the counts of pixmap keys.
89  initPixmapKeys();
90 
91  foreach (const KgTheme * actorsTheme, m_actorsProvider->themes()) {
92  if (actorsTheme->customData("Set") ==
93  currentSetTheme->customData("Set")) {
94  m_actorsProvider->setCurrentTheme (actorsTheme);
95  break;
96  }
97  }
98 }
99 
100 void KGrRenderer::currentThemeChanged (const KgTheme* currentSetTheme)
101 {
102  qDebug() << "KGrRenderer::currentThemeChanged()" << currentSetTheme->name();
103 
104  matchThemes (currentSetTheme);
105  m_scene->changeTheme();
106 }
107 
108 void KGrRenderer::selectTheme()
109 {
110  // Show the theme-selection dialog.
111  m_themeSelector->showAsDialog (i18n("Theme Selector"));
112 }
113 
114 KGrRenderer::PixmapSpec KGrRenderer::keyTable [] = {
115  {ENEMY, Actors, "enemy_1", "", -1, -2}, // For editor only.
116  {HERO, Actors, "hero_1", "", -1, -2}, // For editor only.
117  {CONCRETE, Set, "concrete", "-%1", 0, -2},
118  {BRICK, Set, "brick", "-%1", 0, -2},
119  {FBRICK, Set, "false_brick", "", -1, -2}, // For editor only.
120  {HLADDER, Set, "hidden_ladder", "", -1, -2}, // For editor only.
121  {LADDER, Set, "ladder", "-%1", 0, -2},
122  {NUGGET, Set, "gold", "-%1", 0, -2},
123  {BAR, Set, "bar", "-%1", 0, -2},
124  {BACKDROP, Set, "background", "%1", 0, -2},
125  {FREE, Set, "empty", "", -1, -2} // Must be last entry.
126 };
127 
128 void KGrRenderer::initPixmapKeys()
129 {
130  // Set all pixmaps in keyTable[] as "not counted yet" (frameCount -2).
131  int index = 0;
132  do {
133  keyTable[index].frameCount = -2;
134  index++;
135  } while (keyTable[index].picType != FREE);
136 }
137 
138 KGameRenderedItem * KGrRenderer::getTileItem
139  (const char picType, KGameRenderedItem * currentTile)
140 {
141  if (currentTile) {
142  // Remove the tile that was here before.
143  m_scene->removeItem (currentTile);
144  delete currentTile;
145  }
146 
147  int index;
148  if ((picType == FREE) || ((index = findKeyTableIndex (picType)) < 0)) {
149  return 0; // Empty place or missing type, so no KGameRenderedItem.
150  }
151 
152  // Get the pixmap key and use one of the two renderers to create the tile.
153  QString key = getPixmapKey (picType, index);
154  KGameRenderedItem * tile =
155  new KGameRenderedItem ((keyTable[index].picSource == Set) ?
156  m_setRenderer : m_actorsRenderer, key);
157  tile->setAcceptedMouseButtons (0);
158  m_scene->addItem (tile);
159  return tile;
160 }
161 
162 KGrSprite * KGrRenderer::getSpriteItem (const char picType, const int tickTime)
163 {
164  int index = findKeyTableIndex (picType);
165  if (index < 0) {
166  return 0; // Missing type, so no KGrSprite item.
167  }
168  QString key = (picType == HERO) ? "hero" :
169  ((picType == ENEMY) ? "enemy" : "brick");
170  KGrSprite * sprite = new KGrSprite ((keyTable[index].picSource == Set) ?
171  m_setRenderer : m_actorsRenderer,
172  key, picType, tickTime);
173  sprite->setAcceptedMouseButtons (0);
174  // We cannot add the sprite to the scene yet: it needs a frame and size.
175  return sprite;
176 }
177 
178 KGameRenderedItem * KGrRenderer::getBackground
179  (const int level, KGameRenderedItem * currentBackground)
180 {
181  if (currentBackground) {
182  m_scene->removeItem (currentBackground);
183  delete currentBackground;
184  }
185 
186  QString key = getBackgroundKey (level);
187  KGameRenderedItem * background = new KGameRenderedItem (m_setRenderer, key);
188  background->setAcceptedMouseButtons (0);
189  m_scene->addItem (background);
190 
191  return background;
192 }
193 
194 KGameRenderedItem * KGrRenderer::getBorderItem
195  (QString spriteKey, KGameRenderedItem * currentItem)
196 {
197  if (currentItem) {
198  m_scene->removeItem (currentItem);
199  delete currentItem;
200  }
201 
202  if (!hasBorder()) {
203  return 0;
204  }
205 
206  KGameRenderedItem * item = new KGameRenderedItem (m_setRenderer, spriteKey);
207  item->setAcceptedMouseButtons (0);
208  m_scene->addItem (item);
209  return item;
210 }
211 
212 bool KGrRenderer::hasBorder() const
213 {
214  QString s = m_setRenderer->theme()->customData("DrawCanvasBorder", "0");
215 
216  if (s == QString ("1"))
217  return true;
218  else
219  return false;
220 }
221 
222 QColor KGrRenderer::borderColor() const
223 {
224  QString s = m_setRenderer->theme()->customData("BorderColor", "#000000");
225  return QColor (s);
226 }
227 
228 QColor KGrRenderer::textColor() const
229 {
230  QString s = m_setRenderer->theme()->customData("TextColor", "#FFFFFF");
231  return QColor (s);
232 }
233 
234 QPixmap KGrRenderer::getPixmap (const char picType)
235 {
236  // Get the pixmap key and use one of the two renderers to create the tile.
237  int index = findKeyTableIndex (picType);
238  QString key = getPixmapKey (picType, index);
239 
240  if (keyTable[index].picSource == Set)
241  return m_setRenderer->spritePixmap (key, m_scene->tileSize ());
242  else
243  return m_actorsRenderer->spritePixmap (key, m_scene->tileSize ());
244 }
245 
246 QString KGrRenderer::getPixmapKey (const char picType, const int index)
247 {
248  QString pixmapKey = "";
249  // int index = findKeyTableIndex (picType);
250  int frameCount = (index < 0) ? -1 : keyTable[index].frameCount;
251  if (frameCount > -1) {
252  pixmapKey = keyTable[index].picKey; // No suffix.
253  if (frameCount > 0) {
254  // Pick a random frame number and add it as a suffix.
255  // Note: We are not worried about having a good seed for this.
256  pixmapKey = pixmapKey + QString(keyTable[index].frameSuffix);
257  pixmapKey = pixmapKey.arg (keyTable[index].frameBaseIndex +
258  (rand() % frameCount));
259  }
260  }
261  return pixmapKey;
262 }
263 
264 QString KGrRenderer::getBackgroundKey (const int level)
265 {
266  QString pixmapKey = "";
267  int index = findKeyTableIndex (BACKDROP);
268  int frameCount = (index < 0) ? -1 : keyTable[index].frameCount;
269  if (frameCount > -1) {
270  pixmapKey = keyTable[index].picKey;
271  if (frameCount > 0) {
272  // Cycle through available backgrounds as the game-level increases.
273  pixmapKey = pixmapKey + QString(keyTable[index].frameSuffix);
274  pixmapKey = pixmapKey.arg (level % frameCount);
275  }
276  }
277 
278  qDebug() << "BACKGROUND pixmap key" << pixmapKey;
279  return pixmapKey;
280 }
281 
282 int KGrRenderer::findKeyTableIndex (const char picType)
283 {
284  int index = 0;
285  while (true) { // Find ANY picType, including FREE.
286  if (keyTable[index].picType == picType) {
287  if (keyTable[index].frameCount == -2) {
288  keyTable[index].frameCount = countFrames (index);
289  }
290  break;
291  }
292  else if (keyTable[index].picType == FREE) {
293  index = -1; // Not found.
294  break;
295  }
296  index++;
297  }
298  return index;
299 }
300 
301 int KGrRenderer::countFrames (const int index)
302 {
303  int count = -1;
304  int frame = keyTable[index].frameBaseIndex;
305  KGameRenderer * r = (keyTable[index].picSource == Set) ? m_setRenderer :
306  m_actorsRenderer;
307  if (r->spriteExists (keyTable[index].picKey)) {
308  count++;
309  }
310 
311  if ((count == 0) && (QString(keyTable[index].picKey) != QString("brick"))) {
312  return count;
313  }
314 
315  if (frame < 0) {
316  return count; // This element cannot have more than one frame.
317  }
318 
319  count = 0;
320  QString pixmapKey = QString(keyTable[index].picKey) +
321  QString(keyTable[index].frameSuffix);
322  while (r->spriteExists (pixmapKey.arg (frame))) {
323  count++;
324  frame++;
325  }
326 
327  return count;
328 }
329 
330 #include "kgrrenderer.moc"
BAR
const char BAR
Definition: kgrglobals.h:39
KGrRenderer::getPixmap
QPixmap getPixmap(const char picType)
Definition: kgrrenderer.cpp:234
kgrrenderer.h
HERO
const char HERO
Definition: kgrglobals.h:31
KGrScene::tileSize
QSize tileSize() const
Get the current size of the squared region occupied by a single visual element (characters, ladders, bricks etc.).
Definition: kgrscene.h:121
KGrRenderer::textColor
QColor textColor() const
Definition: kgrrenderer.cpp:228
KGrRenderer::KGrRenderer
KGrRenderer(KGrScene *scene)
Definition: kgrrenderer.cpp:37
KGrRenderer::getTileItem
KGameRenderedItem * getTileItem(const char picType, KGameRenderedItem *currentTile)
Definition: kgrrenderer.cpp:139
KGrRenderer::borderColor
QColor borderColor() const
Definition: kgrrenderer.cpp:222
kgrthemetypes.h
BACKDROP
const char BACKDROP
Definition: kgrglobals.h:43
QMetaObject
NUGGET
const char NUGGET
Definition: kgrglobals.h:37
KGrScene::changeTheme
void changeTheme()
Redraw the scene whenever the current theme has changed.
Definition: kgrscene.cpp:215
QObject
QString
QColor
LADDER
const char LADDER
Definition: kgrglobals.h:36
HLADDER
const char HLADDER
Definition: kgrglobals.h:35
QPixmap
ENEMY
const char ENEMY
Definition: kgrglobals.h:29
BRICK
const char BRICK
Definition: kgrglobals.h:33
kgrscene.h
FBRICK
const char FBRICK
Definition: kgrglobals.h:34
QLatin1String
kgrglobals.h
KGrSprite
Definition: kgrsprite.h:29
KGameRenderedItem
KgTheme
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KGrScene
The QGraphicsScene that represents KGoldrunner on the screen.
Definition: kgrscene.h:75
KGrRenderer::getBorderItem
KGameRenderedItem * getBorderItem(QString spriteKey, KGameRenderedItem *currentItem)
Definition: kgrrenderer.cpp:195
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
CONCRETE
const char CONCRETE
Definition: kgrglobals.h:32
FREE
const char FREE
Definition: kgrglobals.h:28
KGrRenderer::getSpriteItem
KGrSprite * getSpriteItem(const char picType, const int tickTime)
Definition: kgrrenderer.cpp:162
KGrRenderer::getBackground
KGameRenderedItem * getBackground(const int level, KGameRenderedItem *currentBackground)
Definition: kgrrenderer.cpp:179
KGrRenderer::selectTheme
void selectTheme()
Definition: kgrrenderer.cpp:108
KGrRenderer::~KGrRenderer
virtual ~KGrRenderer()
Definition: kgrrenderer.cpp:81
KGrRenderer::hasBorder
bool hasBorder() const
Definition: kgrrenderer.cpp:212
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:18:24 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kgoldrunner

Skip menu "kgoldrunner"
  • Main Page
  • 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