You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
5.2 KiB
177 lines
5.2 KiB
/****************************************************************************
|
|
**
|
|
** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
|
|
**
|
|
** This file is part of an example program for Qt. This example
|
|
** program may be used, distributed and modified without limitation.
|
|
**
|
|
*****************************************************************************/
|
|
|
|
#include "qtetrix.h"
|
|
#include <qapplication.h>
|
|
#include <qlabel.h>
|
|
#include <qdatetime.h>
|
|
|
|
|
|
void drawTetrixButton( QPainter *p, int x, int y, int w, int h,
|
|
const QColor *color, QWidget *widg)
|
|
{
|
|
if ( color ) {
|
|
QPointArray a;
|
|
a.setPoints( 3, x,y+h-1, x,y, x+w-1,y );
|
|
p->setPen( color->light() );
|
|
p->drawPolyline( a );
|
|
a.setPoints( 3, x+1,y+h-1, x+w-1,y+h-1, x+w-1,y+1 );
|
|
p->setPen( color->dark() );
|
|
p->drawPolyline( a );
|
|
x++;
|
|
y++;
|
|
w -= 2;
|
|
h -= 2;
|
|
p->fillRect( x, y, w, h, *color );
|
|
}
|
|
else if(widg) {
|
|
widg->erase(x, y, w, h);
|
|
} else {
|
|
p->fillRect(x, y, w, h, p->backgroundColor());
|
|
}
|
|
}
|
|
|
|
|
|
ShowNextPiece::ShowNextPiece( QWidget *parent, const char *name )
|
|
: QFrame( parent, name )
|
|
{
|
|
setFrameStyle( QFrame::Panel | QFrame::Sunken );
|
|
xOffset = -1; // -1 until first resizeEvent.
|
|
}
|
|
|
|
void ShowNextPiece::resizeEvent( QResizeEvent *e )
|
|
{
|
|
QSize sz = e->size();
|
|
blockWidth = (sz.width() - 3)/5;
|
|
blockHeight = (sz.height() - 3)/6;
|
|
xOffset = (sz.width() - 3)/5;
|
|
yOffset = (sz.height() - 3)/6;
|
|
}
|
|
|
|
|
|
void ShowNextPiece::paintEvent( QPaintEvent * )
|
|
{
|
|
QPainter p( this );
|
|
drawFrame( &p );
|
|
p.end(); // explicit end() so any slots can paint too
|
|
emit update();
|
|
}
|
|
|
|
|
|
void ShowNextPiece::drawNextSquare(int x, int y,QColor *color)
|
|
{
|
|
if (xOffset == -1) // Before first resizeEvent?
|
|
return;
|
|
|
|
QPainter paint;
|
|
paint.begin(this);
|
|
drawTetrixButton( &paint, xOffset+x*blockWidth, yOffset+y*blockHeight,
|
|
blockWidth, blockHeight, color, this );
|
|
paint.end();
|
|
}
|
|
|
|
|
|
QTetrix::QTetrix( QWidget *parent, const char *name )
|
|
: QWidget( parent, name )
|
|
{
|
|
QTime t = QTime::currentTime();
|
|
TetrixPiece::setRandomSeed( (((double)t.hour())+t.minute()+t.second())/
|
|
(24+60+60) );
|
|
|
|
#define ADD_LABEL( str, x, y, w, h ) \
|
|
{ QLabel *label = new QLabel(str,this); \
|
|
label->setGeometry(x,y,w,h); \
|
|
label->setAlignment(AlignCenter|AlignVCenter); }
|
|
|
|
ADD_LABEL( "NEXT", 50, 10, 78, 30 );
|
|
ADD_LABEL( "SCORE", 330, 10, 178, 30 );
|
|
ADD_LABEL( "LEVEL", 50, 130, 78, 30 );
|
|
ADD_LABEL( "LINES REMOVED", 330, 130, 178, 30 );
|
|
|
|
board = new QTetrixBoard(this);
|
|
showNext = new ShowNextPiece(this);
|
|
#ifndef QT_NO_LCDNUMBER
|
|
showScore = new QLCDNumber(5,this);
|
|
showLevel = new QLCDNumber(2,this);
|
|
showLines = new QLCDNumber(5,this);
|
|
#else
|
|
showScore = new QLabel("0",this);
|
|
showLevel = new QLabel("0",this);
|
|
showLines = new QLabel("0",this);
|
|
showScore->setAlignment(AlignCenter);
|
|
showLines->setAlignment(AlignCenter);
|
|
showLevel->setAlignment(AlignCenter);
|
|
showScore->setFrameStyle(QFrame::Sunken|QFrame::Box);
|
|
showLines->setFrameStyle(QFrame::Sunken|QFrame::Box);
|
|
showLevel->setFrameStyle(QFrame::Sunken|QFrame::Box);
|
|
#endif
|
|
quitButton = new QPushButton("&Quit",this);
|
|
startButton = new QPushButton("&New Game",this);
|
|
pauseButton = new QPushButton("&Pause",this);
|
|
|
|
// Don't let the buttons get keyboard focus
|
|
quitButton->setFocusPolicy( QWidget::NoFocus );
|
|
startButton->setFocusPolicy( QWidget::NoFocus );
|
|
pauseButton->setFocusPolicy( QWidget::NoFocus );
|
|
|
|
connect( board, SIGNAL(gameOverSignal()), SLOT(gameOver()) );
|
|
connect( board, SIGNAL(drawNextSquareSignal(int,int,QColor*)), showNext,
|
|
SLOT(drawNextSquare(int,int,QColor*)) );
|
|
connect( showNext, SIGNAL(update()), board, SLOT(updateNext()) );
|
|
#ifndef QT_NO_LCDNUMBER
|
|
connect( board, SIGNAL(updateScoreSignal(int)), showScore,
|
|
SLOT(display(int)) );
|
|
connect( board, SIGNAL(updateLevelSignal(int)), showLevel,
|
|
SLOT(display(int)));
|
|
connect( board, SIGNAL(updateRemovedSignal(int)), showLines,
|
|
SLOT(display(int)));
|
|
#else
|
|
connect( board, SIGNAL(updateScoreSignal(int)), showScore,
|
|
SLOT(setNum(int)) );
|
|
connect( board, SIGNAL(updateLevelSignal(int)), showLevel,
|
|
SLOT(setNum(int)));
|
|
connect( board, SIGNAL(updateRemovedSignal(int)), showLines,
|
|
SLOT(setNum(int)));
|
|
#endif
|
|
connect( startButton, SIGNAL(clicked()), board, SLOT(start()) );
|
|
connect( quitButton , SIGNAL(clicked()), SLOT(quit()));
|
|
connect( pauseButton, SIGNAL(clicked()), board, SLOT(pause()) );
|
|
|
|
board->setGeometry( 150, 20, 153, 333 );
|
|
showNext->setGeometry( 50, 40, 78, 94 );
|
|
showScore->setGeometry( 330, 40, 178, 93 );
|
|
showLevel->setGeometry( 50, 160, 78, 93 );
|
|
showLines->setGeometry( 330, 160, 178, 93 );
|
|
#ifndef QT_NO_LCDNUMBER
|
|
showScore->display( 0 );
|
|
showLevel->display( 0 );
|
|
showLines->display( 0 );
|
|
#else
|
|
showScore->setNum( 0 );
|
|
showLevel->setNum( 0 );
|
|
showLines->setNum( 0 );
|
|
#endif
|
|
startButton->setGeometry( 46, 288, 90, 30 );
|
|
quitButton->setGeometry( 370, 265, 90, 30 );
|
|
pauseButton->setGeometry( 370, 310, 90, 30 );
|
|
board->revealNextPiece(TRUE);
|
|
|
|
resize( 550, 370 );
|
|
}
|
|
|
|
void QTetrix::gameOver()
|
|
{
|
|
}
|
|
|
|
|
|
void QTetrix::quit()
|
|
{
|
|
qApp->quit();
|
|
}
|