【发布时间】:2016-02-08 19:45:22
【问题描述】:
我知道这个问题已被“询问”here,但它没有帮助,也没有涵盖我的问题。
话虽如此,我想知道如何实现以下目标:
- 我需要一个
node,它有 2 个物理实体:1) 一个较小的实体 (200x200),代表节点的框架,2) 一个较大的实体 (500x500),代表一个区域的外围,它将充当“检测”边界。外体不会物理地撞击碰撞的物体,它只需要记录一个物体已经遇到了那个边界线。以下是我所描述内容的一个简单概念:
我最初的方法是使用SKPhysicsBody bodyWithBodies:<NSArray>,但这只会将重叠主体创建为较小的矩形。
所以我想我必须为较小的主体(黑色方块)创建一个SKSpriteNode,为较大的主体(蓝色方块)创建另一个SKSpriteNode,并将其作为子对象添加到较小的方块中(或相反亦然)。
我的问题是我似乎无法在注册该交互时获得外边界以允许另一个对象通过。我最接近的是让一个可移动节点到达边界,然后只要我试图穿过边界,就会不断地沿着 500x500 边界线来回推动。我已经能够使移动节点无法通过 500x500,但这与我所需要的完全相反。
这是我正在使用的代码,也许有人可以看到我做错了什么:
/// TESTING
// Detection body - 500x500
SKSpriteNode *dbody = [SKSpriteNode spriteNodeWithImageNamed:@"object500"];
dbody.position = CGPointMake(500, 100);
dbody.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:dbody.frame];
dbody.physicsBody.categoryBitMask = detection;
dbody.physicsBody.collisionBitMask = 0;
dbody.physicsBody.contactTestBitMask = player;
// Node body - 200x200
SKSpriteNode *testBoundary = [SKSpriteNode spriteNodeWithImageNamed:@"object"];
testBoundary.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:testBoundary.frame];
testBoundary.physicsBody.categoryBitMask = object;
testBoundary.physicsBody.contactTestBitMask = player;
testBoundary.position = dbody.position;
// Add boundary as child to main node
[testBoundary addChild:dbody];
// Add to scene
[chapterScene addChild:dbody];
所有这些都在 LevelScene.m 中,这是一个 SKScene 集,标题中带有 <SKPhysicsContactDelegate>。另外,我已经这样定义了chapterScene:
// Set up main chapter scene
self.anchorPoint = CGPointMake(0.5, 0.5); //0,0 to 1,1
chapterScene = [SKNode node];
[self addChild:chapterScene];
,chapterScene 定义在 LevelScene 的顶部。
@interface LevelScene () {
#pragma 1 Scene objects
SKNode *chapterScene;
}
如果有人可以帮助我找出我做错了什么,或者也许可以提供一种替代方法来满足我的需求,我将不胜感激。
注意:我的备份解决方案在 CPU 和内存方面似乎很昂贵,但我相信它仍然可以工作。我将有一个BOOL isDetected 来表示移动的玩家节点是否在 500x500 区域内,然后在update 中,我将监控到 500x500 节点中心的较小 200x200 矩形边界的距离。但我更愿意使用 2 个SKPhysicsBody,因为我确信它可以完成并且更容易实现。
更新:
这是我的移动角色(一个名为 Character.m 的单独 SKNode 类)
- (void)createCharacterWithName:(NSString *)charName {
character = [SKSpriteNode spriteNodeWithImageNamed:charName];
[self addChild:character];
self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:character.frame.size.width/2.0];
self.physicsBody.dynamic = YES;
self.physicsBody.allowsRotation = YES;
// Define physics body relationships
self.physicsBody.categoryBitMask = player;
self.physicsBody.collisionBitMask = player;
self.physicsBody.contactTestBitMask = detection;
}
【问题讨论】:
-
你介意我用swift写一个答案吗?
-
哈哈继续 - 我肯定会翻译它
-
好的,让我自己试试。你想要一个对象通过外部区域..并注册它。并且你想与内部碰撞..对
-
是的,正是我需要的
-
您的 2 sprite 代码无法正常工作的原因是因为使用带循环的边意味着动态总是错误的,因此对象永远不会注册命中玩家。您需要将对象添加到玩家接触测试中
标签: ios sprite-kit skspritenode skphysicsbody