代码之家  ›  专栏  ›  技术社区  ›  Ali Ali

快速精灵碰撞。穿过墙壁的物体

  •  3
  • Ali Ali  · 技术社区  · 9 年前

    我正在做一个简单的游戏(使用Swift&SpriteKit),其中我有一个可以拖动的圆圈。但圆圈不允许穿过墙壁。

    我的碰撞BitMask非常有效,但当我拖得足够快时,圆圈最终会穿过墙壁。

    玩家精灵的初始化如下:

    func initPlayerSprite(){
            let playerTexture = SKTexture(imageNamed: "player.png")
            let originX = CGRectGetMidX(self.frame)
            let originY = CGRectGetMidY(self.frame)
            player = SKSpriteNode(texture: playerTexture, size: CGSize(width: 26, height: 26))
    
            player.position = CGPoint(x: originX , y: originY)
    
            player.physicsBody = SKPhysicsBody(circleOfRadius: playerTexture.size().height/2)
            player.physicsBody!.dynamic = true
            player.physicsBody?.allowsRotation = false
    
            player.physicsBody!.categoryBitMask = ColliderType.Player.rawValue
            player.physicsBody!.contactTestBitMask = ColliderType.Floor.rawValue + ColliderType.Gap.rawValue
            player.physicsBody!.collisionBitMask = ColliderType.Wall.rawValue + ColliderType.Floor.rawValue
    
            self.addChild(player)
        }
    

    我移动雪碧的代码如下:

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?){
    
            var nodeTouched = SKNode()
    
            for touch: AnyObject in touches {
                let location = touch.locationInNode(self)
                let dx = -player.position.x + location.x
                let dy = -player.position.y + location.y
                let movePlayer = SKAction.moveBy(CGVector(dx: dx, dy: dy), duration: 0.02)
    
            }
    }
    

    知道如何确保碰撞检测即使在高速下也能工作吗?

    1 回复  |  直到 9 年前
        1
  •  2
  •   crashoverride777    9 年前

    从你的代码很难判断。 你为什么把碰撞称为

     ColliderType.Wall.rawValue + ColliderType....
    

    我以前从未见过用“+”作为分隔符的情况,通常使用“|” 以分离它们。

     ColliderType.Wall.rawValue | ColliderType....
    

    根据我的理解,使用加号应该将两个值相加,而不会将其视为两种碰撞类型。我可能错了。

    你也试过像这样使用精确的碰撞检测吗?

    ...physicsBody.usesPreciseCollisionDetection = true.
    

    苹果公司这样描述这个bool

    默认值为“否”。如果碰撞中的两个物体没有执行精确的碰撞检测,并且一个物体在单个帧中完全穿过另一个物体,则不会检测到碰撞。如果此属性在任何一个实体上设置为“是”,则模拟将执行更精确、更昂贵的计算来检测这些碰撞。对于小型、快速移动的物体,此属性应设置为YES。

    不确定这有帮助