1

プレーヤーのパス (曲率) をランダムに生成する cocos2d 2.0 を使用して、パス ベースのゲームを作成しています。このパスは、box2d の b2EdgeShape を使用して作成されています。そのパスの下にスプライトを配置したいのですが、私がとったルートは次のとおりです。

  • パスの下に表示されるスプライトは連続的に繰り返され、その高さは常にパスの高さよりも大きくなります (視差背景)

  • 白いスプライトは、CCRenderTexture を使用してパスの下に完全に収まります (私の本当の質問)

  • フラグメント シェーダーは、白いスプライトのアルファ値と表示するスプライトを比較し、両方の値を乗算します。スプライトを表示する必要があるピクセルごとに、乗算後のアルファ値が 1 になり、探している効果が得られることを願っています。

その白いスプライトを、CCRenderTexture を使用して作成されたパスの下に完全に収まるようにするにはどうすればよいですか。RayWenderlich の Tiny Wings チュートリアルに従おうとしましたが、そのチュートリアルは OpenGL ES 1.1 に基づいており、OpenGL 2.0 に移植できない固定パイプライン関数がいくつかあります (最初から OpenGL の知識がほとんどありません)。 OpenGL 2.0 を搭載した cocos2d 2.0。私は静的な白いスプライトを使用してフラグメント シェーダーに取り組んできました。このアプローチは、パスの下にその白い色を常に取得できる場合に機能します。誰かが私を正しい方向に向けることができますか? どんな助けでも大歓迎です:)

4

1 に答える 1

1

白いスプライトが単なるアルファマスクである場合は、それを行う必要はありません。レイの例に従ってください。変更する必要があるのは次のとおりです。

あなたの-initで:

// Built-in to Cocos2D v2.0
[self setShaderProgram: [[CCShaderCache sharedShaderCache] programForKey:kCCShader_PositionTexture]];

... Generate _hillVertices and _hillTexCoords as Ray does ...

あなたの-drawで:

// Built-in to Cocos2D v2.0
[[self shaderProgram] use];
[[self shaderProgram] setUniformForModelViewProjectionMatrix];

// vertex data (glVertexPointer is depreciated)
glEnableVertexAttribArray ( kCCVertexAttrib_Position );
glVertexAttribPointer ( kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, _hillVertices );

// texture data (glTexCoordPointer is depreciated)
glEnableVertexAttribArray ( kCCVertexAttrib_TexCoords );
glVertexAttribPointer ( kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, _hillTexCoords );

glDrawArrays ( GL_TRIANGLE_STRIP, 0, (GLsizei)_nHillVertices );

私は似たような実装を行っているので(頂点と色の座標を使用し、テクスチャは使用していません)、上記のコードを実際にコンパイルしていません。Cocos2d v2.0には、テクスチャ付きの頂点、色付きの頂点、テクスチャと色付きの頂点などを使用するためのシェーダーが組み込まれています。setShaderProgramを設定し、適切なデータを提供するときに、適切なkCCShader_*キーを選択するだけです。

于 2013-02-22T23:00:10.477 に答える