首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拖曳和闪烁/投掷雪崩管

拖曳和闪烁/投掷雪崩管
EN

Stack Overflow用户
提问于 2015-06-04 05:42:39
回答 1查看 539关注 0票数 1

我有球类精灵,我想能弹向其他精灵。现在,我在下面有一个函数TouchesMoved,但是它将我的精灵移动到屏幕上的任何触摸动作,当我想让我的用户第一次触摸这个精灵并将他们的手指指向目标时,它会导致这个精灵移动。这就是功能失调。任何帮助都将不胜感激!

编辑:我想让球的速度保持不变,不管电影的长度。没有被其他的答案所解决。

代码语言:javascript
运行
复制
    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {

    if firstTimerStarted == false {
        let touch = touches.first as! UITouch
        let touchLocation = touch.locationInNode(self)
        sceneTouched(touchLocation)

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-04 07:47:49

这应该能行,我只是从一个老项目中挖出来的。

CGFloat dt是用来改变运动的速度/功率的。

代码语言:javascript
运行
复制
var touching = false

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    let touch = touches.first as! UITouch
    let location = touch.locationInNode(self)
    if sprite.frame.contains(location) {
        touchPoint = location
        touching = true
    }
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {

    let touch = touches.first as! UITouch
    let location = touch.locationInNode(self)
    touchPoint = location
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    touching = false
}
override func update(currentTime: CFTimeInterval) {
    if touching {
        if touchPoint != sprite.position
        {
            let dt:CGFloat = 0.15
            let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y)
            let vel = CGVector(dx: distance.dx/dt, dy: distance.dy/dt)
            sprite.physicsBody!.velocity = vel
        }
    }
}

编辑:它变得越强的原因是距离越远,因为向量是雪碧和触点之间的距离。尝试将其弹出作为更新函数。它应该工作..。

代码语言:javascript
运行
复制
override func update(currentTime: CFTimeInterval) {
    if touching {
        if touchPoint != sprite.position
        {
            let pointA = touchPoint
            let pointB = sprite.position
            let pointC = CGPointMake(sprite.position.x + 2, sprite.position.y)
            let angle_ab = atan2(pointA.y - pointB.y, pointA.x - pointB.x)
            let angle_cb = atan2(pointC.y - pointB.y, pointC.x - pointB.x)
            let angle_abc = angle_ab - angle_cb
            let vectorx = cos(angle_abc)
            let vectory = sin(angle_abc)
            let dt:CGFloat = 15
            let vel = CGVector(dx: vectorx * dt, dy: vectory * dt)
            sprite.physicsBody!.velocity = vel
        }
    }
}

使用touchPoint (pointA)和雪碧的位置(pointB),我们可以创建一个角度。

atan2,是C语言中一个非常著名的函数,它产生了两点之间的夹角。但是,零度是在一个与往常不同的位置。

所以,我们需要我们自己的0度标记,我用点的右半部分作为我的标记。这是普通的0度排名:

因为它是在雪碧的位置右边,我们创建了一个点就在雪碧(pointC)的右边。

我们现在使用atan2来寻找角度。

为了从一个角度创建一个向量,我们只对x和y值使用cos和sin。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30635784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档