Dr. Mandala のようなキャンバス系お絵かきソフトを cocos2d で作りたいと考えていたためです。
残念ながら、cocos2dのクラスリファレンスやネットを調べても、それらしい便利なメソッドは見つけられませんでした。
どうもそういう特殊用途のメソッドは、自分でOpenGL ESで実装するというのが正解みたいです。また、cocos2dのソースをちょっと見た限りでは、OpenGL ESを知っていればそう難しい事でもなさそうです。
今回調べて分かったことは、CCNodeクラスの -(void)draw メソッドをオーバーライドして、その中でOpenGL ESコマンドが書けるらしいということです。
テクスチャーへの描画はちょっと脇へ置いて、まずは、その辺りを最初に試してみることにしました。
お題は、背景にグラデーションのスプライトを敷くプログラムです。
新たに CCSpriteクラスを継承した、Bg クラスを作成しました。
ヘッダファイル抜粋
// Bg.h
@interface Bg : CCSprite {
}
+ (id)bg;
@end
実装ファイル抜粋
// Bg.m
@implementation Bg
+ (id)bg
{
return [[[self alloc] init] autorelease];
}
- (void)draw
{
// デフォルトでは以下のstateはEnableになっているので
// このメソッドを去る時には、必ずEnableに戻しておかなければいけない。
// - glEnableClientState(GL_VERTEX_ARRAY);
// - glEnableClientState(GL_COLOR_ARRAY);
// - glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// - glEnable(GL_TEXTURE_2D);
// また、これ以外のstateはDisableに戻しておくこと。
CGSize screenSize = [[CCDirector sharedDirector] winSize]; // スクリーンサイズ
// シートを敷く
const GLfloat vertices[] = {
0,0,
0,screenSize.height,
screenSize.width,0,
screenSize.width,screenSize.height,
};
const GLfloat colors[] = {
1.0f,0.0f,0.0f,1.0f,
0.0f,1.0f,0.0f,1.0f,
0.0f,0.0f,1.0f,1.0f,
1.0f,1.0f,0.0f,1.0f,
};
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glColorPointer(4, GL_FLOAT, 0, colors); // α値を含めたRGBAにしなければならないので、最初のパラメータは4
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
}
@end
あとは、Bgクラスをインスタンス化して、適当なシーンに追加するだけです。
Bg *bg = [Bg bg]; bg.position = CGPointZero; // (0,0) は画面の左下 [myScene addChild:bg z:-1 tag:GameSceneNodeTagBg];
実行結果は下のような感じになります。
前回のテストプログラムから引き継いで、だいぶサイケになったネコ君でした。

0 件のコメント:
コメントを投稿