我目前正在尝试制作蛇游戏以了解有关QT&amp ;;的更多信息。但是当我尝试自动移动我的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);}
以下是The 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());
}
}
答案 0 :(得分:2)
您在QTimer
中创建的PressKeyEvent()
是动态分配。它存在,直到你明确销毁它。
您为每次按键开始新的QTimer
,但不会销毁先前创建的QTimer
(s)。因此,对于每个按键(在理想世界中),蛇的速度将大致加倍。
正确的设计是只有一个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);
}
}