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