2010-04-22 3 views
1

J'ai deux images-objets statiques (STATIC_MASS) SpaceManager. L'un est un enfant de l'autre - je veux dire par là que l'un construit l'autre, mais bien que les images de l'enfant apparaissent au bon endroit, l'enfant ne semble pas exister dans le moteur de la physique tamia, comme je J'attendrais. Dans mon cas, j'ai un panneau (sprite rectangulaire) et un cerceau (un sprite circulaire). Puisque je pourrais vouloir déplacer le panneau arrière, je voudrais attacher le cerceau au panneau arrière de sorte que le cerceau bouge automatiquement juste avec le panneau arrière.Comment faire pour qu'une image-objet statique soit l'enfant d'une autre image-objet dans cocos2D lors de l'utilisation de SpaceManager

Ici, nous voyons un panneau tournant avec un arceau attaché. Cela semble correct sur l'écran, mais d'autres objets rebondissent seulement sur le panneau mais passent à travers le cerceau (dans un mauvais sens du terme). Qu'est-ce que mon sprite ne semble pas exister dans le moteur physique?

// Add Backboard 
    cpShape *shapeRect = [smgr addRectAt:cpvWinCenter mass:STATIC_MASS width:200 height:10 rotation:0.0f ];// We're upgrading this 
    cpCCSprite * cccrsRect = [cpCCSprite spriteWithShape:shapeRect file:@"rect_200x10.png"]; 
    [self addChild:cccrsRect]; 

    // Spin the static backboard: http://stackoverflow.com/questions/2691589/how-do-you-make-a-sprite-rotate-in-cocos2d-while-using-spacemanager 
    // Make static object update moves in chipmunk 
    // Since Backboard is static, and since we're going to move it, it needs to know about spacemanager so its position gets updated inside chipmunk. 
    // Setting this would make the smgr recalculate all static shapes positions every step 
    // cccrsRect.integrationDt = smgr.constantDt; 
    // cccrsRect.spaceManager = smgr; 
    // Alternative method: smgr.rehashStaticEveryStep = YES; 
    smgr.rehashStaticEveryStep = YES; 

    // Spin the backboard 
    [cccrsRect runAction:[CCRepeatForever actionWithAction: 
         [CCSequence actions: 
          [CCRotateTo actionWithDuration:2 angle:180], 
          [CCRotateTo actionWithDuration:2 angle:360], 
          nil] 

         ]]; 


    // Add the hoop 
    cpShape *shapeHoop = [smgr addCircleAt:ccp(100,-45) mass:STATIC_MASS radius: 50 ]; 
    cpCCSprite * cccrsHoop = [cpCCSprite spriteWithShape:shapeHoop file:@"hoop_100x100.png"]; 
    [cccrsRect addChild:cccrsHoop]; 

Le code ci-dessus est un peu brouillé. L'image du cerceau apparaît à côté du tableau, ce que je veux, si je détecte des collisions, la collision ne se produit que dans la partie inférieure gauche de l'écran. Bizarrement, même si je détecte une collision, mon objet ne semble pas vraiment entrer en collision, il le traverse simplement au lieu de rebondir.

Note: SpaceManager est une boîte à outils pour travailler avec Cocos2d-iphone

+0

Note de la balise: Cela devrait probablement avoir une balise 'spacemanager' –

Répondre

1

La réponse simple à cela est que ce n'est pas vraiment possible. Chipmunk aime que tout soit dans les coordonnées du monde et quand vous commencez à créer des relations parents-enfants dans cocos2d vous installez une mauvaise correspondance entre les systèmes de coordonnées ...

Cependant ... J'ai essayé de résoudre ce problème sans beaucoup de succès (le problème étant la rotation je crois) Regardez la fonction "eachShapeAsChildren" dans SpaceManager.m. Si vous définissez la propriété iterateFunc de SpaceManager pour pointer vers cette fonction, vous pouvez voir ce qui se passe ....

À un moment donné, je peux essayer de nouveau; en fait je me sens déjà plus inspiré.

2

Le problème est qu'une relation parent-enfant n'a pas de sens dans un moteur physique. Vous pouvez attacher plusieurs formes au même corps de sorte que lorsque vous déplacez le corps, il déplace plusieurs formes.

Questions connexes