#objective-c #cocos2d-iphone #box2d #box2d-iphone
#objective-c #cocos2d-iphone #box2d #box2d-iphone
Вопрос:
Я создал массив врагов, и когда я добавляю врага, я добавляю соответствующий код 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(amp;bodyDef);
b2CircleShape circle;
circle.m_radius = 26.0/PTM_RATIO;
// Define the dynamic body fixture.
b2FixtureDef fixtureDef;
fixtureDef.shape = amp;circle;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
body->CreateFixture(amp;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:amp;x1 centerY:amp;y1 centerZ:amp;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(amp;callback, aabb);
b2Body* nbody = NULL;
if (callback.m_fixture)
{
nbody= callback.m_fixture->GetBody();
}
if (nbody)
{
b2BodyDef bodyDef;
b2Body* groundBody = _gameScene.world->CreateBody(amp;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(amp;md);
nbody->SetAwake(true);
}
}
Ответ №1:
В вашем методе инициализации, сразу после оператора if, есть ли это в вашем коде:
if(self = [super init]){
self.isTouchEnabled = YES;
Редактировать——————
Instead of using ccArray, you should use this:
CCSprite *_anArray[x];
Когда я имею дело со спрайтами, я всегда помещаю их в массив спрайтов, я объявил его в заголовке. Вы также должны выполнить @property(nonatomic, retain) NSMutableArray *arrowArray;
в файле .h и в файле .m @synthesize arrowArray = _arrowArray;
Затем я просто добавил все свои спрайты в этот массив. Должно сработать.
Комментарии:
1. Да, дело не в том, что touch не включен как таковой, а в том, что вы можете коснуться только одного объекта, я думаю, что я близок к решению проблемы и скоро опубликую решение
2. Ну, я думаю, что знаю, что решит вашу проблему, знайте, что я еще немного прочитал ваш код… Не уверен, но я отредактирую свой ответ и добавлю его в конец
3. Я изменил свой подход, теперь я заменяю стандартный движущийся спрайт на корпус box2d при касании, кажется довольно плавным и делает то, что мне нужно. Спасибо за вашу помощь