c++ - QTimer 替代品?

标签 c++ qt

我目前正在尝试制作蛇游戏以了解有关 QT 和 C++ 的更多信息,但是当我尝试自动移动我的 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);}

这是移动方法:

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

关于c++ - QTimer 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48466190/

相关文章:

c++ - 对 vkCreateInstance 的 undefined reference

c++ - 正确使用 _tcstod 并将 lpszEndChar 设置为 NULL 或不设置

c++ - 使 MFC 模态化(同步)

c++ - 将字符串转换为小部件名称 QT 5.6

c++ - 使用 Qt 进行音频信号处理 GUI 开发,如何?

qt - QGraphicsItem 验证位置更改

c++ - GLSL隔行扫描

c++ - 十六进制字符串到十六进制字符[]

c++ - 无法在 QImage 上绘制或更改像素的颜色

macos - 使用 Qt 框架在 MAC 上部署 Qt 应用程序