0

私のプログラムは前進する発射体を作成します。それらが特定の境界を超えた場合、それらは格納されているベクトルから削除されます。ベクトルはxcord、ycord、zcord、およびそれぞれの方向を格納します。

int size = bullet.size();
        for(int i = 0; i < size; i+=6)
        {
                float xc = bullet[i];
                float yc = bullet[i+1];
                float zc = bullet[i+2];
                float xd = bullet[i+3];
                float yd = bullet[i+4];
                float zd = bullet[i+5];
                if(xc > 100 || yc > 10 || zc > 100 || xc < -100 || yc < -10 || zc < -100)
                {
                      bullet.erase(bullet.begin()+i, bullet.begin()+i+5);
                      size=size-6;
                      i = i-6;
                }
                else
                {
                     glEnable(GL_TEXTURE_2D);
                     glBindTexture ( GL_TEXTURE_2D, texture_id[3] );
                     glPushMatrix(); 
                     glTranslatef( xc+(xd/2), yc+(yd/2), zc+(zd/2));   //x y z coord of sphere
                     glRotatef( 0,0,1,0);
                     glRotatef( -80,1,0,0); 
                     glRotatef( 0,0,0,1); 
                     glScalef( 0.10f, 0.10f, 0.10f); 
                     gluQuadricTexture(quadric,1);
                     gluSphere(quadric,10.0,72,72); 
                     glPopMatrix();
                     glDisable(GL_TEXTURE_2D);
                     bullet[i] = xc+xd;
                     bullet[i+1] = yc+yd;
                     bullet[i+2] = zc+zd;
                }
        }

しかし、「弾丸」が範囲外になると、私のプログラムはクラッシュするようです。何か案は?


よく変わる

bullet.erase(bullet.begin()+i, bullet.begin()+i+5);

bullet.erase(bullet.begin()+i, bullet.begin()+i+6);

それを修正したようです


興味のある方へ

      bullet.push_back(xpos);
      bullet.push_back(0.0f);
      bullet.push_back(zpos);
      bullet.push_back(nxpos);
      bullet.push_back(nypos);
      bullet.push_back(nzpos);

マウスがクリックされるたびに発生します

4

2 に答える 2

5

あなたが持っている

i < size

あなたの条件として、そして要素にアクセスする

bullet[i] .... bullet[i+5]

そこに何か問題がありますか?iに達するとどうなりますかsize-1。アクセスしますよbullet[size + 4]ね?

于 2013-03-07T11:28:11.567 に答える
3

http://www.cplusplus.com/reference/vector/vector/erase/

削除するベクトル内の範囲を指定する反復子]: [first,last)。つまり、範囲には first と last の間のすべての要素が含まれます。これには、 firstが指す要素は含まれますが、 last が指す要素は含まれません

問題は、6 つではなく 5 つの要素しか削除していないことです。

于 2013-03-07T11:32:41.303 に答える