cocococos 2 d-x懐中電灯の効果
5990 ワード
回転:http://blog.csdn.net/xujiezhige/article/details/8448524#
一般的な懐中電灯の効果は,CCRenderTextureによって達成できる.主にレンダリング表面のアルファ値を修正することにより,懐中電灯の光照射範囲内の透明効果を達成した.この方法は純粋にオリジナルで、同じようなものがあれば、英雄の見解は同じです.ここは写真がないので、丸い領域の代わりに長方形の領域を使っています.この効果は以下のいくつかの基本ステップによって達成されます.は、まず全黒のレンダリングを作成し、シーンを覆うことを示す.
また、BYで始まるマクロは私が個人的に書いたマクロで、プログラムのスピードを上げます.字面の意味から私のマクロの実現方法を推測できます.ほほほ.
一般的な懐中電灯の効果は,CCRenderTextureによって達成できる.主にレンダリング表面のアルファ値を修正することにより,懐中電灯の光照射範囲内の透明効果を達成した.この方法は純粋にオリジナルで、同じようなものがあれば、英雄の見解は同じです.ここは写真がないので、丸い領域の代わりに長方形の領域を使っています.この効果は以下のいくつかの基本ステップによって達成されます.
//create render target
CCRenderTexture* pRenderTexture = CCRenderTexture::create( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT );
//render the target to black
pRenderTexture->begin();
glDisable( GL_BLEND );
ccDrawSolidRect( ccp( 0, 0 ), ccp( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT ), ccc4f( 0, 0, 0, 1 ) );
glEnable( GL_BLEND );
pRenderTexture->end();
//set the render target over the scene
pRenderTexture->setPosition( ccp( BY_WIN_SIZE_WIDTH_HALF, BY_WIN_SIZE_HEIGHT_HALF ) );
addChild( pRenderTexture, 2, 1000 );
//render target is the sprite's texture.
//set the sprite render parms.
ccBlendFunc bf = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA };
pRenderTexture->getSprite()->setBlendFunc( bf );
ccc TouchBegan()関数の透明なところでユーザーがクリックしたエリア //get transparent area
CCPoint ptBottomLeftCorner = ccpSub( pTouch->getLocation(), ccp( 200, 200 ) );
CCPoint ptTopRightCorner = ccpAdd( pTouch->getLocation(), ccp( 200, 200 ) );
//set the area transparent
BY_GET_CHILD( CCRenderTexture, 1000 )->begin();
glDisable( GL_BLEND );
ccDrawSolidRect( ptBottomLeftCorner, ptTopRightCorner, ccc4f( 0, 0, 0, 0 ) );
glEnable( GL_BLEND );
BY_GET_CHILD( CCRenderTexture, 1000 )->end();
cctTouch Moved関数では、まず元のエリア(ここでは保険のために、レンダリング表面全体を直接に塗りつぶします)を塗りつぶします.また、透明で新しいエリアを作り出します. //get transparent area
CCPoint ptBottomLeftCorner = ccpSub( pTouch->getLocation(), ccp( 200, 200 ) );
CCPoint ptTopRightCorner = ccpAdd( pTouch->getLocation(), ccp( 200, 200 ) );
BY_GET_CHILD( CCRenderTexture, 1000 )->begin();
glDisable( GL_BLEND );
//set the render target black
ccDrawSolidRect( CCPointZero, ccp( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT ), ccc4f( 0, 0, 0, 1 ) );
//set the new area transparent
ccDrawSolidRect( ptBottomLeftCorner, ptTopRightCorner, ccc4f( 0, 0, 0, 0 ) );
glEnable( GL_BLEND );
BY_GET_CHILD( CCRenderTexture, 1000 )->end();
ccc Touch Eded()とcctuch Cancell()関数では、ブロック全体を塗りつぶして表面を描画します. BY_GET_CHILD( CCRenderTexture, 1000 )->begin();
glDisable( GL_BLEND );
ccDrawSolidRect( CCPointZero, ccp( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT ), ccc4f( 0, 0, 0, 1 ) );
glEnable( GL_BLEND );
BY_GET_CHILD( CCRenderTexture, 1000 )->end();
はい、この「矩形」の懐中電灯効果を実現しました.懐中電灯の絞りと透明領域をpng画像で作ったほうがいいです.また、BYで始まるマクロは私が個人的に書いたマクロで、プログラムのスピードを上げます.字面の意味から私のマクロの実現方法を推測できます.ほほほ.