============================================

	スプライト
	
============================================

□ スプライトとは?

	ゲーム要素を構成させるためのキャラクタや仕掛け、弾など何らかの行動・動きのある物。
	原則して地形以外のすべてのオブジェクトをスプライトと定義します。
	
	主に次の要素にスプライトが適応されます。
	
	・キャラクタ
	・マップ上の仕掛け(触れるとダメージを受ける床や移動する床)
	・キャラクタの持つ武器
	・武器から発射された弾
	
□ スプライトの基本構成

	スプライトの実体は、Spriteクラスで定義されています。
	
	□ 位置・サイズ・向き
		
		位置と大きさは、Nlgp1.Parameter.Rectangleクラスで定義されており、Spriteクラスは、
		Nlgp1.Parameter.Rectangleクラスのオブジェクトを所有しています。
	
		● 向き
			Direction			静止状態での向き  ( 最後に移動していた方向 )
			MovingDirection		移動している方向
			HitBlockDirection		衝突した方向
			
			ToVerticalCellPos		衝突したセルの座標(垂直方向)
			ToHorizontalCellPos	〃(水平方向)
			
		● 位置・サイズ
			
			位置やサイズは、IRectangleインターフェースを通じて取得または、設定できます。
			細かい制御を行うには、Spriteオブジェクトが持つGetRectangleメンバーを通じてRectangleオブジェクトを操作できます。
			
			位置(座標系)には、下記の2種類があります。
			
				・スプライト座標(ピクセル座標)
					
					スプライトは、左上を 0 , 0 として1ピクセル単位で細かく管理されます。
					(厳密には、浮動小数点なので1ピクセルよりも細かい)
					
					主にスプライトの移動などは、このスプライト座標を使用します。
				
				・セル座標
				
					マップの地形に割り当てた座標系で32x32ピクセル = 1セルになります。
					
		● 速度
		
			速度は、SpriteオブジェクトのメンバーSpeedを通じて設定または、取得します。
			
	
	□ 行動 - ActionEvent
		
		スプライトは、1フレーム毎に実行されるActionEventを備えています。
		ActionEventに独自の行動を定義することでマップ上を回転するキャラクタや
		触れるとダメージを受ける床といった個別の行動(動作)を定義できます。
		
		● ロジック用のパラメータを管理するために… - LogicParameterメンバー
			
			例えば、ある座標を中心として回転を行うスプライトがあったとした場合、1フレーム毎にActionEventが実行され
			少しずつ移動していきます。その場合、角度を保持する必要がありますが、
			これらのパラメータは、Spriteオブジェクトが持つメンバーLogicParameter(ActionParameterクラス)を通じて管理します。
			
			Angle(角度) , Radius(半径) , LimitDistance(距離制限)...といった基本的なメンバーに加えて
			Universalメンバーで任意のパラメータを記憶しておくことができます。Universalは、Hashtableなので何でも格納できます。
			
		● 移動する
			
			スプライトを移動する場合、壁を突き抜けても構わないものは例外として
			壁を突き抜けると不都合が起きる場合は、TryMoveメソッドを通じて移動処理を行います。
			
			TryMoveメソッドは、X軸→Y軸の方向で移動を試み壁に衝突した時点で移動を中断します。
			
		● 固有アクション
			
			ジャンプなどの固有の動きは、下記のメソッドを呼び出します。
			
			・JumpStart				ジャンプ(地上でジャンプできる状態であること)
			・JumpConstraintStart		強制ジャンプ(空中などであっても強制的にジャンプする)
			・JumpStop				ジャンプを中断する
		
		
		※ SpriteAction(静的クラス)では、いくつかの回転などの基本的な動作をサポートします。
		   
		
	□ パラメータ
	
		スプライトには、それぞれ移動速度や重力などの能力を設定できます。
		このパラメータを適切に設定することで移動の早いキャラクタや遅いキャラクタや
		ジャンプ力の高いキャラクタなどを定義できます。
		
		スプライトの管理
		
			ContinuityTime		生存時間
			LimitTime			生存可能時間
			
			IsRest			静止状態かどうか
			IsNowJumping		飛行中かどうか
			
			IsNotDamage			ダメージを受けるかどうか
			HitPoint			ヒットポイント
			
		スプライトの属性
		
			IsBlock			当たり判定がありブロック属性を適応するかどうか
			Attribute			スプライトの基本属性
			
		動きの制御
			
			Speed				速度
			UpGravity			上昇時重力
			DownGravity			降下時重力
			FlyGravity			滞空時重力
			JumpPower			ジャンプ力
			IsBoosting			加速するかどうか
			
			CanDefaultAction		既定の当たり判定によりスプライトの位置を補正するかどうか
		
	□ 近くの状態を取得する
	
		何らかのアクションにおいて近場の状況を知ることは、重要な判断の一つです。
		直近のセルや移動中に衝突したセルや位置を知るには、次のメンバーメソッドがあります。
		
		・ImmediateCell
		・ImmediateBlockCell
		・ToBlock
		・ToHitCell
		
	□ 当たり判定・衝突判定
	
		・HitSpriteCollectionメソッドは、コレクションであり衝突しているスプライトを取得します。
		・TryMoveメソッドは、指定した座標に移動できるかを試み、移動可能な位置までスプライトを移動させます。
		・MoveTestメソッドは、指定された方向に移動した場合に衝突するかどうかを返します。
		  
	□ 攻撃・防御アクション
	
		攻撃や防御などスプライトが持つ独自の技は、Attackスロットに割り当てられます。
		
		AttackSetメソッドでIAttackインターフェースを持つオブジェクトをスロットに関連付けることができます。
		RunAttackメソッドを通じて関連付けたIAttackインターフェースを通じて攻撃や防御のアクションを実行できます。
		
	□ 親スプライト
	
		スプライトは、作成元のスプライトを得るための方法があります。
		Ownerプロパティを使用することでISpriteインターフェースを取得でき、関連された親スプライトを取得できます。
		
		例えば、キャラクタが武器を待ち、その武器から弾を発射できる仕組みがあるとします。
		この場合、スプライトは、下記の3つに分けることができます。
		
			・キャラクタ
			・武器
			・弾
			
		このとき、武器スプライトの親(Owner)は、キャラクタになります。
		キャラクタの親は、居ないのでOwnerを取得してもやはりキャラクタを参照します。
		弾スプライトのOwnerは、武器スプライトになります。
		
		弾スプライトからOwner.Ownerと辿ることで誰が放った弾であるかを知ることができます。