2017-01-13 11 views
-2

私はスペースインベーダーのクローンをプログラミングしており、弾丸の作成には苦労しています。 Spaceをクリックするたびに、弾丸がベクターに追加され、ループを介して弾丸を移動したいと考えていますが、それを作成して適切な方法で処理する方法はわかりません。オブジェクトのベクトルを扱う方法は?

vector<Bullet> bullets(MAXBULLETS); 
int bulletcounter = 0; 
while (1) { 
    Sleep(10); 
    for (int i = 0; i < sizeof(bullets)-1; i++) { 
     bullets[i].Move(0, 1); 
    } 
    if (GetAsyncKeyState(VK_SPACE)) { 
     Bullet *bullet = new Bullet(); 
     bullets[bulletcounter] = bullet; // Here is the error 
     bulletcounter++; 
    } 

私はそれが正しい

+4

「ここにエラーがある」エラーがある**何**私たちに教えてくれありません。そして、「扱う」動詞はあまりにも曖昧です。それは何かを意味するかもしれない。 –

+2

エラーは何ですか? –

+0

bulletsはBulletではないBullet *とbullet [bulletcounter] = bulletのベクトルです。 yorはそれにポインタを割り当てています。 – user1438832

答えて

3

bulletsはタイプBulletのオブジェクトを格納するベクトルであるように見えることはできません。ここにあなたのbullet

Bullet *bullet = new Bullet(); 
bullets[bulletcounter] = bullet; // Here is the error 

はタイプBullet*です。 2つの互換性のないタイプはエラーを発生させます。


これを修正するには、ポインタの使用を停止し、ちょうどオブジェクトをインスタンス化:

Bullet bullet; 

これは、あなたが、あなたのbulletsに追加できるパラメータなしのコンストラクタを使用してBulletオブジェクトを作成します。あなたはそれを事前に定義されたサイズbullets(MAXBULLETS)を与え、あなたのベクトルを初期化するので

は準備ができて使用することが、これはすでにあなたのためのMAXBULLETSデフォルト構築オブジェクトを作成し、これは現在、何もしないこと、しかし注意してください:カウントが

構築コンテナデフォルトで挿入されたTのインスタンス。 コピーは作成されません。


サイドノート:完全newの使用を停止します。これはJavaやC#ではありません。動的に割り当てられたオブジェクトが必要な場合は、スマートポインタを使用します。しかし、ほとんどの場合、オブジェクトの自動保存期間は大丈夫です。

+0

私はネイティブスピーカーではないので、 "しかし"何が間違っていたのですか? –

0

私の提案

vector<Bullet> bullets; 

while (1) 
{ 
    Sleep(10); 
    for (int i = 0; i < bullets.size(); i++) 
    { 
     bullets[i].Move(0, 1); 
    } 

    if (GetAsyncKeyState(VK_SPACE)) 
    { 
     bullets.push_back(Bullet());    
    } 
関連する問題