嗨,我想知道我的节点如何与移动场景碰撞。我有一个主节点,它可以沿着x轴移动并且可以与其他节点碰撞。我想让非主节点与移动场景的侧面碰撞。我怎么能做到呢?(摄像机只跟随主节点)。
我有一个障碍课。
in my MLObstacle.m
-(id)init
{
if(self = [super init])
{
int aux = arc4random()%3;
switch (aux) {
case 0:
self = [MLObstaculo spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake((aux+1)*10,(aux+1)*13 )];
break;
case 1:
self = [MLObstaculo spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake((aux+1)*10,(aux+1)*15 )];
break;
case 2:
self = [MLObstaculo spriteNodeWithColor:[UIColor redColor] size:CGSizeMake((aux+1)*10,(aux+1)*14 )];
break;
}
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.affectedByGravity = NO;
self.physicsBody.categoryBitMask = obstacleCategory;
self.physicsBody.contactTestBitMask = visibleSidesCategory;
self.physicsBody.collisionBitMask = visibleSidesCategory;
[self setDx:0.0];
[self setDy:2.4];
}
return self;
}
所以我添加障碍物到我的WorldClass
In my world .m
-(void)GenerateWorld
{
SKSpriteNode *Ground = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(self.scene.frame.size.width,100)];
Ground.position = CGPointMake(0, -self.scene.frame.size.height/2 + Ground.size.height/2);
Ground.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Ground.size];
Ground.physicsBody.dynamic = NO;
[self addChild:Ground];
for(int i = 0; i < 3; i++)
{
MLObstaculo * auxobs= [[MLObstaculo alloc]initObstaculo];
auxobs.position = CGPointMake((i+1)*50, Ground.position.y + Ground.size.height/2 +auxobs.size.height/2 );
[self.Obstaculos addObject:auxobs];
[self addChild:auxobs];
auxobs = NULL;
}
}
然后我将世界添加到我的场景
Scene.m
-(id)initWithSize:(CGSize)size
{
if(self = [super initWithSize:size]
{
WorldGen * world = [[WorldGen alloc] init];
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
self.physicsWorld.contactDelegate = self;
self.physicsBody.categoryBitMask = VisibleSidesCategory
self.physicsBody.collisionBitMask = ObstacleCategory;
self.anchorPoint = CGPointMake(0.5,0.5);
[self addChild:world];
[world GenerateWorld];
}
}
更新……
-(void)didSimulatePhysics
{
[self centerOnNode:hero];
}
-(void)centerOnNode:(SKNode *)node
{
CGPoint pointinScene = [self convertPoint:node.position fromNode:node.parent];
world.position = CGPointMake(world.position.x -pointinScene.x , world.position.y);
}
我用这种格式初始化了所有类别变量(static const uint32_t ObstacleCategory = 0x1 <<1;
)
首先通过定义collisionBitMask进行编辑
-(id)init
{
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.categoryBitMask = ObstacleCategory;
self.physicsBody.contactTestBitMask = VisibleSidesCategory;
self.physicsBods.collisionBitMask = VisibleSidesCategory;
}
第二次做这个步骤在Xcode中-> 文件 -> 新 -> 文件 -> C和c++ -> 头文件
给出Physics.h的名称,并在其中添加这些行:
typedef enum : uint8_t {
ObstacleCategory = 1,
VisibleSidesCategory = 2,
} ColliderType;
,然后导入物理。h 到你所有的类(你不需要分配或初始化物理。h,只使用ObstacleCategory和visblesidescategory)
从这个和另一个问题的问题,我终于确定有一个错误的API。具体来说,如果使用基于WithRect:
或FromRect:
的初始化器(而不是基于RectOfSize:
或center:
的初始化器),则在初始化期间将节点的anchorPoint视为(0,0),因此会得到意想不到的行为。
因此,即使场景和其他对象的锚点设置为(0.5,0.5),节点也会将其左下角相对于父节点的中点放置,而不是将子节点的中点相对于父节点的中点放置。
具体来说,这可以通过以下三种方式中的任何一种来解决:
- 使用(0,0)的锚点。
- 不使用基于Rect的初始化器创建节点。你可以用
shapeNodeWithRectOfSize:
代替shapeNodeWithRect:
,用bodyWithEdgeLoopFromPath:
代替bodyWithEdgeLoopFromRect:
- 将Rect的初始位置设置为较低且向左,如下所示:
node.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(-node.size.width/2, -node.size.height/2, node.size.width, node.size.height)];