ios - 我想沿着半椭圆路径移动一个 SKNode
问题描述
我的情况是,我正在沿拱门移动现有节点,并希望它在到达另一侧时停止。一个简单的类比是我想让一些东西沿着彩虹移动。
我当前的代码虽然确实执行了一个适当的椭圆,但它随后在我的 y 原点下方继续返回到它的起点。我知道我可以更好地控制一个圆圈停在我希望的地方,但是对于我的用例,圆形路径不起作用。
我的代码的缩写版本是:
override func didMove(to view: SKView) {
let size = CGSize(width: frame.width - 60, height: 100)
let box = SKSpriteNode(color: .orange,
size: CGSize(width: 30, height: 30))
box.position = CGPoint(x: frame.midX, y: frame.midY)
addChild(box)
let origin = CGPoint(x: 30, y: frame.midY)
let rect = CGRect(origin: origin, size: size)
let path = UIBezierPath(ovalIn: rect)
let action = SKAction.follow(path.cgPath,
asOffset: false,
orientToPath: false,
speed: 250)
box.run(action)
}
上面的代码在运行时会产生这个:
我的目标是让橙色框在到达左侧时停止。
我已经查看了各种 UIBezierPath 初始化程序,唯一看起来很有希望的是使用UIBezierPath(cgPath:)
. 理想情况下,我需要cgPath
填充它以满足我的标准。
解决方案
所以我对UIBezierPath(cgPath:)
基于方法的看法是正确的。
对我来说,关键是使用问题中发布的代码运行,然后捕获path
变量的内容,以便从中提取值。有了这些,我就可以构建一个CGPath
可以使用的硬编码。
override func didMove(to view: SKView) {
let box = SKSpriteNode(color: .orange,
size: CGSize(width: 30, height: 30))
box.position = CGPoint(x: frame.midX, y: frame.midY)
addChild(box)
let path = UIBezierPath()
let start = CGPoint(x: 345, y: 383.5)
let end = CGPoint(x: 30, y: 383.5)
let controlPoint = CGPoint(x: 190, y: 533.5)
path.move(to: start)
path.addQuadCurve(to: end, controlPoint: controlPoint)
let action = SKAction.follow(path.cgPath,
asOffset: false,
orientToPath: false,
speed: 250)
box.run(SKAction.repeatForever(action))
}
最后,使用时的外观:
如果我避免使用repeat
on SKAction
,它将与正好位于我想要的位置的对象一起完成。
由于我不是 SpriteKit 方面的专家,我很想知道是否有更好的方法来解决这个问题。
推荐阅读
- django - Dockerize 存在 Django Postgres 项目:在主机“localhost”(127.0.0.1)上并接受 web_1 | 端口 5432 上的 TCP/IP 连接?
- android - 申请 IAP(应用内购买)后,我需要做什么?
- reactjs - TypeError:无法读取未定义的属性(读取“profilePic”),做出反应
- laravel - Artisan 命令中的可邮寄邮件失败
- java - Java Spring Boot:项目将图像保存在错误的路径中,使用IDE Intellji打开时不显示图像
- python - Python - Pandas Dataframe 以正确的方式合并两个数据框
- xamarin - ExcelDataReader 1252 编码问题
- android - kotlin firebase auth 在登录期间崩溃
- python - 如何为自定义函数创建单独的类?
- sql-server - SQL Server 2019:选择刚刚插入的行