gpt4 book ai didi

ios - Swift 3 沿用户绘制的路径生成均匀间隔的 SKSpriteNodes

转载 作者:行者123 更新时间:2023-11-28 06:17:30 27 4
gpt4 key购买 nike

各位!首先,我知道这个问题与 Draw images evenly spaced along a path in iOS 非常相似。 .然而,这是在 Objective-C 中(我无法阅读)并且它在使用 CGImageRefs 的普通 ViewController 中。我需要快速使用 SKSpriteNodes(不是 CGImageRefs)。这是我的问题:

我正在尝试制作一个程序,让用户绘制一个简单的形状(如圆形)并沿着用户绘制的路径以固定间隔放置 SKSpriteNode。我已经让它以缓慢的速度正常工作,但如果用户绘制得太快,那么节点就会被放置得太远。这是我慢慢画的例子:

User-drawn barrier

用户绘制的路径,节点之间的距离约为 60 像素。蓝色为起始节点,紫色为结束节点。

目标是每个节点都有一个 physicsBody,防止实体越过用户绘制的线(这些实体不能挤在均匀间隔的节点之间)。但是,如果用户画得太快,就会出现我无法修复的防御缺口。例如:

Node barrier with gap

请注意第 7 个和第 8 个节点之间明显更大的间隙。发生这种情况是因为我画得太快了。许多人的问题略有相似但对我的任务没有帮助(例如,将特定数量的节点沿路径均匀分布,而不是放置尽可能多的节点以使它们沿路径相距 60 像素)。

总而言之,这又是我的主要问题:如何沿着用户绘制的任何形状的路径完美地放置节点?预先感谢您的帮助!这是我的 GameScene.swift 文件:

import SpriteKit

导入 GameplayKit

游戏场景类:SKScene {

let minDist: CGFloat = 60 //The minimum distance between one point and the next

var points: [CGPoint] = []
var circleNodes: [SKShapeNode] = []

override func didMove(to view: SKView) {


}

func getDistance (fromPoint: CGPoint, toPoint: CGPoint) -> CGFloat {

let deltaX = fromPoint.x - toPoint.x
let deltaY = fromPoint.y - toPoint.y

let deltaXSquared = deltaX*deltaX
let deltaYSquared = deltaY*deltaY

return sqrt(deltaXSquared + deltaYSquared) //Return the distance

}


func touchDown(atPoint pos : CGPoint) {

self.removeAllChildren()

//The first time the user touches, we need to place a point and mark that as the firstCircleNode
print(pos)
points.append(pos)
//allPoints.append(pos)

let firstCircleNode = SKShapeNode(circleOfRadius: 5.0)

firstCircleNode.fillColor = UIColor.blue

firstCircleNode.strokeColor = UIColor.blue

firstCircleNode.position = pos

circleNodes.append(firstCircleNode)

self.addChild(firstCircleNode)

}

func touchMoved(toPoint pos : CGPoint) {

let lastIndex = points.count - 1 //The index of the last recorded point

let distance = getDistance(fromPoint: points[lastIndex], toPoint: pos)
//vector_distance(vector_double2(Double(points[lastIndex].x), Double(points[lastIndex].y)), vector_double2(Double(pos.x), Double(pos.y))) //The distance between the user's finger and the last placed circleNode

if distance >= minDist {
points.append(pos)

//Add a box to that point
let newCircleNode = SKShapeNode(circleOfRadius: 5.0)

newCircleNode.fillColor = UIColor.red

newCircleNode.strokeColor = UIColor.red

newCircleNode.position = pos

circleNodes.append(newCircleNode)

self.addChild(newCircleNode)

}

}

func touchUp(atPoint pos : CGPoint) {

//When the user has finished drawing a circle:

circleNodes[circleNodes.count-1].fillColor = UIColor.purple //Make the last node purple

circleNodes[circleNodes.count-1].strokeColor = UIColor.purple

//Calculate the distance between the first placed node and the last placed node:
let distance = getDistance(fromPoint: points[0], toPoint: points[points.count-1])
//vector_distance(vector_double2(Double(points[0].x), Double(points[0].y)), vector_double2(Double(points[points.count - 1].x), Double(points[points.count - 1].y)))

if distance <= minDist { //If the distance is closer than the minimum distance

print("Successful circle")

} else { //If the distance is too far

print("Failed circle")

}

points = []
circleNodes = []

}


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches { self.touchDown(atPoint: t.location(in: self)) }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches { self.touchMoved(toPoint: t.location(in: self)) }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches { self.touchUp(atPoint: t.location(in: self)) }
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches { self.touchUp(atPoint: t.location(in: self)) }
}


override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
}

最佳答案

您可以尝试调整矢量的大小:

func touchMoved(toPoint pos : CGPoint) {
let lastIndex = points.count - 1 //The index of the last recorded point
let distance = getDistance(fromPoint: points[lastIndex], toPoint: pos)
if distance >= minDist {
// find a new "pos" which is EXACTLY minDist distant
let vx = pos.x - points[lastIndex].x
let vy = pos.y - points[lastIndex].y
vx /= distance
vy /= distance
vx *= minDist
vy *= minDist
let newpos = CGPoint(x: vx, y:vy)
points.append(newpos)

//Add a box to that point
let newCircleNode = SKShapeNode(circleOfRadius: 5.0)
newCircleNode.fillColor = UIColor.red
newCircleNode.strokeColor = UIColor.red
newCircleNode.position = newpos // NOTE
circleNodes.append(newCircleNode)
self.addChild(newCircleNode)
}
}

它可能不完美,但可能看起来更好。

关于ios - Swift 3 沿用户绘制的路径生成均匀间隔的 SKSpriteNodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44730448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com