【问题标题】:Cocos2D 2.0 - changing the rect of a CCSprite / stretching a spriteCocos2D 2.0 - 改变 CCSprite 的矩形/拉伸精灵
【发布时间】:2012-06-19 19:40:42
【问题描述】:

我创建了一个图集,其中包含我将在课堂上使用的所有图像。如果这是从图像创建的精灵,我会像这样创建它

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

“white.png”是一个 1x1 像素的图像,我正在拉伸它以覆盖整个 CCSprite 大小,由该 API 上的 rect:frame 定义。

但为了优化 I/O 和内存,我将 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 的精灵会被拉伸以覆盖我想要的大小。

问题是这不起作用。

有什么线索吗?谢谢。

【问题讨论】:

    标签: cocos2d-iphone


    【解决方案1】:

    让你不会压倒- (CGAffineTransform)nodeToParentTransform之类的东西。我在 cocos2d 中使用 Box2d 物理,并提供模板类 PhysicsSprite(CCSprite 的子类)覆盖它,并且有一个错误:比例属性没有改变任何东西。我是这样修复的:

    - (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_相乘。

    【讨论】:

    • 谢谢,但是我应该怎么做呢?放在课堂上?扩展一个类?
    • 这正是我的 CCSPrite 发生的事情,所以它没有 sclaed。我没有看到你所有的代码,所以假设你可以做同样的事情,并发布我的例子。如果您只添加了resizeTo: 方法,我的解决方案将无济于事。
    【解决方案2】:

    在您的情况下,您似乎可以使用 CCLayerColor 创建单色图层。不需要使用 sprite。

    关于您的问题 - 确保 frame.size 不为零 (CGSizeZero)

    【讨论】:

    • 谢谢,但在这种情况下,我必须使用 CCSprite,因为整个事情都来自必须是精灵的 CCSprite 派生类。大小不为零。
    • 和mySprite用spriteFrame初始化后不是nil?
    • 不,但是精灵仍然是 1x1 像素。这可能是一个错误吗? (不从帧缓存中缩放精灵?)
    • 刚刚签入了一个真实的项目。使用 resize 方法添加您的类别并调用它。工作正常。检查一些需要的变量是否为零。顺便说一下,在调试器中检查实际的 frame.size 值
    • 这很奇怪。没有什么是零。大小不是零,它仍然是 1x1。我会仔细检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多