根据节点的旋转对节点应用强制

Posted

技术标签:

【中文标题】根据节点的旋转对节点应用强制【英文标题】:applyForce to a node according to its rotation 【发布时间】:2015-02-27 17:37:35 【问题描述】:

我使用 Xcode 6、SpriteKit 和 Swift,

我有一个 SKSpriteNode,它是新 Xcode 项目的默认 Spaceship 图像。这艘飞船有实体,但不受重力影响,我想模拟空间。

我希望当我点击屏幕时,会对节点施加一个力,这样飞船就可以前进。问题是当飞船旋转时,我尝试施加一个力,飞船不会像我想要的那样前进,而是朝着施加力的方向前进,这是正常的。

我想知道是否有任何方法可以根据 zRotation 向节点施加力?所以无论宇宙飞船向哪个方向前进,它都会一直向前。

【问题讨论】:

raywenderlich.com/57368/… 【参考方案1】:

我现在不能试一试,但它应该可以工作:

// grab the spaceship rotation and add M_PI_2
var spaceShipRotation : CGFloat = spaceShipNode.zRotation
var calcRotation : Float = Float(spaceShipRotation) + Float(M_PI_2);

// cosf and sinf use a Float and return a Float
// however CGVector need CGFloat
let intensity : CGFloat = 10.0 // put your value
let xv = intensity * CGFloat(cosf(calcRotation))
let yv = intensity * CGFloat(sinf(calcRotation))
let vector : CGVector = CGVectorMake(xv, yv)

// apply force to spaceship
spaceShipNode.physicsBody?.applyForce(vector)

您必须使用数学,或者更准确地说是使用三角学,其中包括:PI、cos、sin... 我对所有这些都不是很满意,尤其是现在没有尝试,但正如我所说的那样,它应该可以工作。告诉我!

【讨论】:

是的,它工作得很好!我知道我可以使用三角函数来做到这一点,但我想知道 spritekit 中是否有一种方法可以让我直接做到这一点,但谢谢! 我不知道,但我也是 SpriteKit 的新手。如果我找到本机方法,我会添加答案。同时,或者如果它不存在,并且您需要经常使用它:您可能想要扩展 SKPhysicsBody 以添加您自己的方法,例如 applyForceForward 是的,这可能是个好主意,但我想要一个更像是调用 CGVector 和 CGPoint 的方法,并根据以下公式计算新向量的方向和新点的位置节点的zRotation,我试试看不知道有没有能力做,先看看你的代码,试着理解一下 有一个方法applyForce:atPoint:(goo.gl/287Bfx)。但我不确定结果是否相同,应用时可能包括角旋转。暂时无法尝试,如果你试一试,请告诉我!如果结果相同,那就爽了。 Overwise,您将能够在某个时候创建​​自己的方法! :) 我已经试过了,这是我做的第一件事,它不包括角度旋转。我试图实现我的方法(我编辑了我的第一篇文章),但它似乎不起作用......

以上是关于根据节点的旋转对节点应用强制的主要内容,如果未能解决你的问题,请参考以下文章

如何在节点/角度/nginx应用程序上强制缓存过期

配置 Mysql 读写分离+强制走写节点+根据主从延时的读写分离

d3:强制有向图:节点过滤

为啥节点 10 强制在 fs.writeFile() 上传递回调?

D3 强制布局 - 按名称而不是索引链接节点

使用 XSLT 添加强制节点