我正在创建一个游戏,并且我有一系列指向英雄对象的指针。一次只能激活一个英雄,所以我有一个指向活动英雄的单独指针。 如果重要,我使用Qt,Hero类继承自QgraphicsItem。
重要的是我能够在Hero's之间切换,所以我写了下面这段代码:
void Game::toggleHero()
{
if(activeHero==hero[0])
{
activeHero =hero[1];
hero[1]->setFocus();
}
else if(activeHero == hero[1])
{
activeHero = hero[0];
hero[0]->setFocus();
}
}
问题是,该方法完成了我期望它做的事情,但只是第一次调用它。 activeHero更新程序将更改回原始对象。
Hero对象数组是游戏类的成员,并在游戏对象的构造函数中初始化。 activeHero唯一被引用的时间是添加钩子项目,或者调用setView()方法时。
class Game : public QGraphicsView
{
public:
Game();
Terrain *ground[63];
Wall *wall[63];
Ladder *ladder[63];
Bushes * bush;
QGraphicsScene * scene;
Hero *hero[1];
Hero *activeHero;
void buildLevel(int level);
void setView();
void toggleHero();
};
从游戏对象的构造函数: //添加英雄 英雄[0] =新英雄(); 英雄[0] - > setFlag(的QGraphicsItem :: ItemIsFocusable); 英雄[0] - >的setFocus(); scene->的addItem(英雄[0]); 英雄[0] - > setPos(5,1200); // activeHero = hero [0]; 英雄[1] =新英雄(); 英雄[1] - > setFlag(的QGraphicsItem :: ItemIsFocusable); 英雄[1] - >的setFocus(); scene->的addItem(英雄[1]); 英雄[1] - > setPos(10,1300); activeHero = hero [0];
setView()方法检查活动的英雄是否在视图中,如果它不移动视图,以便activeHero位于相对于视图的正确位置。
void Game::setView()
{
if((!(activeHero->pos().y()+activeHero- >rect().height()/2==sceneRect().y()+sceneRect().height()/2-400)&&((activeHero- >y()+activeHero->rect().height()/2-400>0))&&(activeHero->y()+activeHero->rect().height()-400<1600))){
setSceneRect(sceneRect().x(),activeHero->pos().y()+activeHero->rect().height()/2-400,800,600);
}
if((!(activeHero->pos().x()+activeHero->rect().width()/2==sceneRect().x()+sceneRect().width()/2))&&((activeHero->x()+activeHero->rect().width()-450>0)&&(activeHero->x()+activeHero->rect().width()+350<3200))){
setSceneRect(activeHero->pos().x()+activeHero->rect().width()/2-400,sceneRect().y(),800,600);
}
最后,Hook对象使用activeHero将自己定位在场景中。
Hook::Hook(int direction)
{
hookdirection = direction;
switch(hookdirection)
{
case -1:
{
setRect(0,0,16,16);
setPos(game->activeHero->pos());
break;
}
case 1:
{
setRect(0,0,16,16);
setPos(game->activeHero->pos().x()+game->activeHero->rect().width()- rect().width(),game->activeHero->pos().y());
break;
}
default:
{
setRect(0,0,16,16);
break;
}
}
timer = new QTimer;
connect(timer,SIGNAL(timeout()),this,SLOT(move()));
timer->start(10);
lineItem = new QGraphicsLineItem();
lineItem->setParentItem(this);
game->activeHero->scene()->addItem(lineItem);
}
toggleHero方法的目标是在hero [0]和hero [1]之间切换,以便它们中的每一个都是上述方法中的activeHero。
答案 0 :(得分:-1)
如果英雄是指针,则需要决定是否比较英雄(例如,通过名称与重载的运算符)或地址。所以它应该是:
if(*activeHero==hero[0])
{
*activeHero =hero[1];
hero[1]->setFocus();
}
else if(*activeHero == hero[1])
{
*activeHero = hero[0];
hero[0]->setFocus();
}
或者它应该是
if(activeHero==&hero[0])//address of hero[0]
{
activeHero =&hero[1];
hero[1]->setFocus();
}
else if(activeHero == &hero[1])
{
activeHero = &hero[0];
hero[0]->setFocus();
}