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_cast
或 qobject_cast
将 QGraphicsItem
转换为 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;
}
}
好吧,我正在用 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_cast
或 qobject_cast
将 QGraphicsItem
转换为 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;
}
}