2

現在、グラフ(エッジで接続されたノード)を使用するゲームを開発しており、ノードを移動できるようにしたいと考えています。ノードは移動しています(タッチに応答)が、ノードが移動した結果としてエッジ(.png画像で初期化)が再レンダリングされると、ギザギザに見えます。エイリアシングとアンチエイリアシングを試してみましたが、何をしてもエッジがギザギザになります。

ここで、エッジ画像を(画像ファイルを使用して)初期化します。

-(id) initWithSet:(int)setNum Level:(int) levelNum
{
    if( (self=[super init]) ) {

           <code omitted>

           for (NSArray *e in self.level.targetGraph) {

               <code omitted>

               CCSprite *edgeOutline = [CCSprite spriteWithFile:@"EdgeOutline.png"];
               [edgeOutline setPosition:ccp((ax+bx)/2, (ay+by)/2)];
               edgeOutline.scaleX = (dist * edgeOutline.scaleX)/edgeOutline.contentSize.width;
               edgeOutline.scaleY = (self.nodeSize * 0.5 * edgeOutline.scaleY)/edgeOutline.contentSize.height;
               edgeOutline.rotation = -angle;
               [outlines addChild:edgeOutline];

               CCSprite *edgeFill = [CCSprite spriteWithFile:@"EdgeFill.png"];
               [edgeFill setPosition:ccp((ax+bx)/2, (ay+by)/2)];
               edgeFill.scaleX = (dist * edgeFill.scaleX)/edgeFill.contentSize.width;
               edgeFill.scaleY = (self.nodeSize * 0.4 * edgeFill.scaleY)/edgeFill.contentSize.height;
               edgeFill.rotation = -angle;
               [fills addChild:edgeFill];

         }

  return self;
}

そして、ここでエッジ図面を更新します(nextFrameメソッドの後半を使用):

- (void) nextFrame:(ccTime)dt {

    for (NSArray *e in self.level.graph) {
        CCSprite *a = [self.graphNodeOutlines objectForKey:[e objectAtIndex:0]];
        double ax = a.position.x;
        double ay = a.position.y;
        CCSprite *b = [self.graphNodeOutlines objectForKey:[e objectAtIndex:1]];
        double bx = b.position.x;
        double by = b.position.y;

        double dx = ax-bx;
        double dy = ay-by;
        double angle = 90;
        if (dx != 0) {
            angle = atan2(ay-by, ax-bx)*180/M_PI;
        }
        double dist = sqrt(dx*dx+dy*dy);

        //TODO: get anti-aliasing to work in this next part!

        CCSprite *edgeOutline = [self.graphEdgeOutlines objectForKey:e];
        [edgeOutline setPosition:ccp((ax+bx)/2, (ay+by)/2)];
        edgeOutline.scaleX = (dist)/edgeOutline.contentSize.width;
        edgeOutline.scaleY = (self.nodeSize * 0.25)/edgeOutline.contentSize.height;
        edgeOutline.rotation = -angle;

        //The line we hoped would fix the jagged edge problem.
        [[edgeOutline texture] setAntiAliasTexParameters];

        CCSprite *edgeFill = [self.graphEdgeFills objectForKey:e];
        [edgeFill setPosition:ccp((ax+bx)/2, (ay+by)/2)];
        edgeFill.scaleX = (dist)/edgeFill.contentSize.width;
        edgeFill.scaleY = (self.nodeSize * 0.2)/edgeFill.contentSize.height;
        edgeFill.rotation = -angle;

        //The (same) line we hoped would fix the jagged edge problem.
        [[edgeFill texture] setAntiAliasTexParameters];

    }
}

Cocos2Dv2.0とXCodev4.5を使用しています。

どんな助けでも大歓迎です。ありがとうございました!

更新:問題を示す写真:

ここに画像の説明を入力してください

4

1 に答える 1

0

解決策があります!このチュートリアルの「MainWindow.xib の追加」セクションに従ってください: http://www.raywenderlich.com/4817/how-to-integrate-cocos2d-and-uikit

どういうわけか、グラフィックの責任の一部を UIKit に渡すことで問題が解決します。レイは私の救世主です。

編集:これは、iPad の問題のみを修正するようです。理由はわかりません。

編集 2: すべて無視します。すべてのアンチエイリアシングには、シミュレーターのスケーリングを行うための何かがありました。代わりに、この投稿の意味を理解するのを手伝ってください: http://www.cocos2d-iphone.org/forum/topic/4773

于 2013-01-21T01:26:22.060 に答える