Also, hier mal ne kleine Zusammenfassung was die files sind:
Gameboard: 'Master Widget', erbt von QWidget; sorgt dafür das der rest gezeichnet wird (Ball und Paddle)
Ball: Der Ball, erbt von QObject
Paddle: Das Paddle, erbt auch von QObject
Hier mal die einzelnen Zeichenpassagen:
paintEvent vom Gameboard:
Code: Alles auswählen
void Gameboard::paintEvent(QPaintEvent *)
{
QPainter painter(this);
if(mGameOver)
{
painter.setPen(Qt::red);
painter.setFont(QFont("Courier", 48, QFont::Bold));
painter.drawText(rect(), Qt::AlignCenter, tr("Game Over"));
}
mainPaddle->redraw(painter);
// mBrick1->paintBrick(painter);
Ball1->redraw(painter);
painter.setFont(QFont("Courier", 12, QFont::Bold));
painter.drawText(width() - 100, height() - 100, QString::number(++mPaintedFrames));
}
Hier der redraw vom Paddle:
Code: Alles auswählen
void Paddle::redraw(QPainter &painter)
{
painter.save();
painter.translate(0, parentGameboard->height()); //because we 'translated' the cosy...
mPaddleCenterPoint.setY(mPaddleCenterPoint.y() - parentGameboard->height()); //...we need to change the y point!
painter.setBrush(Qt::white);
if(mPaddleCenterPoint.y() < - 25)
mPaddleCenterPoint.setY( - 25);
else if(mPaddleCenterPoint.y() > -5)
mPaddleCenterPoint.setY(-5);
if(mPaddleCenterPoint.x() < (mPaddle().width()/2)-1)
mPaddleCenterPoint.setX((mPaddle().width()/2)-1);
else if(mPaddleCenterPoint.x() > parentGameboard->width()-(mPaddle().width()/2)-1)
mPaddleCenterPoint.setX(parentGameboard->width()-(mPaddle().width()/2)-1);
painter.drawRect(mPaddle());
painter.restore();
}
Hier der redraw vom Ball:
Code: Alles auswählen
void Ball::redraw(QPainter &painter)
{
painter.save();
painter.translate(0, parentGameboard->height());
painter.setBrush(Qt::white);
painter.drawPie(mBall(), 0, 16 * 360);
painter.restore();
}
Dann... gibts eine Funktion namens moveBall() die alle 5 msec aufgerufen wird und die nächste Position des balls berechnet (dementsprechend wird alle 5 msec das bild neu gezeichnet):
Code: Alles auswählen
void Ball::moveBall()
{
float x = x_vel * parentGameboard->width() / 300;
float y = y_vel * parentGameboard->height() / 300;
QRegion region(mBall());
mBallCenterPoint = QPoint(mBallCenterPoint.x() + qRound(x), (mBallCenterPoint.y() - qRound(y)));
//Hier sind seeeeehr viele Kolisionsabfragen(vlt 15 else-if), aber laut //irgendeiner winapi funktion dauert es 0 ms... (irgendwas mit GetTickCount() oder so); ich glaub aber nicht, dass es zu viel abfragen //sind, da es im kleinen fenster ja auch geht, und im großen fenster wird die funktion ja auch nicht öfters aufgerufen / hat ja auch nicht mehr zu tun...
region.unite(mBall());
emit regionUpdate(region);//ein signal das mit update(QRegion &) //vom Gameboard aufruft.
}
Dann noch die Funktion, die das Paddle dahinsetzt wo der mauscurser ist:
Code: Alles auswählen
void Paddle::setPaddleCenterPoint(const QPoint &nPoint, const int &gameStarted)
{
if(mPaddleCenterPoint != nPoint)
{
QRegion region(mPaddle());
mPaddleCenterPoint = nPoint;
region.unite(mPaddle());
emit regionUpdate(region); //the changed region is updated
}
}
Sollt ich dir regionen vlt 'fest' einbauen? Die werden ja jetzt jedesmal neu erstellt, oder?!
Soll ich euch vlt auch mal die EXE + sources hochladen?