在Xcode cocos2d中添加多个物理对象时遇到问题

时间:2014-08-01 21:17:46

标签: ios objective-c xcode cocos2d-iphone physics

我是cocos2d和objective-c的新手。我知道我在这里遗漏了一些东西,但我找不到解决办法。希望有人能帮忙......

我的目标是能够点击我放在屏幕上的任何精灵。首先,我在屏幕上放了2个精灵。 (每个精灵都是星形)。

问题是,只有第二个精灵放在屏幕上是可点击的。我的猜测是,当我调用addNewStar时,它会将_star替换为最新的星形精灵,并将之前的_star带出物理节点。我希望我添加的所有星星都在物理节点中并且可以点击。不知道如何做到这一点。

这是我的代码......希望有人可以指出我的错误!

@implementation MainScene {
CCSprite *_star;
CCPhysicsNode *_physicsNode;
CCNode *_ground;
CCLabelTTF *_scoreLabel;
BOOL _gameOver;
CCButton *_restartButton;
}

- (void)didLoadFromCCB {
self.userInteractionEnabled = TRUE;
 [self addNewStar];
 [self addNewStar];
// set collision txpe
_ground.physicsBody.collisionType = @"level";
// set this class as delegate
_physicsNode.collisionDelegate = self;
}

-(void)addNewStar {

//This successfully loads my star onto the screen
_star = (Star *)[CCBReader load:@"Star"];
_star.physicsBody.collisionGroup = @"starGroup";
_star.physicsBody.collisionType = @"star";
_star.position = ccp(200,300);
[_physicsNode addChild:_star];
}

-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode *)star   level:(CCNode *)level {
[self gameOver];
return TRUE;
}

- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

float ranNum1 = (arc4random_uniform(10000));
float ranNum2 = (arc4random_uniform(10000));
float sideForce = ranNum1 - ranNum2;


if (!_gameOver) {

          CGPoint touchLocation = [touch locationInNode:_physicsNode];

        if(CGRectContainsPoint([_star boundingBox], touchLocation))
        {
            [_star.physicsBody applyImpulse:ccp(sideForce, 1000.f)];
            [_star.physicsBody applyAngularImpulse:2500.f];

        }

}

}

- (void)restart {
CCScene *scene = [CCBReader loadAsScene:@"MainScene"];
[[CCDirector sharedDirector] replaceScene:scene];
}

- (void)gameOver {
if (!_gameOver) {

    _gameOver = TRUE;
    _restartButton.visible = TRUE;
    _star.rotation = 90.f;
    _star.physicsBody.allowsRotation = FALSE;
    [_star stopAllActions];

    CCActionMoveBy *moveBy = [CCActionMoveBy actionWithDuration:0.2f position:ccp(-2, 2)];
    CCActionInterval *reverseMovement = [moveBy reverse];
    CCActionSequence *shakeSequence = [CCActionSequence actionWithArray:@[moveBy, reverseMovement]];
    CCActionEaseBounce *bounce = [CCActionEaseBounce actionWithAction:shakeSequence];
    [self runAction:bounce];
}
}


@end

2 个答案:

答案 0 :(得分:1)

你只有一个指向一颗星的指针。所以,当你测试你的触摸开始方法中是否触摸了星星时,当然只有第二个会做任何事情,因为你的唯一指针只指向最近创建的星。

要回答您的问题,您可以采取的简单方法是将每颗星添加到NSArray中。然后在触摸开始的方法中,你可以遍历数组并查看触摸的是哪颗星。

示例:

// Recommend using properties over i-vars
@property (nonatomic, strong) NSMutableArray* starList;

// In init or onEnter...
self.starList = [NSMutableArray array];

// Each time you create a new star...
Star* star = ...;

[self addChild:star];
[self.starList addObject:star];

// In your touches began...
- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    ...

    for (Star* star in self.starList)
    {
        // If star is touched...

        // ...add your impulses, etc
    }
}

答案 1 :(得分:0)

这是我项目中的touchBegan。也许你可以根据需要改变代码。你在这里看到了什么?获得触摸的触摸代码搜索b2Body的位置后。在您的示例中,您需要在_physicsNode中搜索被触摸的_child。

for(UITouch *touch in allTouches)
{
    CGPoint location = [touch locationInView:touch.view];

    location = [[CCDirector sharedDirector] convertToGL:location];
    b2Vec2 worldLoc = b2Vec2(ptm(location.x), ptm(location.y));

 // SEARCH YOUR CHILD FROM NODE HERE

    for (b = world->GetBodyList(); b; b = b->GetNext())
    {
        if (b->GetType() == b2_dynamicBody)


            if (b->IsBullet() == false)
            {
            for (b2Fixture *f = b->GetFixtureList(); f; f = f->GetNext())
            {

                // Hit!
                if (f->TestPoint(worldLoc))
                {

                  //do stuff

                    }
                    break;
                }
            }
            }
    }