- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想计算一个 SKSpriteNode
在被施加脉冲后的轨迹。我有 12 个球,我想把它们放在球发射后的位置。我正在使用等式 𝕡(t)=𝕡₀+t(𝕧₀+½Δt𝕒)+½t²𝕒
我对节点施加的冲量基于用户在屏幕上拖动的长度。
这是我试过的:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
let location = touch.location(in: self)
startPositionDrag = location
}
}
在 touchesMoved
中,我更新轨迹节点以显示如果在该位置启动节点将去向的位置。
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
movedLocation = touch.location(in: self)
calculateTrajectoryy(velocityY: (startPositionDrag.y - movedLocation.y), velocityX: (startPositionDrag.x - movedLocation.x))
}
这是我使用等式的地方。我有一个 12 个球的数组。我使用 i
作为时间,因为我想将每个球放在 i
秒后节点所在的位置。
func calculateTrajectoryy(velocityY: CGFloat, velocityX: CGFloat){
for i in 0...12{
let time = CGFloat(i)
let accelerationX = CGFloat(0)
let accelerationY = CGFloat(-9.8)
var x = CGFloat()
var y = CGFloat()
// 𝕡(t)=𝕡₀+t(𝕧₀+½Δt𝕒)+½t²𝕒
x = ball.position.x + time * (velocityX + 0.5 * time * accelerationX) + 0.5 * time * time * accelerationX
y = ball.position.y + time * (velocityY + 0.5 * time * accelerationY) + 0.5 * time * time * accelerationY
arrray[i].position = CGPoint(x: x, y: y)
}
}
最后在 touchesEnded
中,当用户松开拖动时,节点将应用一个脉冲,它应该完全遵循创建的球的路径。
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
let location = touch.location(in: self)
ball.physicsBody?.applyImpulse(CGVector(dx:(startPositionDrag.x - endPositionDrag.x), dy:(startPositionDrag.y - endPositionDrag.y))
}
}
}
球不遵循球产生的弧线。球射出一点点,而球的弧线又大又长。我认为这可能与单位转换有关。该等式使用每秒米数的速度值,而拖回的位置是 CGFloat
。米会比 CGFloat
长,因此预测的轨迹会更长。我如何才能将轨迹转换为与像素或 CGFloat
一起使用?我可以除以像素与米的比率吗?
最佳答案
(从物理学的角度回答,我不是 swift 或 sprite-kit 的专家)
“单位”的选择(以及一个点代表的物理距离)完全由您决定,您在调用 applyImpulse()
之前所拥有的数学与假设 1point = 1米。这可能是您想要的,也可能不是您想要的,但这是一个不错的选择 - 顺便说一句,在您的代码中唯一(某种程度上)将一个点固定到真实世界的仪表的是重力值 9.8,否则您可以只是称它们为点,实际意义没有变化——物理引擎并不关心。
您在代码中放入 array[] 的连续球位置是假设发射的球将在一秒钟内覆盖从 start_of_drag 到 end_of_drag 的距离(因为您只是将距离用作速度值,即, 1m 变为 1m/sec, 2m = 2m/s, 等等)。(注意我不太清楚 12 点预测路径在您的情况下如何正确工作,因为要获得指向拖动方向的矢量,您通常会执行 end_drag - start_drag
,而你的代码确实 start - end
)
您遇到的问题可能与 applyImpulse
期望以牛顿*秒为单位的值有关(并且速度变化将取决于球的质量:delta-V = impulse/mass ),而您使用相同的“成为速度的距离”单位调用该函数。
如果球在拖动之前总是静止的,并且您希望它立即开始以选定的速度移动到某个地方,那么简单地将它的速度分配给所需的值并让它飞起来可能会更容易,而不是尝试使用 applyImpulse
,例如:
(编辑:正如@knight0fdragon 指出的那样,SK 的距离单位是点,但速度是以抽象“米”= 150pt/sec 为单位测量的,所以如果你到目前为止以点和点/秒为单位进行数学计算,您必须在修改 physicsBody 向量之前缩放速度:将其除以 150.0)。
ball.physicsBody?.velocity = CGVector(dx:velocityX, dy:velocityY)
如果球已经有一定的速度并且您想修改它一定量(用速度单位而不是 N*m 表示)并且忽略质量,请将该速度变化添加到球的当前速度。
关于Swift:使用施加的脉冲计算节点的轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51813905/
我正在使用 JavaFX 8 创建一个应用程序。我使用拖/放动态更改网格 Pane 的内容。我希望每行或每行/列迭代 GridPane 内容。JavaFX 允许通过指定行和列在 GridPane 中添
我正在尝试将图像拖放到div上。图像没有被拖到div上并给出以下错误 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': pa
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我在 Hive 上运行一些作业:首先是 4 节点,然后是 2 节点。令我惊讶的是,我的 2 节点性能比我的 4 节点更好。 首先,我在一个 4 节点(4 个事件节点)上运行查询,然后关闭 2 个节点(
我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误: '=' : cannot convert from 'CircularDo
我是 dcos Mesos 的新手,在本地 Ubuntu 机器上安装了 dc os。 我可以查看 dcos 仪表板。 但我无法使用 dcos node ssh --master-proxy --lea
在 JavaFX 中,是否有类似 setLayout(); 的东西?或 setBounds(); ? 例如,我想将按钮定位到我想要的位置。 最佳答案 JavaFX 场景图上的所有内容都是 Node .
我正在开发一个 JavaFX 应用程序,其中我开发的类(从 javafx.scene.Parent 扩展)是根据用户在 ListView 控件中单击的条目动态创建的。 只是要清楚这个节点,它不是使用像
我正在尝试为节点-边缘关系创建一个类图,因为它可以在有向图中找到。我想传达的是,Nodes 引用了 Edges,Edges 也引用了 Nodes。每个 Edge 都恰好需要两个 Node(源和目标)。
在mapreduce作业期间,单个任务将在随机节点上运行,是否有任何方法限制应在其中运行任务的节点? 最佳答案 Hadoop不会选择节点来随机运行任务。考虑到数据局部性,否则将有很多网络开销。 任务与
有什么区别: a) nodetool 重建 b) nodetool 修复 [-pr] 换句话来说,各个命令到底是做什么的? 最佳答案 nodetool重建:类似于引导过程(当您向集群添加新节点时),但
我已将第一个 OneToMany 关系添加到我的 hibernate 3.6.10 项目中。这是一个类: /** * */ package com.heavyweightsoftware.leal
是否有可能找到正在监听触发当前函数的事件的元素? 在下面的代码中,event.target 返回 #xScrollPane 和 event.currentTarget 和 event 的最低子节点.f
我正在尝试覆盖我数据库中的一些数据。结构很简单,就是: recipes { user_1{ recipe_1{data} recipe_2{data} } user_2{
我使用 setInterval 来运行该函数,但它会多次执行函数 2... 如何在输入中插入一个值后执行函数 第一个输入与其余输入的距离不同 如何在插入 val(tab 选项)后将插入从 1 个输入移
我不知道代码有什么问题,但在 visual studio 中不断收到这些错误消息。 Error 18 error C1903: unable to recover from previous e
我正在尝试从其类中获取 SharePoint 搜索导航节点的对象。 var nodes = $("div.ms-qSuggest-listItem"); 我正在获取节点对象,现在想要获取“_promp
D:\nodeP>node main.js module.js:327 抛出错误; ^ 错误:在 Function.Module 的 Function.Module._resolveFilename
struct node{ int key, prior, cnt, val; node *l, *r; node(){} node(int nkey) : key(nkey),
我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 24 字节的绝对内存泄漏。 NodeIterator insert(NodeIterator & itrP
我是一名优秀的程序员,十分优秀!