QTimer replacement?

QTimer replacement?

本文关键字:replacement QTimer      更新时间:2023-10-16

im目前正在尝试制作一个贪吃蛇游戏以了解有关QT和C ++的更多信息,但是当我尝试自动移动QGraphicsRectItem Item时,它会改变速度。我的问题有没有更好的方法可以在没有QTimer的情况下自动移动项目?

这是我的按键事件方法:

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

这是 移动 方法:

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

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

您每次按键都会启动一个新QTimer,但不会破坏以前创建的QTimer。因此,每次按键(在理想世界中(蛇的速度大约会翻倍。

正确的设计是只有一个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);
    }
}