如何抛出 SKSpriteNode? [英] how to throw SKSpriteNode?

查看:20
本文介绍了如何抛出 SKSpriteNode?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以基本上在我的游戏中我需要扔东西.到目前为止,我有一个精灵,它可以拖动但不能扔.游戏的想法是抛出一个精灵与另一个精灵碰撞.我想要我们称之为 testNode 的精灵,移动用户扔它的位置

So basically in my game i need to toss or throw an object. So far i have a sprite, It can be dragged but it cannot be thrown. the games idea is to throw a sprite to collide with another sprite. I want the sprite which we will call testNode, To move how where the user had thrown it

意思是,当我释放精灵时,我希望它继续朝着我移动它的方向前进.我花了很长时间试图解决这个问题,但我做不到.我正在为 iOS 8+ 使用 SpriteKit.如果有人可以帮忙,请做.

meaning, when i release the sprite i want it to continue in the direction that i moved it . I have spent ages trying to work this out but I just can't. I am using SpriteKit for iOS 8+. If anybody can help please do.

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

Theres a video I saw but it was with GameSalad which is another story. You can have a look

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

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

(Reply if you may need further contact)

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


}

推荐答案

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

Here is a quick example I wrote of moving a sprite with touch by simulating its velocity in the game-loop as opposed to setting the position directly. This makes the sprite more dynamic (i.e. you can "throw" it, and let it interact with other physics bodies as your drag the sprite). No angle calculations are needed, i'm simply calculating the necessary velocity to move the sprite to the touch position over some interval of time. In this case I set the time as 1/60 so that the motion is applied instantaneously so the object appears very responsive.

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
        }
    }
}

您可以自己微调物理计算以获得所需的效果.但是这段代码应该足以让你开始.我能想到的一些增强功能可能会限制速度,这样物体在释放时就不会移动得太快.为触摸拖动添加延迟,以便移动精灵但在结束时意外停止,继续抛出对象.

You can fine-tune the phyiscs calculations yourself to get the desired effect you are looking for. But this code should be enough to get you started. Some enhancements I could think of are possibly capping the velocity so the object can't move too fast when released. Adding a delay to the touch-drag so that moving the sprite but then accidentally stopping short at the end continues to throw the object.

这篇关于如何抛出 SKSpriteNode?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆