我正在 cocos2d 中编写一个基本游戏,每当我转换到一个场景时,屏幕上就会添加一种色调?我要转换到的场景我已经覆盖了 draw 方法,因为我需要渲染一系列彩色线来显示游戏板,据我所知,这是唯一的方法画出它们。
这是执行转换的代码:
CCTransitionFadeBL *transition = [CCTransitionFadeBL transitionWithDuration:0.5 scene:gameScene];
[[CCDirector sharedDirector] replaceScene:transition];
然后gameScene中的draw方法如下所示:
- (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 对象的数组,它们构成了游戏板。
应用于屏幕的色调似乎取决于数组中第一个弧线的颜色。
有没有什么办法可以让线条绘制一次,而不是在 draw 方法中?
任何帮助将不胜感激。
最佳答案
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);
}
关于iphone - Cocos2D过渡颜色问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8000970/