К сожалению, это довольно широкий вопрос, на который сложно ответить определенно.Если вы надеетесь создать реальные платформы, на которые можно будет отскочить (в режиме каракули-прыжка), вам потребуется реализовать обнаружение коллизий между монстрами и ccNodes платформы.В Интернете есть множество учебных пособий по обнаружению столкновений cocos2d, как простой реализации, так и более продвинутым решениям на основе box 2d / chipmunk.
Если вы хотите довольно близко клонировать каракули, существует версия клона с открытым исходным кодом.доступно на github здесь - хотя я на самом деле не смотрел на код.
Наконец, если вы имеете в виду, что вы просто хотите ограничить движение монстров в определенной областиэкрана (чтобы они не продолжали двигаться от края), вам просто нужно расположить цель в области экрана и изменить ccAction
так, чтобы ccMoveTo
использовал самую левую точку «платформы» в качествеСамая дальняя точка слева может двигаться в крайнюю правую точку, как самая правая.(Признаюсь, я не играл в Doodle Jump, поэтому понятия не имею, что на самом деле делают враги).
Если враги бегут взад-вперед по платформе, вам следует использовать ccRepeatForever в последовательности движения и у вас есть две конечные позиции в CCSequence
: одна перемещает монстра влево от платформы, другая перемещает его вправо.
Дополнительная информация
Хорошо, я вижу, что вы пытаетесь сделать.Это должно помочь вам начать:
Платформы создаются в initPlatforms
.Это вызывает initPlatform
несколько раз.Это берет изображение из AtlasSprite
для платформы, создает ccSprite
для каждой платформы и присваивает ей уникальный тег.
Затем в - (void)step:(ccTime)dt
он проходит по всем платформам и перемещает их в правильное положение в зависимости от того, как далеко продвинулась птица:
for(t; t < kPlatformsStartTag + kNumPlatforms; t++) {
AtlasSprite *platform = (AtlasSprite*)[spriteManager getChildByTag:t];
//etc...
Итак, бит, который вы ждетеfor:
Если вы хотите добавить монстра на эти платформы, вы должны будете следовать аналогичному шаблону.Чтобы начать, попробуйте что-то вроде этого (хотя вы хотите иметь более чистый дизайн, чем этот, но это должно поставить вас на правильный путь)
в initPlatform
добавьте следующее в конец функции
// add a monster sprite
AtlasSprite *monster = [AtlasSprite spriteWithRect:CGRectMake(608,128,64,64) spriteManager:spriteManager];
[spriteManager addChild:monster z:3 tag:currentPlatformTag + 1000];
(Я только что получил изображение из существующего Атласа. Вы можете заменить вышеприведенное на свой фактический спрайтовый объект 'Monster'. Обратите внимание, я добавляю 1000 к currentPlatformTag
. Это только для тестирования;в конечном итоге у вас должна быть monsterTag
реализация.
Так что теперь у каждой платформы есть «монстр» (опять же, вы будете стремиться только к случайным платформам), поэтому нам нужно обновить позиции для монстров.
В - (void)step:(ccTime)dt
сразу после получения текущей платформы
AtlasSprite *platform = (AtlasSprite*)[spriteManager getChildByTag:t];
Теперь вам также нужно получить текущего монстра (не забывая использовать обновленное значение тега, которое мы создали для «монстров»:
AtlasSprite *monster = (AtlasSprite*)[spriteManager getChildByTag:t + 1000];
Затем, несколькими строками ниже, где мы переместим платформу, нам нужно будет переместить монстра
platform.position = pos;
// We update the monster and set it a 32 pixels above the platform:
monster.position = ccp(pos.x, pos.y + 32);
Так что теперь у каждой платформы есть монстр, у которого y position движется с платформами :-) Надеюсь, это поможет