2

我想创建一个动态的 2D 水,我,遵循这个统一教程

http://gamedevelopment.tutsplus.com/tutorials/creating-dynamic-2d-water-effects-in-unity--gamedev-14143

http://gamedevelopment.tutsplus.com/tutorials/make-a-splash-with-2d-water-effects--gamedev-236

还有这个

http://blog.prime31.com/water2d-part1/

这是我的代码

class GameScene: SKScene, SKPhysicsContactDelegate {

    var box: SKSpriteNode!
    var nodes:[SKNode] = []

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        self.anchorPoint = CGPointMake(0.5, 0.5)

        // Set physics body
        let borderBody: SKPhysicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame);
        borderBody.friction = 0.0;
        self.physicsBody = borderBody;

        // Set contact delegate
        self.physicsWorld.contactDelegate = self;

        box = SKSpriteNode(color: UIColor.blackColor(), size: CGSize(width: 200, height: 20))
        box.position = CGPointMake(0, 0)
        box.physicsBody = SKPhysicsBody(rectangleOfSize: box.size)
        box.physicsBody!.dynamic = false

        self.addChild(box)

        let one = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 20, height: 20))
        one.position = CGPointMake(box.position.x - box.frame.size.width/2, box.position.y + box.frame.size.height * 2)

        one.physicsBody = SKPhysicsBody(rectangleOfSize: one.size)
        one.physicsBody!.allowsRotation = false
        self.addChild(one)
        nodes.append(one)
        self.attachPoint(box, point2: one, box: true)

        let two = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 20, height: 20))
        two.position = CGPointMake(box.position.x, box.position.y + box.frame.size.height * 2)

        two.physicsBody = SKPhysicsBody(rectangleOfSize: two.size)
        two.physicsBody!.allowsRotation = false
        self.addChild(two)
        nodes.append(two)
        self.attachPoint(box, point2: two, box: true)

        let three = SKSpriteNode(color: UIColor.greenColor(), size: CGSize(width: 20, height: 20))
        three.position = CGPointMake(box.position.x + box.frame.size.width/2, box.position.y + box.frame.size.height * 2)

        three.physicsBody = SKPhysicsBody(rectangleOfSize: three.size)
        three.physicsBody!.allowsRotation = false
        self.addChild(three)
        nodes.append(three)
        self.attachPoint(box, point2: three, box: true)

        self.attachPoint(one, point2: two, box: false)
        self.attachPoint(two, point2: three, box: false)

    }

    func attachPoint(point1: SKSpriteNode, point2: SKSpriteNode, box: Bool){

        if(box == true){

            let newPoint1 = CGPointMake(self.frame.size.width/2 + point2.position.x, self.frame.size.height/2  + point1.position.y)

            let newPoint2 = CGPointMake(self.frame.size.width/2 + point2.position.x, self.frame.size.height/2  + point2.position.y)

            // create a joint between two bodies
            let joint: SKPhysicsJointSpring = SKPhysicsJointSpring.jointWithBodyA(point1.physicsBody, bodyB: point2.physicsBody, anchorA: newPoint1, anchorB: newPoint2)

            joint.damping = 2.0
            joint.frequency = 9.0;

            self.physicsWorld.addJoint(joint)
        } else {

        let newPoint1 = CGPointMake(self.frame.size.width/2 + point1.position.x, self.frame.size.height/2  + point1.position.y)

        let newPoint2 = CGPointMake(self.frame.size.width/2 + point2.position.x, self.frame.size.height/2  + point2.position.y)

        // create a joint between two bodies
        let joint: SKPhysicsJointSpring = SKPhysicsJointSpring.jointWithBodyA(point1.physicsBody, bodyB: point2.physicsBody, anchorA: newPoint1, anchorB: newPoint2)

        joint.damping = 2.0
        joint.frequency = 9.0;

        self.physicsWorld.addJoint(joint)

        }

    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */

        let node = nodes[2]
        node.physicsBody?.velocity.dy = 20000

    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

这是结果

这个结果没有变化 第一的

touch后,在touchesBegan方法中执行代码 第二

第 2 步之后,节点开始旋转并落在节点下方 最后

如果他们不评价,按照教程我将不得不用节点的颜色制作 SKShapeNode。但是 SKShapeNode 很贵,有没有其他方法可以实现这个效果?

最简单的方法是对水的顶部使用图像并使其来回移动,但它不会是动态的..

如果您曾经玩过 Tiny Wings,那么教程中的水的实现方式完全相同。

我不知道,也许这不能在 SpriteKit 中制作,或者我只是不知道如何

4

0 回答 0