在Swift中使用edgeLoopF​​romRect

时间:2014-11-23 11:15:19

标签: swift sprite-kit

我正试图在游戏场景框架的边缘创建一个难以穿透的边框。

在Swift中,我试图将其重写为:

override func didMoveToView(view: SKView) {

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRect(x: 0,y: 100,width: self.frame.size.width,height: self.frame.size.height-200))

}

不是在框架的边缘给我一个清晰的边界,而是提供一个弱边框,我的播放器(没有指定的质量)可以通过。

我也不确定为什么我必须减去并添加到y轴以获得正确的边框,但这不是一个问题。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

首先应定义一个位掩码类别来表示游戏场景的物理主体。我通常使用32位二进制值00000000000000000000000000000001,我将其定义为常量:

let SCENE_EDGE_CATEGORY: UInt32 = 0x1

通过定义常量,您现在可以以一种非常易读的方式定义场景的物理主体:

self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsBody!.categoryBitMask = SCENE_EDGE_CATEGORY

对于您希望受场景边缘约束的任何精灵,请将其物理主体的碰撞位掩码设置为场景的类别位掩码。你告诉Sprite Kit您希望物理引擎处理该精灵与场景边缘之间的碰撞:

someSprite.physicsBody!.collisionBitMask = SCENE_EDGE_CATEGORY

希望这有帮助!

答案 1 :(得分:2)

关键是通过施加力/冲动或通过设置力度属性来移动精灵,以便它们正确响应

  1. 与其他物理实体的碰撞(例如边缘循环)
  2. 诸如线性/角度阻尼,摩擦力和力场之类的力。

答案 2 :(得分:0)

试试这个:

override init(size: CGSize)
    {
    super.init(size: size)
    physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRectMake(0, 0, size.width, size.height))     
    anchorPoint = CGPointMake(0.0, 0.0)
    }

对我来说很好。

答案 3 :(得分:0)

这肯定会帮助您在Swift中定义屏幕边缘。

self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)