魔法のようにこのライブラリを使用することはできませんが、ブロックやピースが収まるように開いている接続のリストがあります。マウスボタンを放すと、最も近い位置に行くことを選んだ(ピタゴラスの定理を使って距離を見つける)。ブロックが実際に所定の位置に収まらない限界距離があるかもしれません。はい、拡大はやや難しいでしょうが、最終的には何かが関数に置かれたときに再描画されるCGPathを使うことができます。
ここは少しの例です。
extension CGPoint {
func distanceTo(_ other:CGPoint) -> CGFloat {
return CGFloat(sqrt((pow(other.x - self.x, 2) + pow(other.y - self.y, 2))))
}
}
私はほとんどのプログラムに貼り付けた距離関数です。
var pieces:[NSView]!//The Pieces on the board/screen
var SelectedPiece:NSView!//the piece you are holding, could also be an index.
override func mouseUp(with event: NSEvent) {
var spaces:[CGPoint] = []
for piece in pieces {
spaces.append(CGPoint(x: piece.frame.origin.x, y: piece.frame.origin.y + 20))//change 20 to whatever
spaces.append(CGPoint(x: piece.frame.origin.x, y: piece.frame.origin.y - 20))
//if you are actually making a puzzle you might want pieces on the sides.
}
var ClosestDist:CGFloat?
var ClosestIndex:Int?
for space in spaces {
let dist = space.distanceTo(SelectedPiece.frame.origin)
if closestDist != nil {
if dist < closestDist {
ClosestDist = dist
ClosestIndex = spaces.index(of:space)
}
}else {
ClosestDist = dist
ClosestIndex = spaces.index(of:space)
}
}
if ClosestDist! < 15 {
SelectedPiece.frame.origin = spaces[ClosestIndex]
}
}
これは明らかに不完全ですが、これが役立つことを願っています。
を試すことができ、ユーザーのUI要素とのやりとりがCPUに課税されないためです。 – NRitH