2011-06-24 2 views
3

Я действительно схожу с ума, пытаясь понять это, поэтому любая помощь будет действительно оценена. Я пытаюсь скрыть большую часть спрайта и показать его постепенно. Это работает отлично, если я работаю только с прямоугольниками. Например, я нашел кого-то реализация класса «ClippingNode», и она работала хорошо, а именно эта часть кода:cocos2d - Показывается только часть спрайта - неправильная форма

-(void) visit 
{ 
    glPushMatrix(); 
    glEnable(GL_SCISSOR_TEST); 
    glScissor(clippingRegion.origin.x + positionInPixels_.x, clippingRegion.origin.y + positionInPixels_.y, clippingRegion.size.width, clippingRegion.size.height); 

    [super visit]; 

    glDisable(GL_SCISSOR_TEST); 
    glPopMatrix(); 
} 

Проблема в том, мне нужно неправильную форму, а не просто прямоугольник. Я надеялся, что смогу наложить вызовы на glScissor и создать фигуру со многими меньшими прямоугольниками, но, к сожалению, glScissor работает только один раз (последний раз он был вызван).

Похоже, что cocos2d не поддерживает буфер трафарета OpenGLs (не так ли?), И даже если это так, я считаю, что OpenGL так трудно понять, мне все равно нужен кто-то, чтобы объяснить это мне. Если бы я мог установить путь безье на спрайт в качестве маски (что, я думаю, вы можете сделать в Quartz), это было бы здорово, но похоже, что это не поддерживается.

Пожалуйста, если у кого-то есть какая-то мудрость, это было бы здорово!

+0

На самом деле, я спрошу по-другому: Можно ли изменить выше реализацию «посетить» на CCNode подрезать содержимое узла к кругу радиуса 40 с центром в clippingRegion.origin? – johnnysports

+0

Неужели вам удалось заставить это работать красиво, чтобы закрепить круг? – jin

ответ

1

Невозможно с glScissor, но вы можете легко достичь этого эффекта с помощью буфера трафарета. Вот документация:

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

Существует также учебник NeHe на буфер трафарета, но в C++, а не Objective C (хотя это должно быть легко перевести в любую нужное вам приложение):

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26

EDIT: Это основано на предположении, что вы хотите, чтобы обрезать его до некоторой произвольной формы, например, звезду, смайлик то, что, вместо просто прямоугольника.

+0

Эта первая ссылка не работает – Grumdrig

1

Выяснил это. Вы можете вызвать glScissor несколько раз, вы как раз и нужно сделать что разрезана ФОРМЕ каждый раз:

-(void) visit 
{ 
    NSEnumerator *enumerator; 
    NSValue *val; 
    CGRect aRegion; 

    glPushMatrix(); 
    glEnable(GL_SCISSOR_TEST); 

    enumerator = [regions objectEnumerator]; 
    while ((val = (NSValue *)[enumerator nextObject])) { 
     aRegion = [val CGRectValue]; 

     glScissor(aRegion.origin.x, aRegion.origin.y, 
        aRegion.size.width, aRegion.size.height); 
     [super visit]; 
    } 

    glDisable(GL_SCISSOR_TEST); 
    glPopMatrix();  

} 
Смежные вопросы