2012-03-02 8 views
0

ちょっと私はdirectXとC++を使って簡単なゲームをプログラミングしています。単純なゲームをプログラミングする

私は現在、8人のエイリアンの配列を持っています。私は現在、このコードを左から右に移動し、行の下に移動します。

bool turnaround=false; 
if ((Aliens[0].pos.x<-5 & Aliens[0].vel.x<0)|(Aliens[3].pos.x>5&Aliens[3].vel.x>0)) 
{ 
    turnaround=true; 
    if(Aliens[0].vel.x<0) 
     Aliens[0].animCtrl->SetTrackSpeed(0,1); 
    else 
     Aliens[0].animCtrl->SetTrackSpeed(0,-1); 
} 

しかし、これは現在、左または右にものが破壊されている場合は(彼らは誰もがif文またはネストの場合を考え出すことができる場合、私は思っていた変数Aliens[i].dead = true

によって破壊され、短いそれらを停止します遠い破壊され、左または右のものは全体のさらなる行けば言うために必要:ところで/

感謝:)

+3

論理OR( '||')ではなくビット単位のOR( '|')を使用していますか?私はあなたがいるとは思わない。また... 'ベクトル'はあなたの友人です:) –

+0

バイナリ '|'と '&'演算子、または論理 '||'と '&&'を使用することを意味しますか? – sholsapp

+0

あなたのコードにはいくつかの問題があります。なぜforループを 'Alien'リストに対して繰り返し使用していないのですか?そのようなリストから単に削除するのではなく、なぜ '.dead'属性を使用していますか? – kaoD

答えて

2

。ここでは、現在(擬似コードの形で)持っているものよりも良いかもしれません、このアプローチする一つの方法のようになります。

For each alien: 
    If alien is currently on an odd row: 
    Set direction to left 
    If alien x position is near 0: 
     Set direction to down 
    Else 
    Set direction to right 
    If alien x position is near screen width: 
     Set direction to down 

これは、外国人が行による画面の行の底部に向かって下方に移動させる必要があります。 (もちろん、このタイプのゲームではエイリアンが取れるさまざまな編成がありますが、これは単なるものです)。彼らが殺されたときにどのような振る舞いをしたいのかはっきりしていません(「もっと遠くに行く」というのは曖昧です、これはプレイヤーか何人かの宇宙人ですか、何ですか?私はここでさらにアドバイスを貸すことができるかもしれません。

あなたのデザインを1分間再考することをお勧めします。あなたは8人のエイリアンを保持する固定サイズの配列のように見えます。これにより、特定のレベルを構築することが可能になるかもしれませんが、非常に限定的なものになる可能性があります。別のレベルで12人の外国人が欲しいのであればどうしますか? Aliensアレイをstd::vectorに変更することをお勧めします。そうすれば、好きなだけレベルに追加できます。さらに、同じプロパティを共有する敵のタイプが異なる場合、これらの敵すべてが継承するスーパークラスCEnemyを作成することができます。これにより、より堅牢で拡張性の高い設計が可能になります。

また、ビット演算ではなく、ANDまたはOR演算を実行する場合は、すでに他の演算子で述べたように、論理演算子を使用します。 (すなわち、|などの代わりに||を使用してください)2つの間には重要な違いがあります。

+0

ありがとうございました:) –

1

、あなたは(論理演算子を使用しての習慣に&&を取得する必要がありますと||)のようなもののためのビット演算子の代わりに。それらは短絡のためにより効率的でなければならず、後に道路のバグを防ぐ。

本当の質問に答えるのに十分な情報があるかどうかはわかりません。なぜあなたは0番目と3番目のエイリアンに手動でアクセスしていますか?あなたはどうやって外人が理想的に行動するようにしますか?

EDIT 1:このような

何かが動作するはずです:あなたはスペースインベーダータイプのゲームのいくつかの並べ替えを構築している私はあなたの質問から推測

Alien * furthestLeftAlien, * furthestRightAlien; 
/** here loop through your Aliens array to find 
    the furthest left and furthest right aliens **/ 
if(furthestLeftAlien->dead || furthestRightAlien->dead) 
{ 
    goFurtherAcross(): 
} 
+2

* furthestRightAlien ... * – Bingo

+0

@Bingoありがとうございました。私は同じ行に複数の変数を宣言することに問題があると思います。 –

+0

ありがとうございました:) –

0

本当に別のデータ構造を使用してください。 C++のstdライブラリには、いくつかの異なるコンテナクラスがあります。

たとえば、std :: dequeを使用すると、両端のアイテムを簡単に削除できます。

あなたが好きな死んだエイリアンを削除できます。

while (!Aliens.empty() && Aliens.front().is_dead()) Aliens.pop_front(); 
while (!Aliens.empty() && Aliens.back().is_dead()) Aliens.pop_back(); 

そして、上記のコードは行くだろう:

bool turnaround=false; 
if ((Aliens.front().pos.x<-5 && Aliens.front().vel.x<0) || (Aliens.back().pos.x>5 && Aliens.back().vel.x>0)) 
{ 
    turnaround=true; 
    if(Aliens.front().vel.x<0) 
     Aliens.front().animCtrl->SetTrackSpeed(0,1); 
    else 
     Aliens.front().animCtrl->SetTrackSpeed(0,-1); 
} 

正直に言うと、私はここにコードがに意味されるかどうかはわかりませんけど宇宙人の行全体を回る。折り返し変数を使う代わりに、if文の中でエイリアンを回すだけではどうですか?

+0

ありがとうございました:) –

関連する問題