Qt 从 QGraphicsItem 调用 class

Qt call a class from a QGraphicsItem

好吧,我正在用 Qt 创建塔防游戏。 所以我的塔正在大喊并产生一颗子弹 class。 在这颗子弹中 class 周围有一个多边形,可以让我检测是否有敌人接触到子弹:

QList<QGraphicsItem*> colliding_items=collidingItems();
for(int i=0,n=colliding_items.size();i<n;i++){
    if(typeid(*(colliding_items[i]))==typeid(Enemy))
    {
     //<------------ HERE ?
     scene()->removeItem(this);
     delete this;
     return;
    }
}

我在头文件 Enemy.h 中创建了一个名为 receiveDamage(int damage):

的函数
void Enemy::reciveDamage(int damage){
    m_health -= damage;
    if(m_health <= 0){
       game->scene->removeItem(this);
       delete this;
       return;
    }
}

Ennemy.h的内容:

#ifndef ENEMY_H
#define ENEMY_H

#include <QGraphicsPixmapItem>
#include <QObject>
#include <QList> // list << element
#include <QPointF>

class Enemy: public QObject, public QGraphicsPixmapItem{
    Q_OBJECT
public:
    Enemy(QGraphicsItem * parent=0);
    void rotateToPoint(QPointF p);
    void reciveDamage(int damage);
public slots:
    void move_forward();
private:
    QList<QPointF> points;
    QPointF dest;
    int point_index;
    int m_speed = 2;
    int m_health = 100;
};

#endif // ENEMY_H

但我不知道如何在上面的代码中调用它,有什么想法吗?

是的,只需 dynamic_castqobject_castQGraphicsItem 转换为 Enemy class 并在其上调用 getDamage

如果我假设伤害量是由名为 sendDamage 的方法给出的,代码可能如下所示:

QList<QGraphicsItem*> colliding_items=collidingItems();
for(int i=0, n=colliding_items.size(); i<n; i++){
    if(typeid(*(colliding_items[i])) == typeid(Enemy))
    {
        Enemy* enemy = qobject_cast<Enemy*> (colliding_items[i]);
        if (enemy)
        {
            enemy->getDamage(this->sendDamage());
        }
        scene()->removeItem(this);
        delete this;
        return;
    }
}