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