2014年7月15日火曜日

cocos2d v3.1非互換:ccDrawLine等の直接描画関数が無くなっている!?

<非互換項目>

  • cocos2dで画面に線や円等の図形を直接描画する関数群(ccDrawXXXX)が利用できなくなっていると思われます。
  • Google検索して関連情報を集めてみましたが"CCDrawingPrimitives.h"ヘッダーをインポート云々の書き込みを見つけましたがv3.1ではこのヘッダーファイル自体存在せず、どうもccDrawLine等の直接描画関数は使えなくなっている感じですね。


<対応方法>

  • CCDrawNodeクラスを用いた線や円等の図形描画に書き換える。

-(void)draw{
    // 線の色設定
    ccDrawColor4B(64, 64, 64, 255);
    
    // 線の太さ設定
    glLineWidth(1.0);
    
    // 線の描画幅の設定
    CGFloat gap = kTriLineLength;
    
    // 三角形の高さ計算
    CGFloat takasa = gap * (sqrt(3.0) / 2.0);
    
    // 描画開始Y座標
    CGFloat baseY = -4.0f;
    
    // 横線の描画
    CGPoint p1, p2;
    for (CGFloat y=baseY+takasa; y<self.contentSize.height; y=y+takasa) {
        p1=CGPointMake(0, y);
        p2=CGPointMake(self.contentSize.width, y);
        ccDrawLine(p1, p2);
    }
}
    
-(id) init
{
 if( (self=[super init] )) {
        // 画面サイズ取得
        CGSize viewSize = [[CCDirector sharedDirector] viewSize];
        
        // 背景描画ノード生成
        CCDrawNode *drawNode = [CCDrawNode node];
  [self addChild:drawNode z:0];
        
        // --- 背景描画処理 ------------------------------------------
        // 線の色設定
        CCColor *colorLine = [CCColor colorWithCcColor4b:ccc4(64, 64, 64, 255)];
        
        // 線の太さ設定
        CGFloat thickness = 1.0;
        
        // 線の描画幅の設定
        CGFloat gap = kTriLineLength;
        
        // 三角形の高さ計算
        CGFloat takasa = gap * (sqrt(3.0) / 2.0);
        
        // 描画開始Y座標
        CGFloat baseY = -4.0f;
        
        // 横線の描画
        CGPoint p1, p2;
        for (CGFloat y=baseY+takasa; y= 0 && x <= viewSize.width) ||
                (x-zure >= 0 && x-zure <= viewSize.width)) {
                p2=CGPointMake(x-zure, viewSize.height);
                [drawNode drawSegmentFrom:p1 to:p2 radius:thickness color:colorLine];
            }
            
            // 右斜線
            if ((x >= 0 && x <= viewSize.width) ||
                (x+zure >= 0 && x+zure <= viewSize.width)) {
                p2=CGPointMake(x+zure, viewSize.height);
                [drawNode drawSegmentFrom:p1 to:p2 radius:thickness color:colorLine];
            }
        }
    }
 return self;
}
    

<所感>

  • 直接描画関数(ccDrawXXXX)を多用しているプログラムでは対応がかなり大変になると思います。(描画タイミングも変わっちゃいますし)
  • CCDrawNodeクラスでも置き換えが困難なケースでは別の方法を探す事になると思いますが、今回のプログラムではCCDrawNodeクラスでの対応が可能でしたのでそれ以上は調べておりません。  └ 代替策等の情報をお持ちの方はコメントを付けていただければ幸いです。
ではまた〜

0 件のコメント:

コメントを投稿