クラスを使用してC++でスペースインベーダーゲームのクローンを作成しています。私は、レーザーが、このエイリアンを含むメモリーが解放され、このエイリアンの右にあるすべてのメモリーが1つ後にシフトされることを、オブジェクトの配列に格納されているエイリアンと接触すると、それを望む残りのオブジェクトを格納するより小さな一時的な配列を作成して、元のメモリを削除して一時メモリに戻すことができます。 (これは長いプロセスのように思えるかもしれませんが、ゲーム全体を通してisAliveブールをチェックする必要がなくなり、検索機能がより効率的になります)。オブジェクトの配列(オブジェクトのダイナミックメモリ割り当て)からオブジェクトを削除(メモリ解放)するには
これは私がこれまで持っているものです。
Ennemi::Ennemi() :ExtraTerrestre(0, 0) {
maxElements = 1; // int maxElements
nbElements = 0; // int nbElements
ptr = new Ennemi*[maxElements]; // (Ennemi **ptr)
}
int Ennemi::chercherElement(Ennemi element[]){
int indice = 0;
while (indice < nbElements && ptr[indice] != element)
indice++;
// opérateur ternaire, retourne l'indice si vrai, sinon retourne -1
return indice < nbElements ? indice : -1;
}
void Ennemi::retirerEnnemi(Ennemi element[]) {
int indice = chercherElement(element);
// si un element est trouver active la condition
if (indice != -1) {
// preserver l'ordre du tableau
for (int i = indice; i < (nbElements - 1); i++) {
ptr[i] = ptr[i + 1];
}
nbElements--;
maxElements = nbElements;
// allocation d'une zone memoire
double *ptrTemporaire = new double[maxElements];
// copie des elements dans la nouvelle zone
for (int i = 0; i < nbElements; i++) {
ptrTemporaire[i] = ptr[i];
}
// on libere l'ancienne zone memoire
delete[] ptr;
// fait pointer le pointeur sur la nouvelle zone
ptr = ptrTemporaire;
}
}
P.S.ベクトルを使用して提案しないでください、私はそれを簡単な方法ではない私の理解を改善しようとしています。
私のコードに誤りがあります。 "double * ptrTemporaire = new double [maxElements];" – Kevin
それは唯一のエラーではありません、あなたのコードはコンパイル可能ではなく、かなり大きな混乱です。生の配列で作業したい場合は、そのトピックをよりよく理解する必要があります。 – Slava
バッファは 'Ennemi ** ptr'か' Ennemi element [] 'ですか?あなたのコードからは不明です。 –