首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTimer替换?

QTimer替换?
EN

Stack Overflow用户
提问于 2018-01-26 17:08:22
回答 1查看 530关注 0票数 0

我目前正试图制作一个蛇游戏来了解更多关于QT & c++的知识,但是当我尝试自动移动我的QGraphicsRectItem项目时,它会改变速度。我的问题是,在没有QTimer的情况下,是否有更好的方法来自动移动项目?

这是我的PressKeyEvent方法:

代码语言:javascript
复制
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);}

以下是移动方法:

代码语言:javascript
复制
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());
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-26 17:40:00

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

您将为每个键按下启动一个新的QTimer,但不会破坏先前创建的QTimer。因此,在一个理想的世界里,每按一次键,蛇的速度就会增加一倍。

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

代码语言:javascript
复制
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,并在代码中有一个条件:

代码语言:javascript
复制
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);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48466190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档