• 7604阅读
  • 7回复

[提问]QT按键判断和碰撞检测的问题,紧急求助啊!!!3Q [复制链接]

上一主题 下一主题
离线q565467455
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-21
在写贪吃蛇, 发现QT按键判断不对劲啊。。。
已经弄好过滤器那些了, 但是如果快速按←↓→的话 (或者其他按的很快的情况) 就会出现比如本来向右 然后直接掉头向左 本来向左 直接掉头向右的情况。。。。这是为什么呢?


还有碰撞检测第一次可以检测成功 接下去就再也检测不了了 这是为什么。。。。求助!!!~~~万分感谢


下面是按键过滤器的代码和按键事件的代码。。。


bool CONTROLLER::eventFilter(QObject *object, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{ handleEvent((QKeyEvent *) event);
return true;
}
else
return QObject::eventFilter(object, event);
}


void CONTROLLER::handleEvent(QKeyEvent *keyEvent)
{
switch (keyEvent->key())
{
case Qt::Key_Left: Snake->setDirection(LEFT); break;
case Qt::Key_Right: Snake->setDirection(RIGHT); break;
case Qt::Key_Up: Snake->setDirection(UP); break;
case Qt::Key_Down: Snake->setDirection(DOWN); break;
}
离线q565467455

只看该作者 1楼 发表于: 2014-05-22
没人帮忙吗。。。。
离线dbzhang800

只看该作者 2楼 发表于: 2014-05-22
单纯这些代码看不出什么问题来

你是用的QGraphicsScene这套东西么?item的碰撞,需要有正确的 shape()
离线q565467455

只看该作者 3楼 发表于: 2014-05-22
回 dbzhang800 的帖子
dbzhang800:单纯这些代码看不出什么问题来
你是用的QGraphicsScene这套东西么?item的碰撞,需要有正确的 shape() (2014-05-22 10:23) 

是啊 用的就是这一个,    shape应该是不会错的啊 如果错了第一次碰撞应该不会触发才对啊。。。
离线dbzhang800

只看该作者 4楼 发表于: 2014-05-22
回 q565467455 的帖子
q565467455:是啊 用的就是这一个,    shape应该是不会错的啊 如果错了第一次碰撞应该不会触发才对啊。。。 (2014-05-22 10:28) 

第一次是对的,不代表之后还是对的,要取决于你的代码。

根据实现方式不同,boundingRect() 和 shape() 可以是固定的,也可以是变化的。

题外:
不少人刚开始都处理不好变化的 boundingRect() 和 shape()
离线q565467455

只看该作者 5楼 发表于: 2014-05-22
回 dbzhang800 的帖子
dbzhang800:第一次是对的,不代表之后还是对的,要取决于你的代码。
根据实现方式不同,boundingRect() 和 shape() 可以是固定的,也可以是变化的。
....... (2014-05-22 10:54) 

QRectF FOOD::boundingRect() const
{
    return QRectF(x, y, FOOD_SIZE, FOOD_SIZE);
}

QPainterPath FOOD::shape() const
{
    QPainterPath path;
//    path.setFillRule(Qt::WindingFill);
    path.addEllipse(x, y, FOOD_SIZE, FOOD_SIZE);
    return path;
}

void FOOD::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
//    painter->setPen(Qt::NoPen);
//    painter->setBrush(Qt::yellow);
//    painter->drawEllipse(x, y, FOOD_SIZE, FOOD_SIZE);

    painter->save();
    painter->fillPath(shape(), Qt::yellow);
    painter->restore();
}

这是食物shape  boundingRect 还有paint的代码, 麻烦您帮忙检查一下好吗?x y就是食物生成的坐标,后面两个是食物的宽和高,  我还给food设置了data,
#define GAME_DATA 5
#define FOOD_TYPE 1

bool SNAKE::handleCollisions()
{
    QList<QGraphicsItem *> collisions = collidingItems();

    foreach (QGraphicsItem *collidingItem, collisions)
    {
        if (collidingItem->data(GAME_DATA) == FOOD_TYPE)
            return true;
    }
    return false;
}
这是碰撞检测, 求帮忙看一下 万谢!
离线dbzhang800

只看该作者 6楼 发表于: 2014-05-22
你这儿,boundingRect() 和 shape() 中的 x,y这两个东西都是变量吧??

Manual中有这么一句话:

If you want to change the item's bounding rectangle, you must first call prepareGeometryChange()

题外:
你这儿x,y 都直接设置为0,通过pos() 来改变位置,会更简单。而且QGraphicsEllipseItem是现成可用的东西,你都不用自己写这个FOOD

离线q565467455

只看该作者 7楼 发表于: 2014-05-22
回 dbzhang800 的帖子
dbzhang800:你这儿,boundingRect() 和 shape() 中的 x,y这两个东西都是变量吧??
Manual中有这么一句话:
If you want to change the item's bounding rectangle, you must first call prepareGeometryChange()
....... (2014-05-22 11:38) 

原来是这样!!太感谢你了!!
快速回复
限100 字节
 
上一个 下一个