Анимируйте SKSpriteNode с текстурами, размер которых отличается от исходного.

Я хочу анимировать SKSpriteNode, используя текстуры из SKTextureAtlas, используя SKAction.animateWithTextures(textures,timePerFrame,resize,restore). Однако текстуры в атласе имеют размер, который немного больше оригинальной текстуры (в основном это движение персонажа). Когда действие выполняется, текстуры либо сжимаются, чтобы соответствовать исходному размеру спрайта, либо центрируются, когда я устанавливаю resize в false, что изменяет положение персонажа. Однако я хочу, чтобы текстуры были привязаны к левому нижнему углу (или правому нижнему углу, в зависимости от направления), чтобы положение персонажа не менялось, кроме дополнительной части текстуры.

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

У кого-нибудь есть предложение о том, как это сделать?

Спасибо!

Дэйвид


person David    schedule 01.06.2016    source источник


Ответы (1)


Это сработает

  1. Отредактируйте все текстуры, чтобы они соответствовали размеру текстуры самого большого размера.

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

Например. Обратите внимание, что в первой текстуре много пустого пространства (с сайта CartoonSmart.com)

введите здесь описание изображения

  1. Создайте физическое тело с учетом определенного размера. Например. Вы можете загрузить текстуру без заполнения и получить размер. Затем поместите его по мере необходимости на новую и улучшенную текстуру с отступами. Таким образом, после того, как вы создадите Sprite как обычно с новыми текстурами измененного размера, вы можете затем

    /// load a texture to be a template for the size
    let imageTextureSizeTemplate = SKTexture(imageNamed: textureWithoutPadding)
    
    let bodySize = imageTextureSizeTemplate.size()
    
     /// position template texture physics body on texture that will be used  
    let bodyCenter = CGPointMake(0.5, 0.5)
    
    // create physics body
    let body:SKPhysicsBody = SKPhysicsBody(rectangleOfSize: bodySize, center: bodyCeneter)
    
        self.physicsBody = body
    
  2. Установите resize: false при анимации текстур.

person Corey F    schedule 12.06.2016
comment
Я не проверял это в последнее время, но может случиться так, что это не сработает, если текстуры взяты из атласа. SpriteKit, скорее всего, обрежет прозрачное пространство, и ваша логика, вероятно, сломается. Хотя есть обходные пути... - person Whirlwind; 13.06.2016
comment
Он должен работать нормально. Я видел пример трамплина в действии. Каждый кадр находится в текстурном атласе. Если вы хотите увидеть его в действии, вы можете найти его на cartoonsmart.com/... в разделах Springboards. - person Corey F; 14.06.2016