2014-11-23 60 views
2

我试图在游戏场景框架的边缘创建一个不可穿透的边框。在Swift中使用edgeLoopF​​romRect

在斯威夫特我试图重新写为:

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轴才能得到正确的边界,但这不是一个问题。任何帮助将非常感激。

+0

是你的场景是从'sks'文件加载?检查该文件中场景的大小,因为它可能太大。你有没有在你的播放器和边缘设置'collisionBitMask's。检查你的标签,这个问题与该标签的图像边缘分离无关。 – Okapi 2014-11-23 11:35:36

+0

谢谢霍加皮。我没有从sks文件加载。而且我还没有设置collisionBitMasks,我是否需要为边缘? – 2014-11-23 11:56:47

+0

'collisionBitMask'默认值被设置为与所有其他物理体碰撞。你的精灵有物理实体吗?你是用一种力量,冲动,还是设定它们的速度来移动它们? – 0x141E 2014-11-23 19:28:02

回答

2

的关键是通过施加力/冲动或通过设置速度属性来移动你的精灵,让他们正确地

  1. 与其他物理机构的碰撞(如边缘环路)响应
  2. 诸如线性/角度阻尼,摩擦和力场等力。
2

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

let SCENE_EDGE_CATEGORY: UInt32 = 0x1 

随着该常量定义的,你现在可以在一个非常可读的方式定义场景的物理体:

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

对于任何想要受场景边缘约束的精灵,将其物理主体的碰撞位掩码设置为场景的类别位掩码。你告诉你想要的物理引擎是精灵和场景的边缘之间处理冲突雪碧套件:

someSprite.physicsBody!.collisionBitMask = SCENE_EDGE_CATEGORY 

希望这有助于!

+0

这只是在第二行显示为预期声明的错误 – needshelp 2015-07-18 22:55:53

+0

这帮助了我,在Swift 3中工作 – 2017-04-05 23:04:44

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) 
    } 

工作正常,我。

0

这一定会帮助你在Swift中定义屏幕的边缘。

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