如何抛出SKSpriteNode?

Ste*_*sse 15 ios sprite-kit swift

所以基本上在我的游戏中我需要抛掷或抛出一个物体.到目前为止,我有一个精灵,它可以被拖动,但它不能被抛出.游戏的想法是抛出一个精灵与另一个精灵碰撞.我想要我们将调用testNode的精灵,移动用户抛出它的方式

意思是,当我释放精灵时,我希望它继续向我移动它的方向.我花了很多年时间试图解决这个问题,但我不能.我正在使用适用于iOS 8+的SpriteKit.如果有人可以提供帮助请.

这是我看过的视频,但它与GameSalad有关,这是另一个故事.你可以看看

https://www.youtube.com/watch?v=nn3lWa5jUGE

(如果您需要进一步联系,请回复)

import Foundation;
import SpriteKit;

class Level:SKScene {

TestNode:Test? //Test is a class I made

//Removed the update and touches began due to it being irrelevant to what I need help with. 

  override func didMoveToView(view: SKView){
    testNode = Fruit(imageNamed: "apple_idle")
    testNode?.position = CGPointMake(60, 294)
    testNode?.xScale = 0.5
    testNode?.yScale = 0.5
    self.addChild(testNode!)
  }
  override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {

    var nodeTouched = SKNode()
    var currentNodeTouched = SKNode()

    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)

        nodeTouched = self.nodeAtPoint(location)
        testNode?.position = location
    }
}

 override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {

    var touch: UITouch = touches.anyObject() as UITouch
    var location: CGPoint = touch.locationInNode(self) as CGPoint


}
Run Code Online (Sandbox Code Playgroud)

Epi*_*yte 28

这里有一个简单的例子,我通过在游戏循环中模拟其速度来移动带有触摸的精灵,而不是直接设置位置.这使得精灵更加动态(即你可以"抛出"它,并让它在拖动精灵时与其他物理体交互).不需要角度计算,我只是计算在一段时间内将精灵移动到触摸位置所需的速度.在这种情况下,我将时间设置为1/60,以便瞬间应用运动,使对象看起来非常敏感.

import SpriteKit
class GameScene: SKScene {
    var sprite: SKSpriteNode!
    var touchPoint: CGPoint = CGPoint()
    var touching: Bool = false
    override func didMoveToView(view: SKView) {
        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        sprite = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 50, height: 50))
        sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
        sprite.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0)
        self.addChild(sprite)
    }
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first as! UITouch
        let location = touch.locationInNode(self)
        if sprite.frame.contains(location) {
            touchPoint = location
            touching = true
        }
    }
    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first as! UITouch
        let location = touch.locationInNode(self)
        touchPoint = location
    }
    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
        touching = false
    }

    override func update(currentTime: CFTimeInterval) {
        if touching {
            let dt:CGFloat = 1.0/60.0
            let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y)
            let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt)
            sprite.physicsBody!.velocity=velocity
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以自己微调phyiscs计算,以获得您想要的效果.但是这段代码应该足以让你入门.我能想到的一些改进可能会限制速度,因此物体在释放时不能移动得太快.在触摸拖动中添加延迟,以便移动精灵但在最后意外停止短时继续抛出对象.