【问题标题】:Create a raycast in spritekit在 spritekit 中创建光线投射
【发布时间】:2020-02-09 13:27:14
【问题描述】:

我正在使用 Spritekit 构建游戏,并尝试构建将玩家与玩家点击的点连接起来的光线投射。它就像一根绳子,将玩家连接到他或她点击的点。例如,如果玩家在 x: 0, y: 0 点轻敲,那么它将变成一根绳子,将两者相互连接。随着时间的推移,绳子会变短,玩家将被拖到绳子上。玩家确实有一个物理体。当玩家松开手指时,绳子将被移除,玩家不会再被拖到那个点。

我想归档与统一搜索 raycast 但使用 spritekit 相同的内容。

我知道如何实现触摸功能以及他或她何时释放触摸。所以问题是我如何按照描述进行光线投射。我还想要某种视觉效果,这意味着 skshapenode 或指示玩家要去哪里的东西。

已尝试使用 SkPhysicsJoints,但没有成功。

任何帮助将不胜感激!

【问题讨论】:

  • 为什么需要光线投射?对我来说听起来像是一个简单的线段
  • 关键是玩家将通过一根绳索连接到他或她点击的地方。每隔一秒左右,绳子就会变短,玩家将被物理拖动到该点。如果你能够用线段做到这一点,那绝对没问题。您能否显示有关如何实现它的代码?谢谢!
  • 嗯?那不是射线投射,也不是线段。您需要重新处理这个问题,以更好地解释您要做什么。
  • 已更新问题。感谢您的努力!

标签: swift sprite-kit game-physics skphysicsjoint


【解决方案1】:

场景中的physicsWorld对象支持Raycast,方法是

func enumerateBodies(alongRayStart start: CGPoint, end: CGPoint, using block: @escaping (SKPhysicsBody, CGPoint, CGVector, UnsafeMutablePointer<ObjCBool>) -> Void)

你可以这样使用:

self.physicsWorld.enumerateBodies(alongRayStart: playerPosition, end: clickPosition) { body, point, vector, object in
    if let node = body.node as? SKSpriteNode {
        node.color = SKColor.red.withAlphaComponent(0.2)
        let pointNode = SKSpriteNode(color: .cyan, size: CGSize(width: 5, height: 5))
        pointNode.position = point
        let path = CGMutablePath()
        path.move(to: playerPosition)
        path.addLine(to: clickPosition)
        path.closeSubpath()
        let line = SKShapeNode(path: path)
        line.strokeColor = .green
        line.fillColor = .green
        self.addChild(line)
        self.addChild(pointNode)
    }
}

每次点击都会得到这个结果:

完整的例子在这里:https://github.com/Maetschl/SpriteKitExamples/blob/master/Raycast2dLinesVsObjects/Raycast2dLinesVsObjects/GameScene.swift

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2022-10-15
    相关资源
    最近更新 更多