2012-06-12 4 views
0

CCTansitionPageTurn을 사용하여 장면 사이를 전환합니다. 대부분의 장면에서 잘 작동하지만 gl로 그려주는 장면이 있습니다. 채색이 시작된 후 CCTransitionPageTurn은 이전에 문제가 없었던 장면 전환에도 적용되지 않습니다. (여전히 괜찮은 다른 장면으로 이동할 수는 있지만 페이지 넘기기 효과가 손상됩니다.)CCTransitionPageTurn이 OpenGL을 사용하여 작동하지 않습니다.

전환이 호출되기 전에 gl 상태를 변경해야 할 수도 있지만 기본 gl 상태 복원은 작동하지 않는다고 생각합니다. 문제가있는 코드에는 잠재적으로 많은 부분이 있지만 여기에 내가 gl로 놀고있는 코드가 있습니다.

/* ColoringGameScene : CCScene, which handles drawing menus and other cool UI things */ 

// In init 
CCLayerColor *layer = [CCLayerColor layerWithColor:ccc4(255, 255, 255, 255)]; 
[self addChild:layer]; 
TouchDraw *drawObj = [TouchDraw node]; 
[drawObj setDrawPoints:_drawPoints]; 
[layer addChild:drawObj z:999]; 

// In -(void)ccTouchMoved:(UITouch *) touch withEvent:(UIEvent *)event 
// drawPoints, an array of points to draw is updated. drawObj has a reference to this array 


/* In TouchDraw : CCNode, which handles gl drawing */ 

// In init 
glEnable(GL_LINE_SMOOTH); 
glEnable(GL_POINT_SMOOTH); 
glEnable(GL_POINT_SMOOTH_HINT); 
glEnable(GL_LINE_SMOOTH_HINT); 
glHint(GL_POINT_SMOOTH_HINT,GL_NICEST); 
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_BLEND_COLOR); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glLineWidth(8); 
glPointSize(8); 

// elsewhere 

-(void)drawCircle:(CGPoint)center radius:(float)r arc:(float)a line:(NSUInteger)segs lineToCenter: (BOOL)drawLineToCenter 
{ 
int additionalSegment = 1; 
if (drawLineToCenter) 
    additionalSegment++; 

const float coef = 2.0f * (float)M_PI/segs; 

GLfloat *vertices = calloc(sizeof(GLfloat)*2*(segs+2), 1); 
if(! vertices) 
    return; 

for(NSUInteger i=0;i<=segs;i++) 
{ 
    float rads = i*coef; 
    GLfloat j = r * cosf(rads + a) + center.x; 
    GLfloat k = r * sinf(rads + a) + center.y; 

    vertices[i*2] = j * CC_CONTENT_SCALE_FACTOR(); 
    vertices[i*2+1] =k * CC_CONTENT_SCALE_FACTOR(); 
} 
vertices[(segs+1)*2] = center.x * CC_CONTENT_SCALE_FACTOR(); 
vertices[(segs+1)*2+1] = center.y * CC_CONTENT_SCALE_FACTOR(); 

glDisable(GL_TEXTURE_2D); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_FAN, 0, (GLsizei) segs+additionalSegment); 

// restore default state 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_TEXTURE_2D);  

free(vertices); 
} 

-(void)draw 
{ 
[super draw]; 

    if ([drawPoints count]) 
{ 
     for(int i = 0; i < [drawPoints count]; i += 4) 
     { 
      CGPoint point0 = CGPointFromString([drawPoints objectAtIndex:i]); 
      CGPoint point1 = CGPointFromString([drawPoints objectAtIndex:i+1]); 
      CGPoint point2 = CGPointFromString([drawPoints objectAtIndex:i+2]); 
      CGPoint point3 = CGPointFromString([drawPoints objectAtIndex:i+3]); 

      glColor4f(255.0f/255.0f, 0.0f/255.0f, 0.0f/255.0f, 1.0f); // Red 
      glLineWidth(8); 
      glPointSize(8); 

      // various calls to drawCirle and ccDrawCubicBezier 

      //default 
      glColor4f(0.0f/255.0f, 0.0f/255.0f, 0.0f/255.0f, 0.0f); 
     } 
    } 
} 

더 많은 코드가 도움이되는지 알려주십시오.

답변

0

저는 OpenGL에서 초보자입니다.하지만 알다시피 OpenGL 설정은 모든 프로그램에서 동일합니다. 자신의 드로잉의 일부 코드는이 설정에서 무언가를 변경해야합니다. 이것은 당신의 신념의 이유 일 수 있습니다. 더는 말할 수 없지만이 질문을해야합니다.

관련 문제