QTimer更换?

时间:2018-01-26 17:08:23

标签: c++ qt

我目前正在尝试制作蛇游戏以了解有关QT&amp ;;的更多信息。但是当我尝试自动移动我的QGraphicsRectItem项时,它会改变速度。 我的问题是有更好的方法在没有QTimer的情况下自动移动项目吗?

这是我的PressKeyEvent方法:

if(event->key()==Qt::Key_Left)
{
    setPos(x()-10,y());
    left=true;
}
else if(event->key()==Qt::Key_Right)
{
    setPos(x()+10,y());
    right=true;
}
if(event->key()==Qt::Key_Up)
{
    setPos(x(),y()-10);
    up=true;

}
if(event->key()==Qt::Key_Down)
{
    setPos(x(),y()+10);
    down=true;
}

    QTimer* timer=new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(move()));
    timer->start(10000);}

以下是The Move方法:

void Player::move()
{
    if(up==true)
    {
        setPos(x(),y()-10);
    }
    else if(down==true)
    {
        setPos(x(),y()+10);
    }
    else if(right==true)
    {
        setPos(x()+10,y());
    }
    else if(left==true)
    {
        setPos(x()-10,y());
    }
}

1 个答案:

答案 0 :(得分:2)

您在QTimer中创建的PressKeyEvent()是动态分配。它存在,直到你明确销毁它。

您为每次按键开始新的QTimer,但不会销毁先前创建的QTimer(s)。因此,对于每个按键(在理想世界中),蛇的速度将大致加倍。

正确的设计是只有一个QTimer。只做一个连接。

Constructor()
{
    QTimer* timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(move()));
    timer->start(10000);
}

PressKeyEvent(){
if(event->key()==Qt::Key_Left)
{
    setPos(x()-10,y());
    left=true;
}
else if(event->key()==Qt::Key_Right)
{
    setPos(x()+10,y());
    right=true;
}
if(event->key()==Qt::Key_Up)
{
    setPos(x(),y()-10);
    up=true;

}
if(event->key()==Qt::Key_Down)
{
    setPos(x(),y()+10);
    down=true;
}
}

void Player::move()
{
    if(up==true)
    {
        setPos(x(),y()-10);
    }
    else if(down==true)
    {
        setPos(x(),y()+10);
    }
    else if(right==true)
    {
        setPos(x()+10,y());
    }
    else if(left==true)
    {
        setPos(x()-10,y());
    }
}

另一种方法

如果您希望在第一次按键时开始游戏,则可以在课程中初始化bool并在代码中包含条件:

PressKeyEvent()
{
if(event->key()==Qt::Key_Left)
{
    setPos(x()-10,y());
    left=true;
}
else if(event->key()==Qt::Key_Right)
{
    setPos(x()+10,y());
    right=true;
}
if(event->key()==Qt::Key_Up)
{
    setPos(x(),y()-10);
    up=true;

}
if(event->key()==Qt::Key_Down)
{
    setPos(x(),y()+10);
    down=true;
}
if (!gameStarted){
    gameStarted = true;
    QTimer* timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(move()));
    timer->start(10000);
    }
}