指定範囲のクリッピング描画を実現するレイヤーオブジェクトを作成します。
レイヤーオブジェクトはある地点(x,y)からサイズ(w,h)までを描画範囲とする機能を持ちます。
レイヤーオブジェクトに管理された描画オブジェクトは全てその範囲内にしか描画されません。
アニメーションや演出を作るときにクリッピングはよく使われるのであると大変便利です。
// クリッピングレイヤーオブジェクト
// 管理するレイアウトを指定範囲の描画にしたい場合に利用する
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 );
}
};
描画オブジェクトはまだまだ作ります。
テキストオブジェクトやメッセージボックスもあると便利かもしれません。
次回はその辺を書こうかしら。
(まぁほとんど作りは同じなのだけれど)
仕事も大忙しなので今日のところはこの辺で
ではでは
追記
描画周りの作り込みが甘かったので修正。
子階層にレイヤーがあったら元の位置に戻す方法をとります。