0

たくさんのグーグルと読書にもかかわらず、私は解決策を見つけられなかったという奇妙な問題を抱えています。

動的に生成された背景を使用するシーンがあります。背景のコードは、このチュートリアルと、HaqusTiny-Wingsgithubなどのチュートリアルに関連して私が見つけた他のコードに基づいています。

とにかく、私のコードは丘の生成を単純化し、それはすべてStripedTerrainと呼ばれる1つのCCNodeクラスに含まれています。すべて正常に動作しますが(今は!)、同じ背景スプライトで同じレイアウトを使用する別のシーンに移動すると、完全にはレンダリングされません。スクリーンショットを参照してください。画像Aは、私のコードをそのまま使用した最初の実行です。画像Bは、同じシーンクラスの新しいシーンへのreplaceScene呼び出しの後です。次に、マトリックスをポップする直前に、描画コードに次の小さな変更を加えました。

ccDrawColor4B(255, 255, 255, 255);
ccDrawLine(ccp(0.0,0.0),ccp(0.0,0.0));

そしてそれはうまくいきます(画像CとD)

これは最も奇妙なことであり、何が悪いのか理解できません。

ドローコールコードを投稿しますが、残りの詳細は割愛します。

 /**
 * Previus to the draw method we have already done the following:
 * Randomly selected, or have been given two colors to paint the stripes onto our texture
 * Generated a texture to overlay on to our hill vertice geometry
 * Generated the top of the hill peaks and valleys
 * Generated the hill verticies that will fill in the surface of the hills
 * with the texture applied
 */
- (void) draw {

CC_NODE_DRAW_SETUP();
// this statement fixed the screwed up jagged line rendering
// since we are only using position and texcoord vertexes, we have to use this shader
kmGLPushMatrix();
CHECK_GL_ERROR_DEBUG();
ccGLBlendFunc( CC_BLEND_SRC, CC_BLEND_DST ); //TB 25-08-12: Allows change of blend function
ccGLBindTexture2D(self.stripes.texture.name);

//TB 25-08-12: Assign the vertices array to the 'position' attribute
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, _hillVertices);

//TB 25-08-12: Assign the texCoords array to the 'TexCoords' attribute
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, _hillTexCoords);
glEnableVertexAttribArray(kCCVertexAttrib_Position);
glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);
//TB 25-08-12: Draw the above arrays
glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)_nHillVertices);
CHECK_GL_ERROR_DEBUG();

//Debug Drawing (remove comments to enable)
if(0) {
    for(int i = MAX(_fromKeyPointI, 1); i <= _toKeyPointI; ++i) {
     ccDrawColor4B(255, 0, 0, 255);
     ccDrawLine(_hillKeyPoints[i-1], _hillKeyPoints[i]);
     }
    for(int i =0;i<_nHillVertices;i+=3) {
        ccDrawColor4B(255, 0, 0, 255);
        ccDrawLine(_hillVertices[i+1], _hillVertices[i+2]);
    }
}
// have to do this to force it to work the next scene load
ccDrawColor4B(255, 255, 255, 255);
ccDrawLine(ccp(0.0,0.0),ccp(0.0,0.0));
kmGLPopMatrix();
CC_INCREMENT_GL_DRAWS(1);


}

上記の明らかな間違いはありますか?

別の方法でシェーダーを設定しました。

4

1 に答える 1

0

前のシーンとその子がdeallocメソッドを実行しているかどうかを確認します。そうでない場合、1つ以上がリークしていると、最も奇妙なことが起こる可能性があります。

スーパークリーンアップを呼び出さずにクリーンアップをオーバーライドする場合も同様です。

于 2013-02-12T13:58:22.247 に答える