How to create a vertical scrolling menu in spritekit?

后端 未结 4 1322
悲&欢浪女
悲&欢浪女 2020-12-02 13:56

I\'m looking to create a shop in my game (In SpriteKit) with buttons and images, but I need the items to be scrollable so the player can scroll up and down the shop (Like a

4条回答
  •  隐瞒了意图╮
    2020-12-02 14:38

    You have 2 options

    1) Use a UIScrollView

    Down the road this is the better solution as you get things such as momentum scrolling, paging, bounce effects etc for free. However you have to either use a lot of UIKit stuff or do some sub classing to make it work with SKSpritenodes or labels.

    Check my project on gitHub for an example

    https://github.com/crashoverride777/SwiftySKScrollView

    2) Use SpriteKit

    Declare 3 class variables outside of functions(under where it says 'classname': SKScene):
    var startY: CGFloat = 0.0
    var lastY: CGFloat = 0.0
    var moveableArea = SKNode()
    

    Set up your didMoveToView, add the SKNode to the scene and add 2 labels, one for the top and one for the bottom to see it working!

    override func didMoveToView(view: SKView) {
        // set position & add scrolling/moveable node to screen
        moveableArea.position = CGPointMake(0, 0)
        self.addChild(moveableArea)
    
        // Create Label node and add it to the scrolling node to see it
        let top = SKLabelNode(fontNamed: "Avenir-Black")
        top.text = "Top"
        top.fontSize = CGRectGetMaxY(self.frame)/15
        top.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMaxY(self.frame)*0.9)
        moveableArea.addChild(top)
    
        let bottom = SKLabelNode(fontNamed: "Avenir-Black")
        bottom.text = "Bottom"
        bottom.fontSize = CGRectGetMaxY(self.frame)/20
        bottom.position = CGPoint(x:CGRectGetMidX(self.frame), y:0-CGRectGetMaxY(self.frame)*0.5)
        moveableArea.addChild(bottom)
    }
    

    Then set up your touches began to store position of your first touch:

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        // store the starting position of the touch
        let touch: AnyObject? = touches.anyObject();
        let location = touch?.locationInNode(self)
        startY = location!.y
        lastY = location!.y
    }
    

    Then set up touches moved with the following code to scroll the node by to the limits set, at the speed set:

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        let touch: AnyObject? = touches.anyObject();
        let location = touch?.locationInNode(self)
        // set the new location of touch
        var currentY = location!.y
    
        // Set Top and Bottom scroll distances, measured in screenlengths
        var topLimit:CGFloat = 0.0
        var bottomLimit:CGFloat = 0.6
    
        // Set scrolling speed - Higher number is faster speed
        var scrollSpeed:CGFloat = 1.0
    
        // calculate distance moved since last touch registered and add it to current position
        var newY = moveableArea.position.y + ((currentY - lastY)*scrollSpeed)
    
        // perform checks to see if new position will be over the limits, otherwise set as new position
        if newY < self.size.height*(-topLimit) {
            moveableArea.position = CGPointMake(moveableArea.position.x, self.size.height*(-topLimit))
        }
        else if newY > self.size.height*bottomLimit {
            moveableArea.position = CGPointMake(moveableArea.position.x, self.size.height*bottomLimit)
        }
        else {
            moveableArea.position = CGPointMake(moveableArea.position.x, newY)
        }
    
        // Set new last location for next time
        lastY = currentY
    }
    

    All credit goes to this article

    http://greenwolfdevelopment.blogspot.co.uk/2014/11/scrolling-in-sprite-kit-swift.html

提交回复
热议问题