当前位置: 首页 > 面试题库 >

如何抛出SKSpriteNode?

冉德元
2023-03-14
问题内容

因此,基本上在我的游戏中,我需要抛掷或扔出一个物体。到目前为止,我有一个精灵,可以拖动它,但是不能抛出它。游戏的想法是扔一个精灵与另一个精灵碰撞。我想要一个我们称之为testNode的精灵,以移动用户将其扔到何处

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

我看到了一个视频,但那是与GameSalad有关的,这是另一个故事。你可以看看

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

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,以便立即应用运动,从而使对象显得反应灵敏。

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

在此处输入图片说明

您可以自己调整物理量计算,以获得所需的效果。但是这段代码应该足以让您入门。我想到的一些增强功能可能会限制速度,以使对象在释放时不会移动得太快。给触摸拖动增加延迟,以便移动精灵,但意外地在结尾处短暂停止,则继续抛出对象。



 类似资料:
  • 我知道JVM有一个异常表,它映射在给定字节码索引中可以抛出的可能异常。我还读到athrow字节码抛出了堆栈顶部存在的引用类型的exception。我的问题更多地涉及像irem这样的指令如何“抛出”异常。 JVM是否会在每次指令执行后检查堆栈的顶部,以检查是否存在异常?如果你能洞察到这件事的话,你会很感激的。

  • 我创建了一个解决运动方程问题的交互式类(在用户输入循环中的另一个类中访问:mathiverse),它工作得很好,但是在给出答案之后,它抛出了一个。 答案给出后,我希望我的代码继续搜索输入,但它抛出了这样的消息: 线程“main”java.util.NosuchelementException异常:在mathiverse.main(mathiverse.java.53)的java.base/java

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 我正在使用改造下载一些媒体文件,如视频,mp3,jpg,pdf。在我的应用程序中,当我想下载一个MP4格式的55MB的大文件时,Trere是一个问题。当我想下载这个文件时,我会遇到如下错误: 最后,这是我的createServiceFile方法: 如果你能帮助我,我真的很感激:)

  • 问题内容: 我试图在我的代码中抛出一个异常,如下所示: 但是,当我在NetBeans中进行构建时,会出现以下错误: 我需要导入什么东西吗?我拼错了吗?我确定我一定在做些愚蠢的事情:-( 问题答案: 您需要在那里。它正在创建一个实例并抛出它,而不是调用方法。

  • 我有下面的代码块。我得到的是的catch块没有处理它。有人能告诉我如何处理下面的块抛出的异常吗?