矩形同士の当たり判定
毎回この処理を作ろうとして、悩むのでメモ。
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