2016-05-22 7 views
-5

私はゲームを作成しています。私はヒーローオブジェクトへのポインタの配列を持っています。一度に1人のヒーローしかアクティブでなければならないので、私はアクティブなヒーローとは別のポインタを持っています。 重要な場合はQtを使い、HeroクラスはQgraphicsItemを継承します。ポインタが指しているオブジェクトをC++で指し示す

私が英雄の間で切り替えることが可能だということが重要であるので、私は次のコードを書いている:

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は新しいオブジェクトを元のオブジェクトに戻します。

ヒーローオブジェクトの配列はゲームクラスのメンバーであり、ゲームオブジェクトのコンストラクタで初期化されます。 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); hero [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()メソッドは、アクティブヒーローが表示されているかどうかをチェックし、アクティブヒーローがビューに対して正しい点にあるようにビューを移動します。

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); 
} 

最後に、フックオブジェクトは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方法の目的は、上記の方法で主人公[0]、及び主人公の間になるように[1]、それらの各々はactiveHeroされるスイッチです。

+6

ここでの問題を解決するためにほぼ十分な情報はありませんする必要があります。 'activeHero'と' hero'配列が宣言(初期化)されている場所を示し、これらの変数に起こりうる他の大きな変更を書き留めておいてください。 –

答えて

-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(); 
} 
+2

必ずしもそうではありません。 'hero [1] - > setFocus()'から 'hero'はポインタの配列になっています。そして、 'activeHero = hero [1];' activeHeroはポインタです。 エンティティセマンティクスでは、ヒーローは*ユニーク*オブジェクトで表され、そのアドレスで識別できます。ヒーロー[0]はそのようなアドレスです。 –

関連する問題