物理体圈的运动对于我想要达到的目标来说太不稳定了.我想限制它,以便它遵循某个特定点(或一系列点)的路径,如下图所示.如何设置物理属性以遍历类似的路径?

how to set physics properties for a circle so it follows given path

因此,基本上您希望使用实时运动将节点移动到特定点.我有一个答案here显示如何做到这一点,但考虑到这个问题收到的票数,我将提供更详细的答案.

我所链接的答案没有提供的是遍历点的路径.所以下面我提供了一个解决方案,展示了如何在下面完成.它只是移动到路径中的每个点,每次节点到达一个点时,我们递增索引以移动到下一个点.我还为行进速度,速率(使运动更平滑或静态)以及节点是否应重复路径添加了一些变量.您可以进一步扩展此解决方案,以更好地满足您的游戏需求.我肯定会考虑将节点子类化并将此行为构建到其中,以便您可以将此运动重用于多个节点.

最后一点,你可能会注意到冲动的计算在我的解决方案和我上面提到的答案之间有所不同.这是因为我避免使用角度计算,因为它们非常昂贵.相反,我正在计算法线,以便计算更有效.

最后一点,我的答案here解释了使用速率因子来平滑运动并为运动失真留出空间.

import SpriteKit

class GameScene: SKScene {
    var node: SKShapeNode! //The node.
    let path: [CGPoint] = [CGPoint(x: 100,y: 100),CGPoint(x: 100,y: 300),CGPoint(x: 300,y: 100)] //The path of points to travel.
    let repeats: Bool = true //Whether to repeat the path.
    var pathIndex = 0 //The index of the current point to travel.
    let poinTradius: CGFloat = 10 //How close the node must be to reach the destination point.
    let travelSpeed: CGFloat = 200 //Speed the node will travel at.
    let rate: CGFloat = 0.5 //Motion smoothing.

    override func didMovetoView(view: SKView) {
        node = SKShapeNode(circleOfRadius: 10)
        node.physicsBody = SKPhysicsBody(circleOfRadius: 10)
        node.physicsBody!.affectedByGravity = false
        self.addChild(node)
    }

    final func didReachPoint() {
        //We reached a point!
        pathIndex++

        if pathIndex >= path.count && repeats {
            pathIndex = 0
        }
    }

    override func update(currentTime: NSTimeInterval) {
        if pathIndex >= 0 && pathIndex < path.count {
            let destination = path[pathIndex]
            let displacement = CGVector(dx: destination.x-node.position.x,dy: destination.y-node.position.y)
            let radius = sqrt(displacement.dx*displacement.dx+displacement.dy*displacement.dy)
            let normal = CGVector(dx: displacement.dx/radius,dy: displacement.dy/radius)
            let impulse = CGVector(dx: normal.dx*travelSpeed,dy: normal.dy*travelSpeed)
            let relativeVeLocity = CGVector(dx:impulse.dx-node.physicsBody!.veLocity.dx,dy:impulse.dy-node.physicsBody!.veLocity.dy);
            node.physicsBody!.veLocity=CGVectorMake(node.physicsBody!.veLocity.dx+relativeVeLocity.dx*rate,node.physicsBody!.veLocity.dy+relativeVeLocity.dy*rate);
            if radius < poinTradius {
                didReachPoint()
            }
        }
    }
}

我很快就这样做了,所以如果有错误我会道歉.我现在没有时间,但我会在后面添加一个显示解决方案的gif.

关于碰撞的说明

为了在碰撞过程中修复不稳定的运动,在2个物体碰撞后将“速率”属性设置为0或优选地设置为非常低的数字,以减小行进速度脉冲,这将为您提供更大的运动失真空间.然后在将来的某个时刻(可能在碰撞发生后的某个时间或者最好在身体再次缓慢移动时)将速率设置回其初始值.如果你真的想要一个很好的效果,你实际上可以随着时间的推移将速率值从0增加到初始值,以给自己一个平稳和渐进的加速.

swift – 如何设置圆的物理属性,使其遵循给定的路径的更多相关文章

  1. html5 canvas 实现光线沿不规则路径运动

    这篇文章主要介绍了html5 canvas 实现光线沿不规则路径运动,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. swift – 如何设置圆的物理属性,使其遵循给定的路径

    物理体圈的运动对于我想要达到的目标来说太不稳定了.我想限制它,以便它遵循某个特定点的路径,如下图所示.如何设置物理属性以遍历类似的路径?

  3. Android MotionEvent:查看运动是否发生在视图之外

    我有一个按钮和OnTouchListener附加到它.如何查找运动是在内部还是外部发生?

  4. jQuery实现横向带缓冲的水平运动效果(附demo源码下载)

    这篇文章主要介绍了jQuery实现横向带缓冲的水平运动效果,涉及jQuery中鼠标事件及animate方法使用技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下

  5. JS实现多物体运动

    这篇文章主要为大家详细介绍了JS实现多物体运动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. JavaScript运动函数实例详解

    这篇文章主要为大家详细介绍了JavaScript的运动函数,使用实例在论证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. jQuery模拟物体自由落体运动(附演示与demo源码下载)

    这篇文章主要介绍了jQuery模拟物体自由落体运动的方法,并附带了效果演示与demo源码下载,可真是模拟出球体自由落体运动及动能损耗的运动过程,需要的朋友可以参考下

  8. JavaScript中的匀速运动和变速(缓冲)运动详细介绍

    一个div的运动其实就是它与浏览器边框的距离在变动。如果他变化的速率一定,那就是匀速运动;如果变化的速率不一定,那么就是变速运动

  9. JavaScript结合Canvas绘画画运动小球

    这篇文章主要介绍了JavaScript结合Canvas画运动小球,canvas被称为画布,可以结合javascript实现绘制各种图形,制作各种炫酷的动画效果,下面文章更多详细内容介绍需要的小伙伴可以参考一下

  10. jQuery抛物线运动实现方法(附完整demo源码下载)

    这篇文章主要介绍了jQuery抛物线运动实现方法,以完整实例形式分析了jQuery物体运动的实现技巧,并附带了完整的demo源码供读者下载参考,需要的朋友可以参考下

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部