Как анимировать тайловую карту

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

    `CCSprite* sprite1 = [CCSprite spriteWithFile:@"enemy.png"];
    sprite1.position = ccp(464, 80);
    [self addChild:sprite1];
    [sprite1 runAction:[CCSequence actions:
                        [CCMoveBy actionWithDuration:1 position:ccp(0, 150)],
                        [CCMoveBy actionWithDuration:1 position:ccp(0, -200)], nil]];`

который анимирует спрайт, но остается на карте. Если я добавлю его на тайловую карту, он будет отображаться только тогда, когда игрок находится близко. Но я не совсем уверен, как это сделать. заранее спасибо


person user3288650    schedule 09.02.2014    source источник


Ответы (1)


Не делайте этого на тайловой карте, вы кодируете собственное поведение для этого конкретного персонажа, работайте отдельно от TileMap. Вам придется работать с датчиками, если вы планируете получить эффективный код, возможно, Box2D или встроенный движок Chipmunk, который недавно полностью интегрировали в CocosV3, или «простой» выход из этого, если вы не планируете создавая скользящий сценарий, вы можете работать с простыми координатами и прослушивателем событий в методе обновления, поэтому, когда «персонаж» достигает точки, в которой вы хотите, чтобы появился призрак, тогда вы можете реализовать этот метод.

Оберните пользовательское поведение в класс, который вы можете использовать повторно, например, в класс с именем sensorSprite. После того, как вы закодируете поведение по умолчанию для класса, вы можете создать методы для создания экземпляра объекта с определенными координатами для создания датчика вокруг или что-то еще интересное. вещи.

Вот как может выглядеть ваш класс.

Файл заголовка

@interface SensorSprite : CCSprite {
    kCharacterState currentState;
}


-(id)initWithSpriteFrame:(CCSpriteFrame *)spriteFrame inCoordinates:(CGPoint)spawnLocation withParent:(id)theParent;


-(void)updateSensorSpriteWithCharacters:(NSMutableArray*)charactersArray;

@end

Файл реализации

typedef enum {
    kCharacterStateAlive,
    kCharacterStateDead,
    kCharacterStateAppearing,
    kCharacterStateDissapearing

}kCharacterState;


#import "SensorSprite.h"

@implementation SensorSprite

-(id)initWithSpriteFrame:(CCSpriteFrame *)spriteFrame inCoordinates:(CGPoint)spawnLocation withParent:(id)theParent{
    self = [CCSprite spriteWithImageNamed:@"enemy.png"];
    self.position = ccp(464, 80);
    [theParent addChild:self];
    return self;

}


-(void)updateSensorSpriteWithCharacters:(NSMutableArray *)charactersArray {

    //If you're planning on having different characters to update your state from then you should use tags.

    for (int i=0; i<=charactersArray.count-1; i++) {
        CCSprite *characterInArray = [charactersArray objectAtIndex:i];
        if (CGRectIntersectsRect([characterInArray boundingBox], [self boundingBox])) {
            //What happens when the CG Rects from this class and another one intersects.
            //For making reactive to encountering different sprites, you should use tags , and on each cycle detect what sprite is the one colliding by looking at it's tag.


        }
    }

}


-(void)changeStateTo:(kCharacterState)theState {
    if (currentState==theState) {
        //It's the same state.
        return;
    }

    switch (theState) {
        case kCharacterStateAlive:
            //What happens when character state alive.
            break;
        case kCharacterStateDead:
            //What happens when character state dead
            break;
        case kCharacterStateAppearing:
            //What happens when character state reapearing
            break;
        case kCharacterStateDissapearing:
            //What happens when character state dissapearing.

        default:
            break;
    }

    //After doing the required we set our current state to the changed state.
    currentState = theState;
}

@end

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

person Joel Hernandez    schedule 09.02.2014
comment
Если я использую простой метод координат в новом классе «sensorSprite», могу ли я использовать тот же код, что и выше, а затем просто добавить что-то в метод обновления? - person user3288650; 09.02.2014
comment
@user3288650 user3288650 Обновил пост, добавил пример кода. - person Joel Hernandez; 09.02.2014