Как я могу хранить cpShape в SpaceManager в виде массива? - PullRequest
1 голос
/ 07 июля 2010

Я пытаюсь создать мягкий шар с Cocos2d и Бурундуком (через SpaceManager), используя кучу канатов, соединенных вместе, а затем соединенных пружинами с центральным телом.

Что-то вроде этих примеров

Но для этого, я думаю, мне нужно сохранить все 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 голосов
/ 07 июля 2010

Несовместимый тип указателя легко объяснить:)

[NSMutableArray addObject] определяется следующим образом:

- (void)addObject:(id)anObject

Так что же тогда означает id?Отличный вопрос!Помните, что Objective-C по-прежнему является C по своей сути.В соответствии с Objective-C Руководство по программированию

typedef struct objc_object {
    Class isa;
} *id;

Отлично, теперь мы знаем о *id, но как насчет самого id?Это то, что указано в сигнатуре метода.Для этого нам нужно взглянуть на objc.h

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

Очевидно, что cpSpace* не подходит, так что вы получите несовместимый тип указателя, если попытаетесьпоместите их в NSMutableArray, используя это сообщение.

...