Source Code (Use browser search to find items of interest.)
Class Index
ksmiletris'GameWidget (./kdegames/ksmiletris/gamewidget.h:37)
class GameWidget : public QWidget {
Q_OBJECT
signals:
void changedStats(int, int);
void gameOver();
public:
bool in_game, in_pause;
bool do_sounds;
int num_level;
int num_points;
GameWidget(QWidget *parent=0, const char *name=0);
~GameWidget();
void setPieces(PiecesType type);
Sprite& ref(int x, int y) {
return map[y*scr_width + x];
}
Sprite type(Sprite s) {
if (s >= Sprite_Broken1 && s < Sprite_Broken1 + num_blocks)
return (Sprite)(Sprite_Block1 + s - Sprite_Broken1);
return s;
}
void repaintChilds();
private:
QPixmap *sprites;
ScreenWidget *screen;
MirrorWidget *mirror;
NextPieceWidget *next;
int xpos, ypos;
Sprite piece[4];
Sprite *map;
Sprite *mirror_sprites;
Sprite next_piece[4];
Sprite bg_sprite;
int timer_interval;
bool fast_mode;
QTimer *timer;
KRandomSequence random;
int num_pieces_level;
void playSound(Sound s);
void loadSprites();
void loadSprite(Sprite spr, const char *path);
void loadMaskedSprite(Sprite spr, const char *path1, const char *path2);
void newBlock();
void putPiece();
void getPiece();
void newPiece();
void nextPiece();
void compact();
void broke(int x, int y, bool *xmap);
void recBroke(int x, int y, bool *xmap);
void checkSolePiece(int x, int y, bool *xmap);
void checkPiece(int x, int y);
void blockPiece();
void updateMirror();
public slots:
void newGame();
void keyUp();
void keyDown();
void keyLeft();
void keyRight();
void keySpace();
void timeout();
};
ksmiletris'GameWidget::GameWidget() (./kdegames/ksmiletris/gamewidget.cpp:48)
GameWidget::GameWidget(QWidget *parent, const char *name)
: QWidget(parent, name)
{
in_game = false;
in_pause = false;
random.setSeed(0);
QAccel *accel = new QAccel(this);
accel->connectItem(accel->insertItem(Key_Up), this, SLOT(keyUp()));
accel->connectItem(accel->insertItem(Key_Down), this, SLOT(keyDown()));
accel->connectItem(accel->insertItem(Key_Left), this, SLOT(keyLeft()));
accel->connectItem(accel->insertItem(Key_Right), this, SLOT(keyRight()));
accel->connectItem(accel->insertItem(Key_Space), this, SLOT(keySpace()));
loadSprites();
setPieces(Pieces_Smiles);
map = new Sprite[scr_width * scr_height];
mirror_sprites = new Sprite[scr_width];
screen = new ScreenWidget(sprites, &in_game, &in_pause, this);
screen->move(10, 10);
screen->setScreenSprites(map);
mirror = new MirrorWidget(sprites, &in_game, &in_pause, this);
mirror->move(10, 407);
mirror->setMirrorSprites(mirror_sprites);
next = new NextPieceWidget(sprites, &in_game, &in_pause, this);
next->move(278, 10);
next->setNextPieceSprites(next_piece);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
}
ksmiletris'GameWidget::~GameWidget() (./kdegames/ksmiletris/gamewidget.cpp:85)
GameWidget::~GameWidget()
{
delete [] sprites;
delete [] map;
delete [] mirror_sprites;
}
ksmiletris'GameWidget::playSound() (./kdegames/ksmiletris/gamewidget.cpp:92)
void GameWidget::playSound(Sound s)
{
if (!do_sounds)
return;
QString name;
switch (s) {
case Sound_Break:
name = "break.wav";
break;
case Sound_Clear:
name = "clear.wav";
break;
}
KAudioPlayer::play(locate("data", QString("ksmiletris/sounds/") + name));
}
ksmiletris'GameWidget::setPieces() (./kdegames/ksmiletris/gamewidget.cpp:110)
void GameWidget::setPieces(PiecesType type)
{
QString prefix;
switch (type) {
case Pieces_Smiles:
prefix = "block-a";
loadSprite(Sprite_Cleared, "cleared-a.bmp");
break;
case Pieces_Symbols:
prefix = "block-b";
loadSprite(Sprite_Cleared, "cleared-b.bmp");
break;
case Pieces_Icons:
prefix = "block-c";
loadSprite(Sprite_Cleared, "cleared-c.bmp");
}
for (int i = 0; i < num_blocks; ++i) {
QString n;
n.setNum(i + 1);
loadSprite((Sprite)(Sprite_Block1 + i), prefix + n + ".bmp");
}
QPixmap pm(32, 32);
for (int i = 0; i < num_blocks; ++i) {
QPainter p;
p.begin(&pm);
p.drawPixmap(0, 0, sprites[Sprite_Block1 + i]);
p.drawPixmap(0, 0, sprites[Sprite_Broken]);
p.end();
sprites[Sprite_Broken1 + i] = pm;
}
if (in_game) repaintChilds();
}
ksmiletris'GameWidget::loadSprites() (./kdegames/ksmiletris/gamewidget.cpp:146)
void GameWidget::loadSprites()
{
sprites = new QPixmap[num_sprites];
loadSprite(Sprite_Bg1, "bg1.bmp");
loadSprite(Sprite_Bg2, "bg2.bmp");
loadSprite(Sprite_Bg3, "bg3.bmp");
loadSprite(Sprite_Bg4, "bg4.bmp");
loadSprite(Sprite_Bg5, "bg5.bmp");
loadSprite(Sprite_Bg6, "bg6.bmp");
loadSprite(Sprite_Bg7, "bg7.bmp");
loadSprite(Sprite_Bg8, "bg8.bmp");
loadSprite(Sprite_Bg9, "bg9.bmp");
loadSprite(Sprite_Bg10, "bg10.bmp");
loadSprite(Sprite_Bg11, "bg11.bmp");
loadSprite(Sprite_Bg12, "bg12.bmp");
loadSprite(Sprite_Bg13, "bg13.bmp");
loadSprite(Sprite_Bg14, "bg14.bmp");
loadSprite(Sprite_Bg15, "bg15.bmp");
loadSprite(Sprite_Bg16, "bg16.bmp");
loadMaskedSprite(Sprite_Broken, "broken.bmp", "broken-mask.bmp");
}
ksmiletris'GameWidget::loadSprite() (./kdegames/ksmiletris/gamewidget.cpp:168)
void GameWidget::loadSprite(Sprite spr, const char *path)
{
if (!sprites[spr].load(locate("appdata", QString("data/") + path)))
fatal("Cannot open data files.\nHave you correctly installed KSmiletris?");
}
ksmiletris'GameWidget::loadMaskedSprite() (./kdegames/ksmiletris/gamewidget.cpp:174)
void GameWidget::loadMaskedSprite(Sprite spr, const char *path1, const char *path2)
{
QBitmap bmp;
if (!sprites[spr].load(locate("appdata", QString("data/") + path1)))
fatal("Cannot open data files.\nHave you correctly installed KSmiletris?");
if (!bmp.load(locate("appdata", QString("data/") + path2)))
fatal("Cannot open data files.\nHave you correctly installed KSmiletris?");
sprites[spr].setMask(bmp);
}
ksmiletris'GameWidget::newGame() (./kdegames/ksmiletris/gamewidget.cpp:184)
void GameWidget::newGame()
{
in_pause = false;
fast_mode = false;
num_level = 1;
num_pieces_level = 2;
num_points = 0;
bg_sprite = (Sprite)(Sprite_Bg1 + random.getLong(num_bgs));
screen->setBackgroundSprite(bg_sprite);
mirror->setBackgroundSprite(bg_sprite);
next->setBackgroundSprite(bg_sprite);
for (int i = 0; i < scr_width; ++i)
mirror_sprites[i] = bg_sprite;
for (int i = 0; i < 4; ++i)
next_piece[i] = bg_sprite;
for (int y = 0; y < scr_height; ++y)
for (int x = 0; x < scr_width; ++x)
ref(x, y) = bg_sprite;
newPiece();
nextPiece();
updateMirror();
in_game = true;
repaintChilds();
emit changedStats(num_level, num_points);
timer_interval = 700;
timer->start(timer_interval);
}
ksmiletris'GameWidget::repaintChilds() (./kdegames/ksmiletris/gamewidget.cpp:216)
void GameWidget::repaintChilds()
{
screen->repaint(false);
mirror->repaint(false);
next->repaint(false);
}
ksmiletris'GameWidget::putPiece() (./kdegames/ksmiletris/gamewidget.cpp:223)
void GameWidget::putPiece()
{
if (piece[0] != bg_sprite) ref(xpos + 0, ypos + 0) = piece[0];
if (piece[1] != bg_sprite) ref(xpos + 1, ypos + 0) = piece[1];
if (piece[2] != bg_sprite) ref(xpos + 0, ypos + 1) = piece[2];
if (piece[3] != bg_sprite) ref(xpos + 1, ypos + 1) = piece[3];
updateMirror();
screen->repaint(false);
}
ksmiletris'GameWidget::getPiece() (./kdegames/ksmiletris/gamewidget.cpp:233)
void GameWidget::getPiece()
{
if (piece[0] != bg_sprite) ref(xpos + 0, ypos + 0) = bg_sprite;
if (piece[1] != bg_sprite) ref(xpos + 1, ypos + 0) = bg_sprite;
if (piece[2] != bg_sprite) ref(xpos + 0, ypos + 1) = bg_sprite;
if (piece[3] != bg_sprite) ref(xpos + 1, ypos + 1) = bg_sprite;
}
ksmiletris'GameWidget::newPiece() (./kdegames/ksmiletris/gamewidget.cpp:241)
void GameWidget::newPiece()
{
static int pieces[][4] = {{1, 0, 1, 1},
{1, 1, 1, 0},
{1, 1, 0, 1},
{0, 1, 1, 1}};
int p = random.getLong(4);
for (int i = 0; i < 4; ++i)
if (pieces[p][i])
next_piece[i] = (Sprite)(Sprite_Block1 + random.getLong(num_pieces_level));
else
next_piece[i] = bg_sprite;
next->repaint(false);
}
ksmiletris'GameWidget::nextPiece() (./kdegames/ksmiletris/gamewidget.cpp:256)
void GameWidget::nextPiece()
{
piece[0] = next_piece[0];
piece[1] = next_piece[1];
piece[2] = next_piece[2];
piece[3] = next_piece[3];
newPiece();
xpos = (scr_width - 2) / 2;
ypos = 0;
if ((piece[0] != bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
|| (piece[1] != bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
|| (piece[2] != bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
|| (piece[3] != bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)) {
in_game = false;
repaintChilds();
QMessageBox::information(this, kapp->caption(),
i18n("Game Over"), i18n("OK"));
emit gameOver();
}
putPiece();
}
ksmiletris'GameWidget::updateMirror() (./kdegames/ksmiletris/gamewidget.cpp:279)
void GameWidget::updateMirror()
{
for (int x = 0; x < scr_width; ++x)
mirror_sprites[x] = bg_sprite;
mirror_sprites[xpos] = piece[2] == bg_sprite ? piece[0] : piece[2];
mirror_sprites[xpos+1] = piece[3] == bg_sprite ? piece[1] : piece[3];
mirror->repaint(false);
}
ksmiletris'GameWidget::keyUp() (./kdegames/ksmiletris/gamewidget.cpp:288)
void GameWidget::keyUp()
{
if (!in_game || in_pause) return;
getPiece();
if ((piece[0] == bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
|| (piece[1] == bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
|| (piece[2] == bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
|| (piece[3] == bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)) {
putPiece();
return;
}
Sprite npiece[4];
npiece[2] = piece[0];
npiece[0] = piece[1];
npiece[3] = piece[2];
npiece[1] = piece[3];
for (int i = 0; i < 4; ++i)
piece[i] = npiece[i];
putPiece();
}
ksmiletris'GameWidget::keyDown() (./kdegames/ksmiletris/gamewidget.cpp:311)
void GameWidget::keyDown()
{
if (!in_game || in_pause) return;
getPiece();
if ((piece[0] == bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
|| (piece[1] == bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
|| (piece[2] == bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
|| (piece[3] == bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)) {
putPiece();
return;
}
Sprite npiece[4];
npiece[0] = piece[2];
npiece[1] = piece[0];
npiece[2] = piece[3];
npiece[3] = piece[1];
for (int i = 0; i < 4; ++i)
piece[i] = npiece[i];
putPiece();
}
ksmiletris'GameWidget::keyLeft() (./kdegames/ksmiletris/gamewidget.cpp:334)
void GameWidget::keyLeft()
{
if (!in_game || in_pause || xpos == 0) return;
getPiece();
if ((piece[0] != bg_sprite && ref(xpos - 1, ypos + 0) != bg_sprite)
|| (piece[1] != bg_sprite && ref(xpos + 0, ypos + 0) != bg_sprite)
|| (piece[2] != bg_sprite && ref(xpos - 1, ypos + 1) != bg_sprite)
|| (piece[3] != bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)) {
putPiece();
return;
}
--xpos;
putPiece();
}
ksmiletris'GameWidget::keyRight() (./kdegames/ksmiletris/gamewidget.cpp:351)
void GameWidget::keyRight()
{
if (!in_game || in_pause || xpos == scr_width - 2) return;
getPiece();
if ((piece[0] != bg_sprite && ref(xpos + 1, ypos + 0) != bg_sprite)
|| (piece[1] != bg_sprite && ref(xpos + 2, ypos + 0) != bg_sprite)
|| (piece[2] != bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)
|| (piece[3] != bg_sprite && ref(xpos + 2, ypos + 1) != bg_sprite)) {
putPiece();
return;
}
++xpos;
putPiece();
}
ksmiletris'GameWidget::keySpace() (./kdegames/ksmiletris/gamewidget.cpp:368)
void GameWidget::keySpace()
{
if (!in_game || in_pause || fast_mode) return;
fast_mode = true;
timer->changeInterval(50);
}
ksmiletris'GameWidget::broke() (./kdegames/ksmiletris/gamewidget.cpp:375)
void GameWidget::broke(int x, int y, bool *xmap)
{
xmap[y*scr_width + x] = true;
if (ref(x, y) >= Sprite_Broken1) {
// Clear the piece
playSound(Sound_Clear);
ref(x, y) = Sprite_Cleared;
num_points += 20;
} else {
// Break the piece
playSound(Sound_Break);
ref(x, y) = (Sprite)(Sprite_Broken1 + ref(x, y) - Sprite_Block1);
num_points += 10;
}
int level = num_points / 1000 + 1;
if (level > num_level) {
num_level = level;
num_pieces_level = (num_level/2 + 2) > num_blocks ?
num_blocks : num_level/2 + 2;
timer_interval = timer_interval - 25;
if (timer_interval < 50)
timer_interval = 50;
timer->changeInterval(timer_interval);
}
emit changedStats(num_level, num_points);
#ifdef HAVE_USLEEP
screen->repaint(false);
usleep(75 * 1000);
#endif
}
ksmiletris'GameWidget::recBroke() (./kdegames/ksmiletris/gamewidget.cpp:408)
void GameWidget::recBroke(int x, int y, bool *xmap)
{
int t = type(ref(x, y));
broke(x, y, xmap);
// X-1, Y
if (x > 0 && !xmap[y*scr_width + x - 1] && type(ref(x-1, y)) == t)
recBroke(x-1, y, xmap);
// X+1, Y
if (x < scr_width-1 && !xmap[y*scr_width + x + 1] && type(ref(x+1, y)) == t)
recBroke(x+1, y, xmap);
// X, Y-1
if (y > 0 && !xmap[(y-1)*scr_width + x] && type(ref(x, y-1)) == t)
recBroke(x, y-1, xmap);
// X, Y+1
if (y < scr_height-1 && !xmap[(y+1)*scr_width + x] && type(ref(x, y+1)) == t)
recBroke(x, y+1, xmap);
// X-1, Y+1
if (x > 0 && y < scr_height-1 && !xmap[(y+1)*scr_width + x - 1] && type(ref(x-1, y+1)) == t)
recBroke(x-1, y+1, xmap);
// X+1, Y+1
if (x < scr_width-1 && y < scr_height-1 && !xmap[(y+1)*scr_width + x + 1] && type(ref(x+1, y+1)) == t)
recBroke(x+1, y+1, xmap);
// X-1, Y-1
if (x > 0 && y > 0 && !xmap[(y-1)*scr_width + x - 1] && type(ref(x-1, y-1)) == t)
recBroke(x-1, y-1, xmap);
// X+1, Y-1
if (x < scr_width-1 && y > 0 && !xmap[(y-1)*scr_width + x + 1] && type(ref(x+1, y-1)) == t)
recBroke(x+1, y-1, xmap);
}
ksmiletris'GameWidget::checkSolePiece() (./kdegames/ksmiletris/gamewidget.cpp:440)
void GameWidget::checkSolePiece(int x, int y, bool *xmap)
{
if (y < scr_height-1 && type(ref(x, y+1)) == type(ref(x, y)))
recBroke(x, y, xmap);
}
ksmiletris'GameWidget::checkPiece() (./kdegames/ksmiletris/gamewidget.cpp:446)
void GameWidget::checkPiece(int x, int y)
{
bool xmap[scr_width * scr_height];
for (int yy = 0; yy < scr_height; ++yy)
for (int x = 0; x < scr_width; ++x)
xmap[yy*scr_width + x] = false;
checkSolePiece(x, y, xmap);
}
ksmiletris'GameWidget::compact() (./kdegames/ksmiletris/gamewidget.cpp:455)
void GameWidget::compact()
{
recheck:
bool moved = true;
while (moved) {
moved = false;
for (int x = 0; x < scr_width; ++x)
for (int y = scr_height - 1; y > 0; --y)
if (ref(x, y) == bg_sprite
|| ref(x, y) == Sprite_Cleared) {
int i;
for (i = y-1; i >= 0; --i)
if (ref(x, i) != bg_sprite
&& ref(x, i) != Sprite_Cleared) {
ref(x, y) = ref(x, i);
ref(x, i) = bg_sprite;
moved = true;
checkPiece(x, y);
goto recheck;
break;
}
if (i < 0)
ref(x, y) = bg_sprite;
}
}
}
ksmiletris'GameWidget::blockPiece() (./kdegames/ksmiletris/gamewidget.cpp:482)
void GameWidget::blockPiece()
{
if (fast_mode) {
timer->changeInterval(timer_interval);
fast_mode = false;
}
putPiece();
bool xmap[scr_width * scr_height];
for (int yy = 0; yy < scr_height; ++yy)
for (int x = 0; x < scr_width; ++x)
xmap[yy*scr_width + x] = false;
if (piece[2] != bg_sprite)
checkSolePiece(xpos, ypos+1, xmap);
if (piece[3] != bg_sprite)
checkSolePiece(xpos+1, ypos+1, xmap);
if (piece[2] == bg_sprite)
checkSolePiece(xpos, ypos, xmap);
if (piece[3] == bg_sprite)
checkSolePiece(xpos+1, ypos, xmap);
compact();
nextPiece();
}
ksmiletris'GameWidget::timeout() (./kdegames/ksmiletris/gamewidget.cpp:505)
void GameWidget::timeout()
{
if (!in_game || in_pause)
return;
getPiece();
if (ypos == scr_height - 2) {
blockPiece();
return;
}
if ((piece[0] != bg_sprite && ref(xpos + 0, ypos + 1) != bg_sprite)
|| (piece[1] != bg_sprite && ref(xpos + 1, ypos + 1) != bg_sprite)
|| (piece[2] != bg_sprite && ref(xpos + 0, ypos + 2) != bg_sprite)
|| (piece[3] != bg_sprite && ref(xpos + 1, ypos + 2) != bg_sprite))
blockPiece();
else {
++ypos;
putPiece();
}
}