Objective-C 和 Box2D 多精灵触摸检测

发布于 2024-12-12 03:42:44 字数 2871 浏览 0 评论 0原文

我创建了一系列敌人,当我添加敌人时,我添加了适当的 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);
    }
}

I have created an array of enemies and when I add an enemy I add the appropriate box2d code, however I have found that none of my enemies can be touched, I am not sure what is causing this but from what I can tell it never returns a fixture.

I have tried setting the user data but then I do not get multiple items.

This is how I add my sprite etc

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);
  }
}

I then use my touch handler to try and return what item has been touched

- (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);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忘东忘西忘不掉你 2024-12-19 03:42:44

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

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

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

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

当我处理精灵时,我总是将它们放入精灵数组中,我在标题中声明了它。您还必须在 .h 文件和 .m @synthesize arrowArray = _arrowArray; 中执行 @property(nonatomic, keep) NSMutableArray *arrowArray;
然后我将所有精灵添加到该数组中。应该有效。

In your init method, right after the if statement, is this in your code:

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

EDIT------------------

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

When I deal with sprites I always put them in a sprite array, I declared it in the header. You also have to do the @property(nonatomic, retain) NSMutableArray *arrowArray; in the .h file and in the .m @synthesize arrowArray = _arrowArray;
Then I just added all my sprites into that array. Should work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文