【发布时间】:2016-05-22 22:00:41
【问题描述】:
我正在创建一个游戏,我有一个指向英雄对象的指针数组。一次只能激活一个英雄,所以我有一个单独的指向激活英雄的指针。 如果重要的话,我使用的是 Qt,并且 Hero 类继承自 QgraphicsItem。
能够在英雄之间切换很重要,因此我编写了以下代码:
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 newer 变回原来的对象。
英雄对象数组是游戏类的成员,并在游戏对象的构造函数中初始化。唯一一次引用 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(); 场景->addItem(英雄[0]); 英雄[0]->setPos(5,1200); // activeHero = hero[0]; 英雄[1] = 新英雄(); 英雄[1]->setFlag(QGraphicsItem::ItemIsFocusable); 英雄[1]->setFocus(); 场景->addItem(英雄[1]); 英雄[1]->setPos(10,1300); activeHero = hero[0];
setView() 方法检查活动英雄是否在视图中,如果不在,它会移动视图以使活动英雄位于相对于视图的正确位置。
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。
【问题讨论】:
-
这里没有足够的信息来解决问题。请告诉我们
activeHero和hero数组是在哪里声明(和初始化)的,并记下这些变量可能发生的任何其他重大变化。