/**
 * @file
 * @brief 2Dスプライト属性の定義を行う.
 * 
 * @author S.F.
 * @version $Id:
 *
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */

/// 重複インクルード防止用マクロ
#if !defined(OBJ2D)
#define OBJ2D

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
extern "C" {
namespace sf {
	namespace system {
		namespace console {

#include "sf.h"

/// 2Dスプライト属性
class SFDLL Obj2D : public Obj
{
public:
	/// コンストラクタ
	Obj2D();
	/// デストラクタ
	virtual ~Obj2D();

	/** X座標を取得する 
	 * @return X 座標 */
	virtual const float x() const { return mX;};
	
	/** X座標を設定する 
	 * @param value X 座標 */
	virtual void	x(const float value) { mX = value;}; 
	
	/** Y座標を取得する 
	 * @return Y 座標 */
	virtual const float	y()	const { return mY;};
	
	/** Y座標を設定する 
	 * @param value Y 座標 */
	virtual void	y(const float value) { mY = value;}; 
	
	/** Z座標を取得する.
	 * OBJ2DではZ値は描画優先順位となります。Z値に応じたスケーリングは行われません。
	 * @return Z 座標 */
	virtual const float z() const { return mZ;};
	
	/** Z座標を設定する 
	 * @param value Z 座標 */
	virtual void	z(const float value) { mZ = value;List::deleteObj(this); List::insertObj(this);};
	
	/** 回転角度を取得する 
	 * @param value 回転角度(ラジアン) */
	virtual const float angle() const { return mAngle;};
	
	/** 回転角度を設定する 
	 * @return 回転角度(ラジアン) */
	virtual void	angle(const float value) { mAngle = value;};
	
	/** X軸方向の拡大縮小率を取得する
	 * @return X軸方向の拡大率縮小率 */
	virtual const float scalingX() const { return mScalingX;}; 
	
	/** X軸方向の拡大縮小率を設定する
	 * @param value X軸方向の拡大縮小率 */
	virtual void scalingX(const float value) { mScalingX = value;}; 
	
	/** Y軸方向の拡大縮小率を取得する
	 * @return Y軸方向の拡大縮小率 */
	virtual const float scalingY() const { return mScalingY;}; 
	
	/** Y軸方向の拡大縮小率を設定する
	 * @param value Y軸方向の拡大縮小率 */
	virtual void scalingY(const float value) { mScalingY = value;}; 

	/** X反転の状態を取得する 
	 * @retval true X反転している 
	   @retval false X反転していない　*/
	virtual const bool reverseX() const { return mbReverseX;};
	
	/** X反転の状態を設定する
	 * @param value true X反転する false X反転しない*/
	virtual void reverseX(const bool value) { mbReverseX = value;}; 
	
	/** Y反転の状態を取得する 
	 * @retval true Y反転している 
	   @retval false Y反転していない　*/
	virtual const bool reverseY() const { return mbReverseY;};
	
	/** Y反転の状態を設定する
	 * @param value true Y反転する false Y反転しない*/
	virtual void reverseY(const bool value) { mbReverseY = value;}
	
	virtual void drawMode(const DrawMode value) { mDrawMode = value;};
	
	virtual const DrawMode drawMode() const  {return mDrawMode;}
	
	virtual sprite::Sprite * const sprite() const {return mpSprite;};
	virtual void sprite(sprite::Sprite* const value){ mpSprite = value;};

	virtual const int index() const { return mIndex;};
	virtual void index(const int value) { mIndex = value;};

	
	virtual const bool visibility() const {return mbVisibility;};
	virtual void visibility(const bool value){ mbVisibility = value;};
	
	virtual Obj * const previous()  const {return mpPrevious;};
	virtual void previous(Obj * const value){mpPrevious = value;};
	
	virtual Obj * const next() const {return mpNext;};
	virtual void next(Obj * const value){mpNext = value;};

private:

	float mX,///< X座標
		  mY,///< Y座標
		  mZ,///< Z座標(描画優先順位)
		  mRad,///< 回転角度(ラジアン）
		  mAngle;///< 回転角度(ラジアン）
	float mScalingX,///< X軸方向の拡大縮小率
		  mScalingY;///< Y軸方向の拡大縮小率
	bool mbVisibility;///< 表示するかしないか
	bool mbReverseX;///< X反転するかしないか
	bool mbReverseY;///< Y反転するかしないか
	
	sprite::Sprite *mpSprite;///< Spriteインターフェースのポインタ
	int mIndex;///< Spriteの中のインデックス

	DrawMode mDrawMode;///< DrawMode
	Obj* mpPrevious;///< 前のObjのポインタ
	Obj* mpNext;///< 次のObjのポインタ

};// Obj
		}
	}
}
}
#endif // !defined(AFX_OBJ_H__848EAA84_F65D_4C04_982A_EC1A7484C2E7__INCLUDED_)
