1

ゲームの基本的な構成要素であるクラスCCSpriteを作成するために、クラスを拡張することを計画しています。Block多数の「アーキテクチャ ブロック」 (個々のブロックのベースとなるプロトタイプ) が存在する場合があります。特に、ユーザーがゲーム ボードに配置するビルディング ブロックを選択できるパレットを作成したいと考えています。ボード上に配置されると、ビルディング ブロックは独自のアイデンティティを獲得します。

これが私がこれまでに持っているものです:

class Block : public CCSprite {
private:
  int _id = 0;
  int _type = 0;
public:
  Block* CopyBlock();
}

ユーザーが を選択Blockしてゲーム ボードにドロップすると、CopyBlockが呼び出され、プロトタイプが安全にパレットに戻され、新しく作成されたオブジェクトBlockがゲーム ボード上で独自の生活を続けます。

CCObjectメソッドを「実装」していることに気付きましたがCopy、私が知る限り、これは実装されていないCopyWithZone(0)forCCObjectを参照しているだけです。ただし、Copyメソッドは仮想ではないため、これをオーバーライドできるかどうかは少しわかりません。(私は C++ にそれほど強いわけではありませんが、OOP についてはよく理解しています。そのため、誰かが共有したい場合は詳細を知りたいと思っています。)

質問:

1) このデザインは理にかなっていますか? オーバーライドCopyおよび/またはCopyWithZone代わりに使用する必要がありますか?

2)ものとメンバーの両方が new にコピーされるようにCopyBlock(またはCopyand/orを)実装するにはどうすればよいですか?CopyWithZoneCCSprite_typeBlock

ありがとう!

4

1 に答える 1

1

ブロックスプライトに子が含まれていない限り。同じスプライトを作成し、ブロックの属性 (および場合によっては必要なスプライト属性) を自分でコピーして、コピー コンストラクターを簡単に作成できます。

class Block : public CCSprite {
private:
  int _id = 0;
  int _type = 0;
public:
  Block (Block &otherBlock);
}

実装ファイル:

Block::Block (Block &otherBlock) {
   this->initWithTexture(otherBlock.getTexture());
   // If your sprite contains children then this is the place to iterate all children
   // sprites, create and add them to this block. (do not forget to copy their position as well.)
   this->_id = otherBlock._id;
   this->_type = otherBlock._type;
}

はテクスチャをコピーしないためinitWithTexture、テクスチャを微調整すると、ブロックのすべてのコピーで表示されますが、テクスチャを微調整する必要がない場合は、これでうまくいくはずです。

于 2013-07-27T07:14:51.737 に答える