矩形同士の当たり判定

毎回この処理を作ろうとして、悩むのでメモ。
SpriteBase.h

struct Point2D {
  FLOAT x,
  FLOAT y
};
class ISpriteBase
{
protected:
  Point2D pos;
  SIZE size;
public:
  ISpriteBase(void);
  virtual ~ISpriteBase(void);
  
  // ヒットチェック
  BOOL IsHit(ISpriteBase *spriteA, ISpriteBase *spriteB);
};

SpriteBase.cpp

#include "SpriteBase.h"
// ヒットチェック
BOOL ISpriteBase::IsHit(ISpriteBase *spriteA, ISpriteBase *spriteB)
{
  RECT a = {
    spriteA->pos.x, spriteA->pos.y,
    spriteA->pos.x + spriteA->size.cx,
    spriteA->pos.y + spriteA->size.cy};
  RECT b = {
    spriteB->pos.x, spriteB->pos.y,
    spriteB->pos.x + spriteB->size.cx,
    spriteB->pos.y + spriteB->size.cy};

  if((a.left < b.right)
    && (a.right > b.left)
    && (a.top < b.bottom)
    && (a.bottom > b.top))
  {
    return TRUE;
  }

  return FALSE;
}

 
あとは、ISpriteBaseインタフェースを継承して、IsHitにthisとチェックしたいクラスを渡してやればOK。

if(IsHit(this, &enemy) {
  // やられた!
}

 
速度を求められるゲームではつらいけど、普通はこれで問題ないかと思われます。
 
参考:http://www.o440.info/old/extreme/nag/26.htm