Witajcie! Tworzę grę typu Arkanoid w Qt, do poruszania piłką i paletką służą timery. Gdy timer jest uruchamiany dla piłki przy starcie, wszystko jest okej - piłka rusza i odbija się prawidłowo. Problem występuje gdy wywołuję timer.start() przy użyciu QKeyEvent - piłka nie drgnie, choć dzięki qDebug() widać, że jej koordynaty się zmieniają, a nawet rośnie liczba punktów gdy koliduje ona z cegiełkami (choć te nie znikają, tak jak powinny). Probowałem na na prawdę wiele sposobów. Jakieś wskazówki?
Wybaczcie jeśli trochę zbyt dużo namieszałem zarówno w wyjaśnieniu jak i w kodzie, to mój pierwszy samodzielny projekt jakiejś gry i jeszcze trochę się gubię :P
Piłka dziedziczy z QGraphicsRectItem, paletka również.
player.cpp
#include <QKeyEvent>
#include <QGraphicsItem>
#include <QObject>
#include <QTimer>
#include "ball.h"
#include "player.h"
#include "view.h"
#include <typeinfo>
Player::Player(){
setRect(0,0,125,25);
setFlag(QGraphicsItem::ItemIsFocusable);
setFocus();
connect(&timer_left, SIGNAL(timeout()), this, SLOT(left()));
connect(&timer_right, SIGNAL(timeout()), this, SLOT(right()));
}
void Player::keyPressEvent(QKeyEvent *event){
switch(event -> key()){
case Qt::Key_Space:
View().world->ball->run();
break;
case Qt::Key_Left:
timer_right.stop();
timer_left.start(25);
break;
case Qt::Key_Right:
timer_left.stop();
timer_right.start(25);
break;
}
}
void Player::keyReleaseEvent(QKeyEvent *event){
switch(event -> key()){
case Qt::Key_Left:
timer_left.stop();
break;
case Qt::Key_Right:
timer_right.stop();
break;
}
}
void Player::left(){
if (pos().x() > 0){
setPos(x() - 20, y() );}
}
void Player::right(){
if (pos().x() + rect().width() < 800)
setPos(x() + 20, y() );
}
ball.cpp
#include <QTimer>
#include <QList>
#include <QGraphicsScene>
#include <QDebug>
#include <QList>
#include "ball.h"
#include "player.h"
#include "brick.h"
#include "view.h"
#include <typeinfo>
#include <cstdlib>
Ball::Ball(){
setRect(0,0,25,25);
connect(&timer, SIGNAL(timeout()),this,SLOT(move()));
}
int xx=-10;
int yy=-10;
void Ball::run(){
timer.start(20);
}
void Ball::move(){
QList<QGraphicsItem *> colliding = collidingItems();
for (int i=0, n=colliding.size(); i<n; ++i ){
if (typeid(*(colliding[i])) == typeid(Player)){
if (yy>0) yy=-yy;
}
if (typeid(*(colliding[i])) == typeid(Brick)){
points +=1;
float ball_upper = this->y();
float ball_lower = ball_upper+25;
float brick_upper = colliding[i]->y();
float brick_lower = brick_upper + 50;
float ball_left = this->x();
float ball_right = ball_left+25;
float brick_left = colliding[i]->x();
float brick_right = brick_left + 100;
/*
qDebug() << "ball_upper: " << ball_upper;
qDebug() << "ball_lower: " << ball_lower;
qDebug() << "ball_left: " << ball_left;
qDebug() << "ball_right: " << ball_right;
qDebug() << "brick_upper: " << brick_upper;
qDebug() << "brick_lower: " << brick_lower;
qDebug() << "brick_left: " << brick_left;
qDebug() << "brick_right: " << brick_right << endl;
*/
//piłka uderza od dołu
if ( abs(brick_lower-ball_upper)<11 && abs(ball_left-brick_right)>11 && abs(ball_right-brick_left)>11 ) yy=-yy;
//piłka uderza od góry
if ( abs(brick_upper-ball_lower)<11) yy=-yy;
//piłka uderza od prawej
if ( abs(ball_left-brick_right)<11 ) xx=-xx;
//piłka uderza od lewej
if ( abs(ball_right-brick_left)<11 ) xx=-xx;
qDebug() << "points: " << points;
if (points==18) timer.stop();
scene()->removeItem(colliding[i]);
delete colliding[i];
}
}
if (pos().x() <=0) xx=-xx;
if (pos().x() >= 800 - rect().width()) xx=-xx;
if (pos().y() <=0) yy=-yy;
setPos(x()+xx, y()+yy);
qDebug() << pos().x();
}