Я хотел бы анимировать спрайт в определенном месте на изометрической карте тайлов. Я могу анимировать спрайт на данном слое, но не тогда, когда это спрайт из тайла карты. Например, следующее прекрасно работает:
// make a frame cache
CCSpriteFrameCache *frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
[frameCache addSpriteFramesWithFile:@"spellanim.plist" textureFile:@"spellanim.pvr.ccz"];
// create a sprite
CCSprite *effectSprite = [CCSprite spriteWithSpriteFrameName:@"spell_strength__33.png"];
// set sprite at center of screen
CGSize screenSize = [[CCDirector sharedDirector] winSize];
effectSprite.position = CGPointMake(screenSize.width / 2, screenSize.height / 2);
// create animation using an animation helper (since animationWithName:delay:frames: will be deprecated)
CCAnimation *animation = [CCAnimation animationWithFrame:@"spell_strength__" frameCount:13 delay:0.3f startAt:33];
CCAnimate *animate = [CCAnimate actionWithAnimation:animation];
// run animation on sprite
[effectSprite runAction:animate];
// add sprite as a child of the layer
[self addChild:effectSprite];
Теперь следующее не работает, я предполагаю, что это связано с тем, как работают мозаичные карты (я получаю ошибку подтверждения в CCSprite setTexture:):
// add one to x to offset the spell animation from the player
CGPoint tileCoord = CGPointMake(player.entityTileCoordinate.x + 1, player.entityTileCoordinate.y);
// get the effects layer from the tile map
CCTMXTiledMap *tileMap = (CCTMXTiledMap *)[[TileMapLayer sharedTileMapLayer] getChildByTag:TileMapNode];
CCTMXLayer *effectsLayer = [tileMap layerNamed:@"Effects"];
// get a sprite from the effects layer
CCSprite *effectSprite = [effectsLayer tileAt:CGPointMake(0, 0)];
// move the sprite to the desired location (this works just fine)
CGPoint pointPixel = [effectsLayer positionAt:tileCoord];
[effectSprite runAction:[CCMoveTo actionWithDuration:0.0f position:pointPixel]];
// now animate the sprite
CCSpriteFrameCache *frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
[frameCache addSpriteFramesWithFile:@"spellanim.plist" textureFile:@"spellanim.pvr.ccz"];
CCAnimation *animation = [CCAnimation animationWithFrame:@"spell_strength__" frameCount:13 delay:0.3f startAt:33];
CCAnimate *animate = [CCAnimate actionWithAnimation:animation];
[effectSprite runAction:animate];
Полагаю, это потому, что спрайты анимации не являются частью набора тайлов для этого слоя карты тайлов. Есть ли способ динамически добавлять эти спрайты анимации в некоторый кеш, используемый для рисования на этом слое (в основном, изменять набор плиток во время выполнения)? Могу ли я потом удалить эти спрайты из этого модифицированного набора плиток? Есть ли ограничение 1024x1024 при изменении набора плиток во время выполнения?
В конце дня я действительно хочу, чтобы анимированный спрайт перемещался с одной плитки на другую на карте плиток, но я просто не уверен, как это сделать наиболее эффективным способом. Кажется действительно неуклюжим иметь слой эффектов на карте плиток и набор плиток со всеми анимациями заклинаний (особенно если вы не можете разместить их в разрешении 1024x1024), так как сборка анимации будет объединять обновления GID плиток, когда эффект перемещается по карта тайлов.
Я знаю, что могу делать то, что хочу, когда слой не является частью карты тайлов - я могу анимировать и перемещать спрайт, используя координаты экрана, но когда я знаю, что это координаты тайла, переводя их в координаты экрана (если плитка даже видна на экране) уклонилась от моего понимания до сих пор. Как вы определяете, какие плитки на самом деле «видит» экран? Какова же тогда координата пикселя на экране видимой плитки?
Я ценю любые мысли о том, как идти об этом процессе.