void BoxGroup::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case Qt::Key_Down :
        moveBy(0, 20);
        if (isColliding()) {
            moveBy(0, -20);

            // 将小方块从方块组中移除到场景中
            clearBoxGroup();

            // 需要显示新的方块
            emit needNewBox();
        }
        break;

    case Qt::Key_Left :
        moveBy(-20, 0);
        if (isColliding())
            moveBy(20, 0);
        break;

    case Qt::Key_Right :
        moveBy(20, 0);
        if (isColliding())
            moveBy(-20, 0);
        break;

    case Qt::Key_Up :
        rotate(90);
        if(isColliding())
            rotate(-90);
        break;

    // 空格键实现坠落
    case Qt::Key_Space :
        moveBy(0, 20);
        while (!isColliding()) {
            moveBy(0, 20);
        }
        moveBy(0, -20);
        clearBoxGroup();
        emit needNewBox();
        break;
    }
}
Beispiel #2
0
GameView::GameView()
{
    scene = new QGraphicsScene;
    snake = new Snake;
    addItems();
    setScene(scene);
    score = 0;

    connect(this,SIGNAL(keyPress(QKeyEvent*)),
            snake,SLOT(keyPressEvent(QKeyEvent*)));
    connect(snake,SIGNAL(addandDelBox(OneBox*,OneBox*)),
            this,SLOT(changedItem(OneBox*,OneBox*)));
    connect(snake,SIGNAL(needNewBox()),this,SLOT(needNewBox()));
    connect(snake,SIGNAL(gameEnd()),this,SLOT(endGame()));

    //添加边界线,进行碰撞检测
    QGraphicsLineItem *topLineItem =new QGraphicsLineItem(-20,-20,820,-20);
    QGraphicsLineItem *leftLineItem = new QGraphicsLineItem(-20,-20,-20,620);
    QGraphicsLineItem *buttonLineItem = new QGraphicsLineItem(-20,620,820,620);
    QGraphicsLineItem *rightLineItem = new QGraphicsLineItem(820,-20,820,620);
    scene->addItem(topLineItem);
    scene->addItem(leftLineItem);
    scene->addItem(buttonLineItem);
    scene->addItem(rightLineItem);

//设置窗口大小,不可改变
    setMinimumSize(802, 602);
    setMaximumSize(802, 602);

    scene->setSceneRect(0,0,800,600);
//    setSceneRect(0,0,800,600);
//    setSceneRect(0,0,800,600);

    setBackgroundBrush(Qt::black);
    needNewBox();
}