2010年2月27日土曜日

にっきちゃ

 バックバッファをためしに32bitDIBから24bitDIBに変更してみたらかえって遅くなった。
当社比8倍ぐらいか遅くなった。
やっぱ1Byteずつ読み書きすんのはダメだ。
使うメモリ量が減るからいいかな、とか思ってやってみたが腹立たしいまでに緩慢である。
これと接触判定関係をいじくってたら一日が終わった。圧倒的なスパゲティコードの前に力尽きた。END。
 
 複数の接触判定を持つクラスを作るのだけどnewとかallocとか使いたくない!
ってことで

template < int NUM >
class Collisions
{
public:
  RECT rect[ NUM ];
 
  bool checkCollision( const Collisions& col ) const
  {
    /*判定処理省略*/
  }
};

 としてtemplateで配列要素数を指定する。
 使うときは、たとえば

template <int NUM, int NUM2 >
bool checkCollision( const Collisions<NUM>& colA, const Collisions<NUM2>& colB )
{
  /*判定処理省略*/
}
 
int main()
{
  Collisions<2> a, b;
/* パラメータ設定とか。省略 */
  const bool isHit = checkCollision( a, b );
  std::printf( isHit ? "true" : "false" );
  return 0;
}

 みたいなことをまず思いついたんだけどこれだと仮想関数の引数に使用できない問題が発覚。

class EnemyBase
{
public:
  template < int NUM >
  virtual bool isHit( Collisions<NUM> col ) = 0;
};

 ごらんの有様だよ! templateと仮想関数はあわせて使えないようで。
結局普通に基底つくってごまかした。
クラスの名前をどうするかが一番悩んだ。後ろにBaseってつければいいと思ってる。

class CollisionsBase
{
public:
  virtual bool checkCollision( const CollisionsBase& ) const = 0;
  virtual int getNum() const = 0;
};
 
 
template < int NUM >
class Collisions : public CollisionsBase
{
public:
  bool checkCollision( const CollisionsBase& col ) const
  {
    for (int i=0; i<col.getNum(); ++i) /*判定処理省略*/
  }
 
  int getNum() const { return NUM; }
};
 
 
class EnemyBase
{
public:
// template<int NUM>をかかずにすむ
  bool isHit( const CollisionsBase& ) = 0;
};

 Cライクにポインタと要素数を渡すといったシンプルな考えが、完成して動くまでぜんぜん思い浮かばなかったんだ……。

0 件のコメント: