2011-10-26 48 views
0

我有一个非常恼人的问题。我创建了一系列敌人,当我添加一个敌人时,我添加了合适的box2d代码,但是我发现我的敌人没有一个可以被触摸,我不确定是什么造成了这一点,但从我可以告诉它永远不会返回一个灯具,任何人都可以帮忙。Objectice-C和Box2D多精灵触摸检测

我已经尝试设置用户数据,但后来我没有得到多个项目。如果有人需要源请让我知道提前

由于这是怎么添加我的精灵等

for (int i = 0; i < EnemyType_MAX; i++) 
{ 
    CCArray* enemiesOfType = [enemies objectAtIndex:i]; 
    int numEnemiesOfType = [enemiesOfType capacity]; 

    for (int j = 0; j < numEnemiesOfType; j++) 
    { 
    EnemyEntity* enemy = [[EnemyEntity alloc]init:_gameScene enemyType:EnemyTypeBreadman]; 
    [batch addChild:enemy z:0 tag:i]; 
    [enemiesOfType addObject:enemy]; 
    [allEnemies addObject:enemy]; 

    b2BodyDef bodyDef; 
    bodyDef.type = b2_dynamicBody; 
    bodyDef.position.Set(self.position.x/PTM_RATIO, self.position.y/PTM_RATIO); 
    bodyDef.userData = self; 
    b2Body *body = _gameScene.world->CreateBody(&bodyDef); 

    b2CircleShape circle; 
    circle.m_radius = 26.0/PTM_RATIO; 

    // Define the dynamic body fixture. 
    b2FixtureDef fixtureDef; 
    fixtureDef.shape = &circle; 
    fixtureDef.density = 1.0f; 
    fixtureDef.friction = 0.3f; 
    body->CreateFixture(&fixtureDef); 

    } 
} 

然后我用我的触摸处理程序尝试,并返回已经触碰了什么项目

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    //NSLog(@"ccTouchesBegan %@", (_mouseJoint!= NULL) ? @"YES" : @"FALSE"); 
    if (_gameScene.mouseJoint != NULL) return; 

    UITouch *myTouch = [touches anyObject]; 
    CGPoint location = [myTouch locationInView:[myTouch view]]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 

    float move = 0.0f, x1, y1, z1; 

    [_gameScene.camera centerX:&x1 centerY:&y1 centerZ:&z1]; 

    b2Vec2 locationWorld = b2Vec2((location.x+x1)/PTM_RATIO, (location.y+y1)/PTM_RATIO); 
    NSLog(@"ccTouchesBegan %@",NSStringFromCGPoint(location)); 

    b2AABB aabb; 
    aabb.lowerBound.Set(-1.0f+locationWorld.x, -1.0f+locationWorld.y); 
    aabb.upperBound.Set(1.0f+locationWorld.x, 1.0f+locationWorld.y); 
    b2Vec2 callPoint; 
    callPoint.Set (locationWorld.x,locationWorld.y); 
    QueryCallback callback(callPoint); 
    _gameScene.world->QueryAABB(&callback, aabb); 

    b2Body* nbody = NULL; 
    if (callback.m_fixture) 
    { 
     nbody= callback.m_fixture->GetBody(); 
    } 

    if (nbody) 
    { 
     b2BodyDef bodyDef; 
     b2Body* groundBody = _gameScene.world->CreateBody(&bodyDef); 

     b2MouseJointDef md; 
     md.bodyA = groundBody; 
     md.bodyB = nbody; 
     md.target = locationWorld; 

     #ifdef TARGET_FLOAT32_IS_FIXED 
      md.maxForce = (nbody->GetMass() < 16.0)? (1000.0f * nbody->GetMass()) : f  loat32(16000.0); 
     #else 
      md.maxForce = 1000.0f * nbody->GetMass(); 
     #endif 

     _gameScene.mouseJoint = (b2MouseJoint *)_gameScene.world->CreateJoint(&md); 
     nbody->SetAwake(true); 
    } 

} 
+0

固定格式建议 –

回答

1

在你的init方法,if语句之后,这是在你的代码:

if(self = [super init]){ 
    self.isTouchEnabled = YES; 

编辑------------------

Instead of using ccArray, you should use this: 
CCSprite *_anArray[x]; 

当我对付精灵,我总是把它们放在一个精灵阵列,我宣布它在头。你还必须在.h文件中和.m中执行@property(nonatomic, retain) NSMutableArray *arrowArray;然后我只是将所有我的精灵加入到该数组中。应该管用。

+0

是的,它不是那种触摸没有启用,因为它更多,你只能触摸一个对象,我认为我接近解决问题,并会尽快发布解决方案 –

+0

嗯,我想我知道什么会解决你的问题知道我已经阅读了你的代码更多...不知道,但我会编辑我的答案,并将其添加到它的末尾 – Gabe

+0

我改变了我的方法,我现在替换标准的移动精灵与box2d身体接触,似乎很无缝,做我所需要的。谢谢你的帮助 –