DXライブラリでも使ってフレームワークでも 第4回

アバター
せんちゃ
記事: 50
登録日時: 13年前
住所: 江別市東野幌町
連絡を取る:

DXライブラリでも使ってフレームワークでも 第4回

投稿記事 by せんちゃ » 10年前

今日は前回の日記のオブジェクトシステムの続き。
指定範囲のクリッピング描画を実現するレイヤーオブジェクトを作成します。

レイヤーオブジェクトはある地点(x,y)からサイズ(w,h)までを描画範囲とする機能を持ちます。
レイヤーオブジェクトに管理された描画オブジェクトは全てその範囲内にしか描画されません。
アニメーションや演出を作るときにクリッピングはよく使われるのであると大変便利です。

CODE:

//	クリッピングレイヤーオブジェクト
//	管理するレイアウトを指定範囲の描画にしたい場合に利用する
class LayerObject : public DrawObject {
private :
	int m_orgSizeWidth;
	int m_orgSizeHeight;
public :
	int getOrgSizeWidth(){
		return m_orgSizeWidth;
	}
	int getOrgSizeHeight(){
		return m_orgSizeHeight;
	}

	LayerObject() : DrawObject( LAYER_OBJECT ){
		posX = 0;
		posY = 0;
		sizeWidth = SCREEN_WIDTH;
		sizeHeight = SCREEN_HEIGHT;
	}
	void LayerSetting( float x , float y , float w , float h ){
		posX = x;
		posY = y;
		sizeWidth = (int)w;
		sizeHeight = (int)h;
		m_orgSizeWidth = sizeWidth;
		m_orgSizeHeight = sizeHeight;
	}
	virtual void OnUpdate(){
		for( std::list::iterator iter = m_childObject.begin() ; iter != m_childObject.end() ; iter++ ){
			(*iter)->OnUpdate();
		}
	}
	virtual void OnDraw(){
		float x = getPosAnchorX();
		float y = getPosAnchorY();
		float ParentPosX = 0;
		float ParentPosY = 0;

		//	親が存在する場合、親の座標を計算する
		DrawObject* draw = GameObject::TypeAs( getParent() );
		if( draw ){
			ParentPosX = draw->getParentPosX();
			ParentPosY = draw->getParentPosY();
		}
		int x1 = (int)(ParentPosX+x);
		int y1 = (int)(ParentPosY+y);
		int x2 = x1+sizeWidth;
		int y2 = y1+sizeHeight;
		SetDrawArea( x1 , y1 , x2 , y2 );
		for( std::list::iterator iter = m_childObject.begin() ; iter != m_childObject.end() ; iter++ ){
			(*iter)->OnDraw();
			LayerObject* layer = GameObject::TypeAs( (*iter) );
			if( layer ){
				SetDrawArea( x1 , y1 , x2 , y2 );
			}
		}
		x1 = 0;
		y1 = 0;
		x2 = SCREEN_WIDTH;
		y2 = SCREEN_HEIGHT;
		SetDrawArea( x1 , y1 , x2 , y2 );
	}
};
子として管理しているオブジェクトのOnDrawは指定領域までしか描画しませんよという作り。
描画オブジェクトはまだまだ作ります。
テキストオブジェクトやメッセージボックスもあると便利かもしれません。
次回はその辺を書こうかしら。
(まぁほとんど作りは同じなのだけれど)

仕事も大忙しなので今日のところはこの辺で
ではでは

追記
描画周りの作り込みが甘かったので修正。
子階層にレイヤーがあったら元の位置に戻す方法をとります。
最後に編集したユーザー せんちゃ on 2013年9月20日(金) 00:33 [ 編集 4 回目 ]

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前

Re: DXライブラリでも使ってフレームワークでも 第4回

投稿記事 by h2so5 » 10年前

複数のLayerObjectが階層構造になっている場合、親のLayerObjectでSetDrawAreaした領域を子が書き換えてしまい正常にクリッピングされない可能性があるんじゃないでしょうか。

アバター
せんちゃ
記事: 50
登録日時: 13年前
住所: 江別市東野幌町
連絡を取る:

Re: DXライブラリでも使ってフレームワークでも 第4回

投稿記事 by せんちゃ » 10年前

それは想定してない使い方でした。
親オブジェクトにレイヤーがないか確認してあったら
親の設定に戻してあげる処理が必要そうですね

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前

Re: DXライブラリでも使ってフレームワークでも 第4回

投稿記事 by h2so5 » 10年前

親が子に自分の領域を渡して、子が自分の領域と親の領域の重なっている部分を計算してそれを孫に渡す、という方法なら理想的な動作になると思います。