2

カスタマイズされたプログレスバーを作成しようとしています。私がやりたいのは、「barMask.png」に数値のパーセンテージに応じてXスケールを持たせることです。私はこのようにそれをやろうとしました:

barBack = CCSprite::create( "barBack.png" );
this -> addChild( barBack );

barMask = CCSprite::create( "barMask.png" );
barMask -> setPosition( barBack -> getPosition( ) );
this -> addChild( barMask );

次に、更新方法について

// Scale the width of barMask depending on the percentage of the progress.
barMask -> setScaleX( CURRENT_AMOUNT / TOTAL_AMOUNT );

ただし、スプライトは次のようにスケーリングされます。

Frame 1: [ |||||||||| ]
Frame 2: [  ||||||||  ]
Frame 3: [   ||||||   ]

真ん中に縮みます。左/右に縮小するにはどうすればよいですか?このような:

Frame 1: [ |||||||||| ]
Frame 2: [ |||||||||  ]
Frame 3: [ ||||||||   ]
Frame 4: [ |||||||    ]

CCProgressTimerについては知っていますが、プログレスバーに純粋なスプライトを使用したいと思います。

4

2 に答える 2

3

sprietのanchorPointプロパティを(0.f、0.5f)に変更します。すべての変換は、ノードのアンカーポイントに関連して行われます。デフォルトでは、スプライトのアンカーポイントは(0.5f、0.5f)です。そのため、デフォルトでは、スケーリングはスプライトの中心に関連しています。

于 2012-09-17T07:22:14.547 に答える
2

これを実現できる可能性のある別の方法は、drawメソッドと少しのopenGLを使用することです。これをスペースシューティングアプリの敵のヘルスバーに使用しました。これは、残っている敵のHPに応じてスケーリングされます。これは、RayWenderlichのチュートリアルの1つから採用されています。とにかく、これが私の描画方法です。画面上の各ボスの「モンスター」を繰り返して、ヘルスバーを描画します。これを適応させることができ、進行状況インジケーターバーに使用される方法...

- (void)draw {

for (CCSprite *target in _targets) {
    Monster *monster = (Monster *)target;

    if (monster.monsterisboss == YES) {

        static int lineBuffer = 5;
        int lineHeight = 7;
        int startY = monster.position.x - (monster.contentSize.width/2);
        int endY = monster.position.x + (monster.contentSize.width/2) - lineBuffer;
        int actualX = monster.position.y + (monster.contentSize.height/2) + lineHeight*2;

        static int maxColor = 200;
        static int colorBuffer = 55;
        float percentage = ((float) monster.hp) / ((float) monster.maxHp);
        int actualY = ((endY-startY) * percentage) + startY;
        int amtRed = ((1.0f-percentage)*maxColor)+colorBuffer;
        int amtGreen = (percentage*maxColor)+colorBuffer;

        glEnable(GL_LINE_SMOOTH);

        glLineWidth(lineHeight);        
        glColor4ub(amtRed,amtGreen,0,255);
        ccDrawLine(ccp(startY, actualX), ccp(actualY, actualX));
    }
}

[super draw];

}

編集私のコードブロックが最後の閉じ中括弧を省略したように見えます-上記の描画メソッドを試してみたい場合は、それを忘れないでください!

于 2012-09-17T12:23:18.560 に答える