2011-05-20 5 views
0

Я делаю игру в Cocos2d. У меня есть враги, которые стреляют, и стрелять персонажа. Я создал отдельный слой для врагов (и их пуль) и отдельный слой для персонажа (и его пуль). Проблема в том, что я не знаю, как обнаружить столкновения между двумя слоями. Обратите внимание: у меня есть сцена в HelloWorldLayer, и каждый из вышеперечисленных слоев является дочерним элементом сцены. Любая помощь приветствуется. Благодаря!Обнаружение столкновений между слоями в Cocos2d?

ответ

1

Почему бы не создать пули на противоположном слое из источника пули, то есть слой А является символом и вражескими пулями, а слой В - врагом и символьными пулями? Тогда ваше обнаружение столкновения будет на одном уровне.

+0

@highlycaffeniated Это звучит великолепно! Но проблема в том, что я не знаю, как добавить ребенка к слою из другого класса, который не является классом Layer. – ipodfreak0313

0

Посмотрите в CGRectIntersectsRect .... Я не сделал Cocos2D в течение длительного времени, но я помню, с помощью планировщика регулярно вызываем метод, который будет обнаруживать столкновения с использованием метода CGRectIntersectsRect ...

Я имел ограниченное количество спрайтов на экране и на каждом проходе метода обнаружения столкновений, я проверил бы, будет ли какой-либо из моих кадров спрайта справиться с рамами моего главного героя, используя CGRectIntersectsRect.

Это, как я это сделал:

Шаг 1: Реализовать метод, который использует CGRectIntersectsRect, чтобы проверить, если спрайт кадры соприкасаются. Это может выглядеть примерно так:

- (BOOL)detectCollision 
{ 
    CGRect frame1 = someframe; 
    CGRect frame2 = anotherframe; 

    if(CGRectIntersectsRect(frame1, frame2)) 
     return YES; 
    else 
     return NO; 
} 

Реализовать Scheduler вызывать ваш метод обнаружения столкновения каждую секунду с помощью:

[self schedule: @selector(detectCollision) interval:0.25]; 

Таким образом, в игре каждый метод collisionDetect называется вы можете обнаружить столкновения. :)

2


Вы можете обнаружить столкновения в Cocos2D использованием CGRectIntersectsRect.
Ваша идея создания отдельных слоев для врагов и пуль может оказаться запутанной. В этом случае вы должны рассмотреть возможность перехода на один уровень. Вы, должно быть, посмотрели на Ray Wenderlich обнаружения столкновения. Если вы не видите Simple Cocos2d game.
Если вам нужна дополнительная помощь, сообщите мне.

+0

Я знаю, как сделать обнаружение столкновений с одним слоем, но как мне это сделать с несколькими? – ipodfreak0313

+0

Нет проблем. Если вы хотите использовать два разных уровня для врага и пуль, а также игрока и его пулю, вы должны сначала создать класс данных, в котором вы можете создавать переменные приложения, которые хранят нужные вам координаты. В первом слое i.e слой игрока просто передаёт требуемые координаты в переменной класса Data. И если вы обнаруживаете столкновение в слое маркеров противника, просто используйте переменную класса данных, содержащую вражеские координаты пули. То же самое касается пулевых и вражеских слоев игрока. – Nitish

+0

Просто взгляните на [Создание класса данных] (http://stackoverflow.com/questions/5798649/how-to-add-data-to-app-to-test-core-data-model/5800828#5800828) , – Nitish

4

Вам необходимо добавить следующие строки, если вы используете бурундук

shape->collision_type = kCollisionTypeParticle; 
cpSpaceAddCollisionHandler(space_, 
          kCollisionTypeParticle, 
          kCollisionTypeParticle, 
          collisonDetect, 
          NULL, 
          NULL, 
          NULL, 
          self); 

Здесь collisonDetect является методом, который мы должны зарегистрироваться как:

cpBool collisonDetect(cpArbiter *arb, struct cpSpace *space, void *data) 
{ 
    <YOUR CLASS> *layer = (<YOUR CLASS> *)data; 
    [layer collisonDetect:arb]; 
    return cpTrue; 
} 

Теперь вот здесь вы будете обрабатывать остальную часть кода

-(void)collisonDetect:(cpArbiter*)arb 
{ 
    NSLog(@"COLLISION DETECTED"); 
} 
Смежные вопросы