繁体   English   中英

QTimer更换?

[英]QTimer replacement?

我目前正在尝试制作蛇类游戏以了解有关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);}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM