Logicky Blog

Logickyの開発ブログです

Xcode Swift - SKShapeNodeと重力

SKShapeNode

SpriteKitを使ってるときに、四角形とか丸とかを作りたいときに使う。

//長方形
let rect = SKShapeNode(rectOfSize: CGSize(width: 50, height: 50))
rect.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.5)
rect.lineWidth = 5.0
rect.strokeColor = SKColor.blueColor()
rect.fillColor = SKColor.blueColor()
self.addChild(rect)

//円
let circle = SKShapeNode(circleOfRadius: 10)
circle.lineWidth = 0.0
circle.fillColor = SKColor.greenColor()
circle.position = CGPoint(x: self.size.width * 0.5, y:self.size.height - 20)
self.addChild(circle)

重力加えてみる

下記のようにphysicsWorld.gravityにCGVectorを設定する。

class GameScene : SKScene{

    override func didMoveToView(view: SKView) {
        //重力
        self.physicsWorld.gravity = CGVector(dx: 0.0, dy: -2.0)

        //長方形
        let rect = SKShapeNode(rectOfSize: CGSize(width: 50, height: 50))
        rect.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.5)
        rect.lineWidth = 5.0
        rect.strokeColor = SKColor.blueColor()
        rect.fillColor = SKColor.blueColor()

        let physicsBody = SKPhysicsBody(rectangleOfSize: rect.frame.size)
        physicsBody.dynamic = false //重力無効にする
        rect.physicsBody = physicsBody
        self.addChild(rect)

        //円
        let radius:CGFloat = 10
        let circle = SKShapeNode(circleOfRadius: radius)
        circle.lineWidth = 0.0
        circle.fillColor = SKColor.greenColor()
        circle.position = CGPoint(x: self.size.width * 0.5, y:self.size.height - 20)

        circle.physicsBody = SKPhysicsBody(circleOfRadius: radius) //重力有効にする

        self.addChild(circle)
    }

}

画像も追加してみる

画像はSKSpriteNodeというのを使ってつくれる。

class GameScene : SKScene{

    override func didMoveToView(view: SKView) {
        //重力
        self.physicsWorld.gravity = CGVector(dx: 0.0, dy: -2.0)

        //長方形
        let rect = SKShapeNode(rectOfSize: CGSize(width: 50, height: 50))
        rect.position = CGPoint(x: self.size.width * 0.5, y: self.size.height * 0.5)
        rect.lineWidth = 4.0
        rect.strokeColor = SKColor.blueColor()
        rect.fillColor = SKColor.blueColor()
        let physicsBody = SKPhysicsBody(rectangleOfSize: rect.frame.size)
        physicsBody.dynamic = false //重力無効にする
        rect.physicsBody = physicsBody
        self.addChild(rect)

        //円
        let radius:CGFloat = 10
        let circle = SKShapeNode(circleOfRadius: radius)
        circle.lineWidth = 0.0
        circle.fillColor = SKColor.greenColor()
        circle.position = CGPoint(x: self.size.width * 0.5 - 28, y:self.size.height - 20)
        circle.physicsBody = SKPhysicsBody(circleOfRadius: radius) //重力有効にする
         self.addChild(circle)

        //画像
        let texture = SKTexture(imageNamed: "rocket")
        let img = SKSpriteNode(texture: texture)
        img.position = CGPoint(x: self.size.width * 0.5, y:self.size.height - 100)
        img.physicsBody = SKPhysicsBody(texture: texture, size: img.size)
        self.addChild(img)
    }

}