【发布时间】:2015-08-13 22:19:41
【问题描述】:
我正在用球在 QT 中编写物理模拟,这是我用来检测球之间碰撞的碰撞检测。
bool Ball:: circCollide(QList <QGraphicsItem *> items) {
QPointF c1 = mapToScene( this->boundingRect().center());
// qDebug() << "c1x" << c1.x();
// qDebug() << "c1y" << c1.y();
// qDebug() << "Listcount3: " << scene()->collidingItems(this).count();
foreach (QGraphicsItem * t, items) {
// qDebug() << "Classname: " << typeid(t).name();
// if (typeid(t).name() == "Ball")
if ( t->boundingRect().width()<200)
{
double distance = QLineF(c1,mapToScene( t->boundingRect().center())).length();
// qDebug() << "tx" << mapToScene(t->boundingRect().center()).x();
// qDebug() << "ty" << mapToScene (t->boundingRect().center()).y();
double radius1 = this->boundingRect().width() / 2;
double radius2 = t->boundingRect().width() / 2;
double radii = radius1 + radius2;
// qDebug () << "distance radius1: " << radius1;
// qDebug () << "distance radius2: " << radius2;
// qDebug () << "distance :" << distance;
if ( distance <= radii )
{
// qDebug() << "true collision";
return true;
}
}
}
// qDebug() << "false collision";
return false;
}
现在我有一个问题,当它们与我的墙壁发生碰撞时,有时也需要这样做。 这些球有我自己制作并继承自 QGraphicsItem 的 Class Ball, 而墙壁有 QLineF 类,它也继承自 Qgraphicsitem。有什么好方法可以确定对象“t”是否属于 Ball 类? 我已经试过了
typeid(t).name()
但这两个类的返回值相同 (P13QGraphicsItem)。
此外,我在开头提供的列表包含与该项目冲突的所有对象,因此我必须为其提供 QGraphicsItems 列表。
【问题讨论】:
-
QLineF是一个现有的 Qt 类,它带有四个qreal值。它并非源自QGraphicsItem。你说的墙是什么等级的?为什么不能将dynamic_cast用于派生类型并以这种方式进行验证?说dynamic_cast<Ball*>(...)或dynamic_cast<Wall*>(...)。