//////////////////////////////////////////////////////////////////////
//@STATE=作成中
//@DESCRIPTION ---------------------------------------------------------------
// character.h: Character クラスのインターフェイス
//	履歴：
// $Log: character.h,v $
// Revision 1.1  2001/10/28 21:40:37  fujiwara
// DLLに分割
//
// Revision 1.6  2001/07/09 20:39:04  fujiwara
// 例外処理の組み込み
//
// Revision 1.5  2001/07/01 01:03:45  fujiwara
// const の見直し
// 配置エディタは途中経過
//
// Revision 1.4  2001/05/29 01:13:06  fujiwara
// 雑魚キャラ(飛行物）の作成。配置エディタのバグ修正
//
// Revision 1.3  2001/05/13 20:04:24  fujiwara
// メモリーリークが発生したので取り除く。
// 自弾のサウンドテスト
//
// Revision 1.2  2001/05/12 00:51:04  fujiwara
// ＣＶＳを導入し、ログ表示を追加
//
//@DESCRIPTION_END -----------------------------------------------------------
//@AUTHOR=S.F.
// Copyright (C) 2000 Satoshi Fujiwara. All Rights Reserved.
///////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_CHARACTER_H__5B8090E2_17CC_46C4_80A1_309AF177B9D5__INCLUDED_)
#define AFX_CHARACTER_H__5B8090E2_17CC_46C4_80A1_309AF177B9D5__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
namespace sf {
	namespace application {
		namespace hit{
			class Interface;
			class HitRect;
		};

class Characters;
class Game;

class Character
{
public:
	Character();
	virtual ~Character();
	// OPERATION //
	virtual void initialize(void) = 0;
	// キャラクター移動
	virtual void move(void) = 0;

	// ACCESS //
	// 中心座標
	virtual const float x(void) = 0;
	virtual void x(const float value) = 0;

	virtual const float y(void) = 0;
	virtual void y(const float value) = 0;

	virtual const float z(void) = 0;
	virtual void z(const float value) = 0;

	// ライフ 
	virtual const int life(void) = 0;
	virtual void life(const int value) = 0;
	// 移動スピード
	virtual const float speed(void) = 0;
	virtual void speed(const float value) = 0;
	// 移動方向 (ラジアン）
	virtual const float direction(void) = 0;
	virtual void direction(const float value) = 0;



	virtual const bool hitCheck(Character * const pDest) = 0;
	virtual const bool hitCheck(Characters * const pDest) = 0;
	virtual void hit(Character * const pDest) = 0;

	virtual sf::application::hit::Interface * const hitObj(void) = 0;
};


class Characters {
public:
	Characters(){};
	virtual ~Characters(){};
	virtual void initialize(void) = 0;
	virtual void move(void) = 0;
	virtual const bool hitCheck(Character * const pDest) = 0;
	virtual const bool hitCheck(Characters * const pDest) = 0;
};

class Util {
public:
	static const float calcDirection(const float x1,const float y1,const float x2,const float y2);
	static const bool checkArea(const float x,const float y,sf::system::console::sprite::Sprite*  const pSprite);
	static const bool checkArea(const float x,const float y,const float width,const float height);
	// ラディアン値の補正
	static const float adjustRadian( float radian)
	{
		if(radian > 2.0f * sf::system::PI){
			while(radian > 2.0f * sf::system::PI){
				radian -= 2.0f * sf::system::PI;
			}
			return radian;
		}

		if(radian < 0.0f){
			while(radian < 0.0f){
				radian += 2.0f * sf::system::PI;
			}
			return radian;
		}
	};
};

	}
}

#endif // !defined(AFX_CHARACTER_H__5B8090E2_17CC_46C4_80A1_309AF177B9D5__INCLUDED_)
