2012-06-19 3 views
0

Я создал атлас со всеми изображениями, которые я буду использовать в классе. Если бы это был спрайт создан из образа, я хотел бы создать его какCocos2D 2.0 - изменение прямоугольника CCSprite/растяжка спрайта

mySprite = [CCSprite spriteWithFile:@"white.png" rect:frame]; 

«white.png» является 1x1 пикселем изображения, которое я растяжка, чтобы покрыть весь размер CCSprite, что определяется прямоугольником: кадр на этом API.

Но для того, чтобы оптимизировать ввод/вывод и память, я поставил white.png в атласе, и моя идея состояла в том, чтобы создать его, используя

mySprite = [CCSprite spriteWithSpriteFrameName:@"white.png"]; 

, но это создаст 1x1 пиксель спрайт. Итак, моя идея состояла в том, чтобы создать категорию расширить CCSprite с этими линиями

@implementation CCSprite (CCSprite_Resize) 


-(void)resizeTo:(CGSize) theSize 
{ 
    CGFloat newWidth = theSize.width; 
    CGFloat newHeight = theSize.height; 


    float startWidth = self.contentSize.width; 
    float startHeight = self.contentSize.height; 

    float newScaleX = newWidth/startWidth; 
    float newScaleY = newHeight/startHeight; 

    self.scaleX = newScaleX; 
    self.scaleY = newScaleY; 

} 

, так что я мог бы сделать это

mySprite = [CCSprite spriteWithSpriteFrameName:@"white.png"]; 
[mySprite resizeTo:frame.size]; 

и тому 1x1 спрайт будет растягиваться, чтобы покрыть размер я хочу.

Проблема в том, что это не работает.

любые подсказки? Благодарю.

ответ

0

Кажется, что в вашем случае вы можете использовать CCLayerColor для создания одноцветного слоя. Нет необходимости использовать спрайт для него.

О вашем вопросе - убедиться, что frame.size не равен нулю (CGSizeZero)

+0

Спасибо, но в этом случае я должен сделать это с помощью CCSprite, потому что все это происходит из производного класса CCSprite, который должен быть спрайтом. Размер не равен нулю. – SpaceDog

+0

и mySprite после инициализации с помощью spriteFrame не ноль? – Morion

+0

нет, но спрайт все еще 1x1 пиксель. Это может быть ошибка? (не масштабирование спрайтов из кэша кадров?) – SpaceDog

2

Make берег вы не перекрывая Somthing как - (CGAffineTransform)nodeToParentTransform. Я использую физику Box2d с cocos2d и предоставляю шаблонный класс PhysicsSprite (подкласс CCSprite), переопределяющий его, и была ошибка: свойство scale ничего не меняло. Я исправил это так:

- (CGAffineTransform)nodeToParentTransform 
{ 
    b2Vec2 pos = body_->GetPosition(); 

    float x = pos.x * PTM_RATIO; 
    float y = pos.y * PTM_RATIO; 

    // Make matrix 
    float radians = body_->GetAngle(); 
    float c = cosf(radians); 
    float s = sinf(radians); 

    if (!CGPointEqualToPoint(anchorPointInPoints_, CGPointZero)) 
    { 
     x += c * -anchorPointInPoints_.x * scaleX_ + -s * -anchorPointInPoints_.y * scaleY_; 
     y += s * -anchorPointInPoints_.x * scaleX_ + c * -anchorPointInPoints_.y * scaleY_; 
    } 

    // Rot, Translate Matrix 
    transform_ = CGAffineTransformMake(c * scaleX_, s * scaleX_, 
    -s * scaleY_, c * scaleY_, 
    x, y); 

    return transform_; 
} 

В оригинале не было scaleX_ и scaleY_ множатся.

+0

спасибо, но что я должен делать с этим? Поместить его в класс? расширить класс? – SpaceDog

+0

Это именно то, что случилось с моим CCSPrite, поэтому он не sclaed.I не видел весь ваш код, так что предположил, что вы cuold сделать что-то такое, и разместил мой exaple. Если вы только добавили свой метод 'resizeTo:', мое решение не поможет вам. – SentineL

Смежные вопросы