Масштабируйте CCSprite сбоку, а не от центра


Я пытаюсь сделать настраиваемый индикатор выполнения. Что я хочу сделать, так это иметь " бармаск.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, но я хочу использовать чисто спрайты для индикатор выполнения.

2 2

2 ответа:

Измените свойство spriet anchorPoint на (0.Ф 0.5 Ф). Все преобразования выполняются относительно точки привязки узла. По умолчанию точка привязки спрайта равна (0.5 f, 0.5 f). Вот почему по умолчанию масштабирование выполняется относительно центра спрайта.

Еще один способ, которым это потенциально может быть достигнуто, - это использование метода draw и немного openGL. Я использовал это для баров здоровья для врагов в моем космическом приложении shootem up, которое масштабируется в соответствии с оставшимся вражеским HP. Он адаптирован из одного из учебных пособий Рэя Вендерлиха. Во всяком случае, вот мой метод рисования, он повторяется через каждого босса "монстра" на экране и рисует их бары здоровья. Это может быть адаптировано, и метод, используемый для индикатора прогресса бар...

- (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];

}

edit похоже, что мой блок кода пропустил эту последнюю закрывающую фигурную скобку - не забывайте об этом, если вы хотите попробовать вышеупомянутый метод рисования!