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();

}