cocos2d - показывает только часть спрайта - неправильной формы - PullRequest
3 голосов
/ 24 июня 2011

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

-(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 настолько трудным для понимания, что мне все равно нужен кто-то, чтобы объяснить это мне.Если бы я мог установить путь Безье на спрайте в качестве маски (что, я думаю, вы можете сделать в Кварце), это было бы здорово, но не похоже, что это поддерживается.

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

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Разобрался.Вы можете вызывать 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();    

}
1 голос
/ 24 июня 2011

Это невозможно с 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

РЕДАКТИРОВАТЬ: Это основано на предположении, что вы хотите, чтобы обрезать его к какой-то произвольной форме, например, звезда, смайлик, а не просто прямоугольник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...