【问题标题】:How can I check for intersect with nodes in swift chess app如何检查与快速国际象棋应用程序中的节点相交
【发布时间】:2020-12-10 12:33:18
【问题描述】:

我正在使用 Swift 开发一个国际象棋应用程序。进展顺利,但我被困在我必须检查一个棋子的移动是否被另一个棋子阻止的部分。 我试图在我的移动部件的旧位置和新位置之间创建一条 SKShapeNode 线,检查它是否与任何其他部件相交,如果是,则移动被阻止。如果我沿直线移动我的作品(如此水平或垂直),这实际上是有效的,但如果我沿对角线移动它,它不知何故不起作用。我读过关于 SKShapeNode 有点错误,但这是我能想到的唯一方法。

我猜这条线与 SpriteNodes 的框架相交,考虑到它们比棋子本身大一点,但我什至试图让棋子变得非常小,但它仍然不起作用。

希望我想做什么有点清楚。任何有关如何处理此问题的建议将不胜感激! 感谢阅读!

这是我尝试过的sn-p:

    let path = CGMutablePath()
    path.move(to: CGPoint(x: oldX!, y: oldY!))
    path.addLine(to: CGPoint(x: newX!, y: newY!))
    let shape = SKShapeNode(path: path)
    scene?.addChild(shape)
    for piece in allPieces {
        if piece.intersects(shape) && piece != self.movableNode {
            print("Move intersects other pieces")
            moveAllowed = false
            shape.removeFromParent()
        }
    }

【问题讨论】:

    标签: swift sprite-kit chess cgpath skshapenode


    【解决方案1】:

    所以,快速更新:我设法让它工作,虽然它不是一个非常优雅的解决方案。我所做的是制作一个 SKShapeNode,一个半径为 1px 的圆。每当我完成一个动作时,我就创建了这个 SKShapeNode,为它创建了一个 SKaction,然后非常快地将它从旧位置射到新位置。在更新功能中,我检查了这个形状的位置,并检查它是否与另一块相交。如果是这样,我会停止移动并重置移动部件的位置。

    所以是这样的:

    func checkForObstruction() {
        // Fire off a shape to check for obstruction
        shape = SKShapeNode(circleOfRadius: 1)
        shape.alpha = 0
        shape.position = CGPoint (x: oldX!, y: oldY!)
        scene?.addChild(shape)
        var piecesOnSameSquare = 0
        let action = SKAction.move(to: CGPoint(x: newX!, y: newY!), duration: 0.05)
        shape.run(action)
    }
    

    然后在更新中

    override func update(_ currentTime: TimeInterval) {
    
        if moveTakingPlace {
            print(shape.position)
            for piece in allPieces {
                if piece.intersects(self.shape) && piece.position != movableNode?.position && piecesOnSameSquare == 0 && !draggedPiece.contains("Knight") {
                    print("Intersection!")
                    shape.removeFromParent()
                    shape.removeAllActions()
                    self.finalizeMove(moveAllowed: false)
                    break
                } else if piece.position == CGPoint (x: newX!, y: newY!) {
                    print("more pieces on target square")
                  piecesOnSameSquare += 1
                }
            }
        }
    }
    

    我在这个更新方法中检查了一些其他的东西,但基本上就是这样.. 如果有人有任何建议可以使这更好,我会全力以赴。但现在这可行:)

    【讨论】:

      猜你喜欢
      • 2022-06-17
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多