如何将SpaceManager cpShape存储在类似数组的内容中?

时间:2010-07-07 16:52:37

标签: c objective-c nsmutablearray chipmunk

我正在尝试使用Cocos2d和Chipmunk(通过SpaceManager)创建一个柔软的球,使用一系列链接在一​​起然后将弹簧连接到中央主体。

Something like these examples

但是为了做到这一点,我想我需要在创建它们之后将所有cpShapes存储在一个数组中,这样我就可以循环遍历数组,将它们与约束一起链接起来。

然而,当我尝试将cpShapes放入数组时,我收到一个错误,告诉我这是一个“不兼容的指针类型”。所以...我要么需要使用除数组之外的其他东西(我已经尝试了一套,但也没有用)或者我需要对形状做一些事情以使其兼容......但是什么?或者我需要另一种方法。

有什么想法吗?

到目前为止这里的代码应该是相关的......

- (id) init
{

    if ( (self = [super init]) ) {

        SpaceManager * spaceMgr = [[SpaceManager alloc] init];
        [spaceMgr addWindowContainmentWithFriction:1.0 elasticity:1.0 inset:cpv(5, 5)];

            // This is a layer that draws all the chipmunk shapes
        ChipmunkDrawingLayer *debug = [[ChipmunkDrawingLayer node] initWithSpace:spaceMgr.space];
        [self addChild:debug];

        int ballPeices = 10; // the number of peices I want my ball to be composed of
        int ballRadius = 100;
        float circum = M_PI * (ballRadius * 2);

        float peiceSize = circum / ballPeices;
        float angleIncrement = 360 / ballPeices;

        CGPoint origin = ccp(240, 160);
        float currentAngleIncrement = 0;

            NSMutableArray *peiceArray = [NSMutableArray arrayWithCapacity:ballPeices];

        for (int i = 0; i < ballPeices; i++) {

            float angleIncrementInRadians = CC_DEGREES_TO_RADIANS(currentAngleIncrement);

            float xp = origin.x + ballRadius * cos(angleIncrementInRadians);
            float yp = origin.y + ballRadius * sin(angleIncrementInRadians);

                    // This is wrong, I need to figure out what's going on here.
            float peiceRotation = atan2( origin.y - yp, origin.x - xp);

            cpShape *currentPeice = [spaceMgr addRectAt:ccp(xp, yp) mass:1 width:peiceSize height:10 rotation:peiceRotation];

            currentAngleIncrement += angleIncrement;

                    [peiceArray addObject:currentPeice]; //!! incompatible pointer type

        }



        spaceMgr.constantDt = 0.9/55.0;
        spaceMgr.gravity = ccp(0,-980);
        spaceMgr.damping = 1.0;

    }

    return self;

}

1 个答案:

答案 0 :(得分:0)

不兼容的指针类型很容易解释:)

[NSMutableArray addObject]定义如下:

- (void)addObject:(id)anObject
那么什么是id呢?好问题!请记住,Objective-C仍然是C的核心。根据{{​​3}}

typedef struct objc_object {
    Class isa;
} *id;

这很好,现在我们知道*id但是id本身呢?这是方法签名中引用的内容。为此,我们必须查看Objective-C Programming Guide

typedef id (*IMP)(id, SEL, ...);

显然,cpSpace*不适合,因此如果您尝试使用该消息将这些指针放入NSMutableArray,您将获得不兼容的指针类型。