代码之家  ›  专栏  ›  技术社区  ›  Ankit Kumar

如何将物理体添加到SKAtlasTexture或通过Images.xcassets创建动画?

  •  2
  • Ankit Kumar  · 技术社区  · 9 年前

    我想创建一个汽车在路上行驶的小动画,所以我制作了一个包含9张不同图片的图集。这辆车看起来只是车轮在转动,而且在行驶时有点弹跳。我已经制作了一个带有图像的SKSpriteNode,并在上面添加了一个物理体,这样它就可以跳跃并受重力影响。

    所以我想知道如何将物理体添加到SKAtlasTexture或通过我的图像创建动画。xcassets文件夹。我试图将SKSpriteNode更改为SKAtlasTexture,但这显然不起作用,因为SKAtlas Texture中没有物理体。这就是我现在的处境。如有任何建议或解决方案,将不胜感激。

    这里是我代码的一些部分:

    class PlayScene: SKScene, SKPhysicsContactDelegate {
    
    let road = SKSpriteNode(imageNamed: "road")
    var origRoadPositionX = CGFloat(0)
    var maxRoad = CGFloat(0)
    var groundSpeed = 3
    var carBaseLine = CGFloat(0)
    let car = SKSpriteNode(imageNamed: "car")
    
    
    
    
    enum ColliderType:UInt32{
        case car = 1
        case tower = 2
    }
    
    
    
    override func didMoveToView(view: SKView) {
        self.backgroundColor = UIColor(hex: 0x80E8FF)
    
        self.physicsWorld.contactDelegate = self
        //Car
        self.car.position = CGPointMake(CGRectGetMinX(self.frame)-20 + self.car.size.width, self.carBaseLine)
        self.car.physicsBody = SKPhysicsBody (rectangleOfSize: self.car.size)
        self.car.physicsBody?.allowsRotation = false
        self.car.physicsBody?.affectedByGravity = false
        self.car.physicsBody?.categoryBitMask = ColliderType.car.rawValue
        self.car.physicsBody?.contactTestBitMask = ColliderType.tower.rawValue
        self.car.physicsBody?.collisionBitMask = ColliderType.tower.rawValue
        self.addChild(car)
    

    如果需要更多的代码来找到解决方案,请告诉我,我可以提供更多的代码。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Community Egal    4 年前

    可以使用atlas文件夹对图像执行动画。

    考虑以下示例:

    import SpriteKit
    
    class GameScene: SKScene {
        
        var bombFrames : [SKTexture]!
        var bomb : SKSpriteNode!
        let NoneCategory   : UInt32 = 0x1 << 0
        let ProjectileCategory  : UInt32 = 0x1 << 2
        let bombCategory : UInt32 = 0x1 << 7
        
        override func didMoveToView(view: SKView) {
            /* Setup your scene here */
            runAction(SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock(addBomb), SKAction.waitForDuration(5.0)])))
        }
        
       
        override func update(currentTime: CFTimeInterval) {
            /* Called before each frame is rendered */
        }
        
        func addBomb() {
            
            let Name = "Bomb"
            let AnimatedAtlas = SKTextureAtlas(named: Name)
            var Framese = [SKTexture]()
            let numImages = AnimatedAtlas.textureNames.count
            for var i=1; i<=numImages; i++ {
                let TextureName = "\(i)"
                Framese.append(AnimatedAtlas.textureNamed(TextureName))
            }
            bombFrames = Framese
            
            let firstFrame = bombFrames[0]
            bomb = SKSpriteNode(texture: firstFrame)
            let actualY = random(min: bomb.size.height/2, max: size.height - bomb.size.height/2)
            bomb.position = CGPoint(x: size.width + bomb.size.width/2, y: actualY)
            bomb.physicsBody = SKPhysicsBody(texture: bomb.texture, size: bomb.texture!.size())
            bomb.physicsBody?.dynamic = true
            bomb.physicsBody?.categoryBitMask = bombCategory
            bomb.physicsBody?.contactTestBitMask = ProjectileCategory
            bomb.physicsBody?.collisionBitMask = NoneCategory
            bomb.physicsBody?.usesPreciseCollisionDetection = true
            addChild(bomb)
            
            let actualDuration = random(min: CGFloat(2.0), max: CGFloat(4.0))
            let actionMove = SKAction.moveTo(CGPoint(x: -bomb.size.width/2, y: actualY), duration: NSTimeInterval(actualDuration))
            let actionMoveDone = SKAction.removeFromParent()
            bomb.runAction(SKAction.sequence([actionMove, actionMoveDone]))
            playBombAnimation()
        }
        
        func random() -> CGFloat {
            return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
        }
        
        func random(#min: CGFloat, max: CGFloat) -> CGFloat {
            return random() * (max - min) + min
        }
        
        func playBombAnimation() {
            
            bomb.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(bombFrames, timePerFrame: 0.1, resize: false, restore: true)), withKey:"bombAnimation")
        }
    }
    

    别忘了像这样在项目导航器中添加图集文件夹:

    enter image description here

    正如您在代码中看到的,您可以将物理体添加到精灵中。如果你愿意,你可以试试这种方式。

    希望这会有所帮助。