Монстры / враги на платформах (как на Doodlejump) Cocos2d - PullRequest
0 голосов
/ 10 января 2012

Я новичок здесь, поэтому я надеюсь, что вы можете мне помочь.

Я следую учебному пособию по созданию простой игры cocos2d

Учебник Рэя Вендерлиха

Я реализовал это в другой игре, например, в прыжке в стиле каракули.

в указанном уроке монстры / цели свободно перемещаются справа налево от экрана. когда я внедряю это в свое приложение, монстры словно летят слева направо. Что если я хочу, чтобы монстры стояли на платформах так же, как монстр-прыжок? какие конкретные вещи я буду делать?

PS: я пробовал другие вещи в Google, но ничего не работает

Вот код монстров / целей:

- (void)initPlatforms {
//  NSLog(@"initPlatforms");

    currentPlatformTag = kPlatformsStartTag;
    while(currentPlatformTag < kPlatformsStartTag + kNumPlatforms) {
        [self initPlatform];
        currentPlatformTag++;
    }

    [self resetPlatforms];
}

- (void)initPlatform {

    CGRect rect;
    switch(random()%2) {
        case 0: rect = CGRectMake(608,64,102,36); break;
        case 1: rect = CGRectMake(608,128,90,32); break;
    }

    AtlasSpriteManager *spriteManager = (AtlasSpriteManager*)[self getChildByTag:kSpriteManager];
    AtlasSprite *platform = [AtlasSprite spriteWithRect:rect spriteManager:spriteManager];
    [spriteManager addChild:platform z:3 tag:currentPlatformTag];
}


-(void)addTarget {

    Sprite *target = [Sprite spriteWithFile:@"komodo.png"];

    target.position = ccp(300,200);

    [self addChild:target];



    CGSize winSize = [[Director sharedDirector]winSize];
    int minX = target.contentSize.height/2;
    int maxX = winSize.height -target.contentSize.height/2;
    int rangeX = maxX - minX;
    int actualX = (arc4random() % rangeX) +minX;

    int minDuration = 2.0;
    int maxDuration = 4.0;
    int rangeDuration = maxDuration - minDuration;
    int actualDuration = (arc4random() % rangeDuration) + minDuration;

    id actionMove = [MoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width,actualX)];
    id actionMoveDone = [CallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];
    [target runAction:[Sequence actions:actionMove, actionMoveDone,nil]];
    target.tag = 1;
    [_targets addObject:target];


}

Спасибо тем, кто поможет ... вы такие милые.

1 Ответ

2 голосов
/ 11 января 2012

К сожалению, это довольно широкий вопрос, на который сложно ответить определенно.Если вы надеетесь создать реальные платформы, на которые можно будет отскочить (в режиме каракули-прыжка), вам потребуется реализовать обнаружение коллизий между монстрами и 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 движется с платформами :-) Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...