Разделение экрана на Cocos2d - PullRequest
0 голосов
/ 09 ноября 2011

Я подумываю о разработке игры, в которой два игрока играют друг против друга в «мире», но у каждого есть свой собственный видовой экран, следующий за их персонажем (разделенный экран), но я не уверен, как это реализовать.Это для Cocos2d.

В идеале, игровые события должны происходить в своем собственном CCLayer, и код просто рисует разные его части в разных окнах просмотра.Однако, кажется, что это невозможно с Cocos2d.

Другое решение, о котором я думал, - это иметь два разных слоя и синхронизировать каждый из них.Это будет работать и будет проще реализовать код области просмотра, но не будет выглядеть масштабируемым.

Последняя идея, которая у меня была, - переопределить код отрисовки для игрового слоя и вручную нарисовать его с помощью функций OpenGL, но я бы не сталне знаю, с чего начать.

Как лучше всего это сделать?

1 Ответ

1 голос
/ 11 ноября 2011

Хорошо, после небольшого исследования я нашел этот поток , который использует glViewport для настройки окон просмотра, а затем вызывал [super visit] для каждого окна просмотра.

Однако этоу меня не получалось, потому что по какой-то причине в каждом окне просмотра было растянуто изображение - я предполагаю, что окна просмотра испортили что-то внутреннее в Cocos2d.

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

Для дальнейшего использования, вот фрагмент кода, который я использовал:

-(void) visit
{
    glEnable(GL_SCISSOR_TEST);
    glPushMatrix();

    CGPoint point = ((CCNode*)[toFollow objectAtIndex:1]).position;
    self.anchorPoint = ccp(point.x/self.contentSize.width, point.y/self.contentSize.height);
    self.rotation = 180.0f;

    point = ((CCNode*)[toFollow objectAtIndex:1]).position;
    self.position = ccpAdd(ccp(bounds.width/2,bounds.height/4*3),ccp(-point.x, -point.y));
    glScissor(0,bounds.height/2,bounds.width,bounds.height/2);
    [super visit];

    glPopMatrix();


    glPushMatrix();
    self.anchorPoint = CGPointZero;
    self.rotation = 0.0f;

    point = ((CCNode*)[toFollow objectAtIndex:0]).position;

    self.position = ccpAdd(ccp(bounds.width/2,bounds.height/4),ccp(-point.x, -point.y));
    glScissor(0,0,bounds.width,bounds.height/2);
    [super visit];

    glPopMatrix();
    glDisable(GL_SCISSOR_TEST);
    //self.rotation = 0.0f;
    //[super visit];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...