- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图对齐 SKSpriteNode 以匹配碰撞时 PhysicsBody 的“撞击表面”。
我正在做的是将 SpriteNode 射向立方体。我已经设置了碰撞和节点附件(固定关节)。一切正常,但我需要找到一种方法来旋转 spriteNode 以匹配命中表面,如下所示:
请注意,立方体可以旋转等,因此我们并不总是在立方体上有固定的旋转值。
有什么解决办法吗?
提前致谢/马格纳斯
最佳答案
以下是我认为可行的大部分答案。稍后我会更新。
基本上,目标是将两个粘性节点分别放置在接触点的磁铁和立方体上。
然后,您将磁铁的 zRotation 与立方体的旋转相匹配,然后根据两个粘性节点的位置将磁铁与立方体对齐。
我还没有完成旋转匹配或粘性对齐,但是如果你想完成其他一切都在这里,直到我稍后再做:
// Props:
class GameScene: SKScene, SKPhysicsContactDelegate {
struct Category {
static let
border = UInt32(2),
cube = UInt32(4),
magnet = UInt32(8)
}
let names = (border: "border", cube: "cube", magnet: "magnet", stickyPoint: "stickyPoint")
var flag_hitThisSimulation = false
}
// Setup:
extension GameScene {
private func setupNodes() {
border: do {
let pb = SKPhysicsBody(edgeLoopFrom: frame)
pb.categoryBitMask = Category.border
physicsBody = pb
}
cube: do {
let cubeNode = SKSpriteNode(color: .blue, size: CGSize(width: 150, height: 150))
let pb = SKPhysicsBody(rectangleOf: cubeNode.size)
pb.affectedByGravity = false
pb.isDynamic = false
pb.categoryBitMask = Category.cube
pb.contactTestBitMask = Category.magnet
cubeNode.physicsBody = pb
cubeNode.position.y += 200
cubeNode.name = names.cube
cubeNode.run(.repeatForever(.rotate(byAngle: 3.14, duration: 3)))
addChild(cubeNode)
}
magnet: do {
let magnetNode = SKSpriteNode(color: .green, size: CGSize(width: 50, height: 12))
let pb = SKPhysicsBody(rectangleOf: magnetNode.size)
pb.categoryBitMask = Category.magnet
pb.affectedByGravity = false
magnetNode.physicsBody = pb
magnetNode.name = names.magnet
addChild(magnetNode)
}
}
override func didMove(to view: SKView) {
removeAllChildren()
physicsWorld.contactDelegate = self
setupNodes()
}
}
// Physics:
extension GameScene {
private func assignNodeOfName(_ name: String, contact: SKPhysicsContact) -> SKNode? {
guard let nodeA = contact.bodyA.node, let nodeB = contact.bodyB.node else { fatalError("how are there no nodes?") }
if nodeA.name == name { return nodeA }
else if nodeB.name == name { return nodeB }
else { return nil }
}
private func addNodeToPoint(_ point: CGPoint, parent: SKNode) {
let node = SKSpriteNode(color: .orange, size: CGSize(width: 5, height: 5))
node.position = point
node.name = names.stickyPoint
parent.addChild(node)
}
func alignMagnetToCube() {
}
func didBegin(_ contact: SKPhysicsContact) {
defer { flag_hitThisSimulation = true }
if flag_hitThisSimulation { return }
let contactedNodes = contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask
switch contactedNodes {
case Category.magnet + Category.cube:
// Place the two sticky nodes:
let cube = assignNodeOfName(names.cube, contact: contact)!
let magnet = assignNodeOfName(names.magnet, contact: contact)!
let cubePoint = convert(contact.contactPoint, to: cube)
let magnetPoint = convert(contact.contactPoint, to: magnet)
addNodeToPoint(cubePoint, parent: cube)
addNodeToPoint(magnetPoint, parent: magnet)
// Set the magnet's zRotation to the cube's zRotation, then align the two stickyNodes:
// fluidity.SLEEPY(for: now)
// finish.later()
default: ()
}
}
}
// Game loop:
extension GameScene {
// Change to touchesBegan for iOS:
override func mouseDown(with event: NSEvent) {
let magnet = childNode(withName: names.magnet) as! SKSpriteNode
// Start simulation:
magnet.removeAllActions()
magnet.physicsBody!.applyImpulse(CGVector(dx: 0, dy: 25))
// End simulation:
magnet.run(.wait(forDuration: 2)) {
print("resetting simulation! \(event.timestamp)")
magnet.physicsBody!.velocity = CGVector.zero
magnet.zRotation = 0 // FIXME: This isn't working..
magnet.position = CGPoint.zero
self.flag_hitThisSimulation = false
// Remove sticky nodes:
for node in self.children {
for childNode in node.children {
if childNode.name == self.names.stickyPoint { childNode.removeFromParent() }
}
}
}
}
}
关于ios - 将 SpriteNode 与碰撞表面对齐 SpriteKit Swift3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986417/
我有一个(移动的) Sprite 节点。 我想检测此节点一定范围内的其他(移动) Sprite 节点。一旦检测到一个,它应该执行一个 Action 。 扮演 Action 部分对我来说没问题,但我似乎
我正在制作一款有云彩移动的游戏,我希望当角色降落在云彩上时云彩会消失。然而,当我输入代码时,如果角色绕过它并在仍在下落时撞到云的底部或侧面,它就会消失。这是我用于检测角色和云何时击中的代码。 是否有办
我想实现一个带有“彩色突出显示”的 Sprite 节点。 “突出显示可以有多种颜色。这是在沙盒应用程序中完成的,以进行尝试。 我考虑过使用SKTextures来表示节点的“高光”。然而,使用这种方法,
当将 spriteNode 缩放到较小尺寸(或较大尺寸)时,spriteNode 默认从中心缩放,这通常没问题。然而,我需要我的 Sprite 从它 body 的最左边开始缩放。有什么方法可以改变 s
我正在学习如何编码,作为第一个项目,我认为创建一个针对计算机的小石头剪刀布游戏是个好主意。问题是,显然计算机可能不会显示他的选择,所以我必须创建一个函数,使随机图片 x (我使用苹果的笑脸)出现在屏幕
我想在没有 uiscrollview 的情况下滚动 Sprite 套件中的节点 //触摸移动 let touch: UITouch = touches.first as! UITouch; let l
我正在尝试使用以下方法创建我的用户 SpriteNode。纹理是 Kladde,图像也不为空。 func spawnPlayer() { if didFirstTap == true && i
所以基本上我有 coin 对象,我想在屏幕上启动它。我有以下代码在滑动时运行一些计算,但不确定什么与我当前的情况相关: override func touchesBegan(touches: Set,
我正在制作一个游戏,在该游戏中,在某些时候会出现一个新按钮和一个标签。问题是在某些情况下它们都不会出现。 override func touchesBegan(touches: Set, withE
我有两个类别 enum ColliderType:UInt32 { case bulletCategory = 1 case bossCategory = 2 } 我让我的类(class)使用 SKP
我一直在尝试让 Sprite 具有不止一种纹理,这样它看起来就像在移动一样。我正在查看其他问题,但他们所做的一切都没有解决我的问题,这是我的代码: var textures = [SKText
如何通过触摸在固定点上旋转 SpriteKit 节点。所以当用户拖动他的手指时它会转动。我也希望能够获得 rpm。 (之前有人问过这个问题,但我想知道如何使用 SpriteKit 来做) swift
我有这段代码可以对子弹节点施加力并使其向敌人移动。在这种情况下,火箭始终朝上。我的问题是如何旋转这颗子弹以面向节点头部的方向。 let asd=SKSpriteNode(imageNamed: "
我有一个函数,可以创建 8 发来自玩家的子弹,呈圆形向外发射。我认为问题在于此处的这一行: let endPoint = CGPoint(x: distance * cos(angle), y: d
所以我正在使用带有图像的 spritenode 并且我没有设置它的位置。有趣的是,我在设置它的位置时遇到了问题,所以我没有,它默认设置为页面中心(出于明显的原因),这最终是完美的。所以现在在我的 to
我正在尝试创建一个小游戏,其中 SpriteNode(又名玩家)以恒定速度垂直向上移动。我想用它的角度向左或向右转向。但是,我无法使用其角度正确移动播放器。 感谢您的宝贵时间。 这是我写的部分代码:
所以我有 3 个不同的障碍物,它们随机产生并在 3 秒后被移除,但是如果例如 Obstacle1 已经产生并且随机数告诉程序产生另一个 Obstacle1,我得到一个错误 "Terminating a
我试图将 Sprite 的初始角度设置为 90 度。我不想调用 Action ,有没有办法像设置位置一样设置 Sprite 的角度参数? 最佳答案 z旋转 您可以使用接受辐射的 SKNode 的 zR
我在使用 Swift 3 和 Spritekit 开发我的应用程序时遇到了一个问题。为了检测碰撞,我制作了四个独立的三角形组成一个正方形。当我将这些三角形作为一个单元旋转时,它们会重叠并且在旋转过程中
我的新游戏 Sprite 有问题... 我的“汽车”在第一圈完美地沿着赛道行驶,但从那时起,它似乎在每圈结束时都会发生偏移。有人能告诉我我做错了什么吗? - (void)createSceneCont
我是一名优秀的程序员,十分优秀!