#iphone #objective-c #cocos2d-iphone
#iPhone #objective-c #cocos2d-iphone
Вопрос:
Я программирую базовую игру в cocos2d, и всякий раз, когда я перехожу в одну из своих сцен, на экран добавляется цветной оттенок? Для сцены, в которую я перехожу, я переопределил метод рисования, потому что мне нужно отобразить серию цветных линий, чтобы показать игровое поле, и, насколько я знаю, это единственный способ их нарисовать.
Вот код, который выполняет переход:
CCTransitionFadeBL *transition = [CCTransitionFadeBL transitionWithDuration:0.5 scene:gameScene];
[[CCDirector sharedDirector] replaceScene:transition];
И тогда метод рисования в GameScene выглядит следующим образом:
- (void)draw {
for (Arc *a in arcs) {
MyPoint *start = a.start;
MyPoint *end = a.end;
MyPoint *startLocation = [nodeScreenPositions getElementAtRow:[start getX] column:[start getY]];
MyPoint *endLocation = [nodeScreenPositions getElementAtRow:[end getX] column:[end getY]];
ArcColour colour = a.colour;
switch (colour) {
case YELLOW:
glColor4f(255, 255, 0, 255);
break;
case BLUE:
glColor4f(0, 0, 255, 255);
break;
case RED:
glColor4f(255, 0, 0, 255);
break;
case GREEN:
glColor4f(0, 255, 0, 255);
break;
case PINK:
glColor4f(128, 0, 128, 255);
break;
case CYAN:
glColor4f(0, 255, 255, 255);
break;
default:
glColor4f(255, 255, 255, 1);
break;
}
glLineWidth(2.5f);
ccDrawLine(ccp([startLocation getX], [startLocation getY]), ccp([endLocation getX], [endLocation getY]));
}
}
где arcs — это массив моих пользовательских объектов Arc, которые составляют игровое поле.
Оттенок, применяемый к экрану, похоже, зависит от цвета первой дуги в массиве.
Есть ли какой-либо способ, которым линии могут быть нарисованы один раз, а не в методе рисования?
Буду признателен за любую помощь.
Ответ №1:
OpenGL зависит от состояния. В OpenGL рекомендуется сбрасывать все состояния в их предыдущие или состояния по умолчанию после завершения. Это касается цвета, а также ширины линии, параметров текстуры и других состояний GL.
Поскольку вы не сбрасываете цвет, цвет, который был установлен последним, используется для будущих методов рисования OpenGL, пока цвет не изменится. Вот почему переходы сцен показывают цветной фон.
Вы сбросите цвет рисования в конце метода рисования. Этот код показывает основной принцип:
- (void)draw {
// use yellow color
glColor4f(255, 255, 0, 255);
// draw stuff here ...
// reset color to default (black)
glColor4f(0, 0, 0, 1);
}
Комментарии:
1. Однако это, безусловно, улучшение, теперь мои сцены перехода черные! Теперь они все еще окрашиваются только в черный цвет 🙂
2. Большое спасибо — я изменил цвет сброса на белый, и оттенки исчезли!