Ios 如何使节点与移动场景的侧面碰撞?
嗨,我想知道我的节点如何与移动的场景发生碰撞。我有一个主节点,它可以沿x轴移动,并且可以与其他节点碰撞。我希望使非主节点与移动场景的侧面碰撞。我怎样才能做到?(摄影机仅跟随主节点) 我有一门障碍课 在我的传销中Ios 如何使节点与移动场景的侧面碰撞?,ios,objective-c,sprite-kit,game-physics,skphysicsbody,Ios,Objective C,Sprite Kit,Game Physics,Skphysicsbody,嗨,我想知道我的节点如何与移动的场景发生碰撞。我有一个主节点,它可以沿x轴移动,并且可以与其他节点碰撞。我希望使非主节点与移动场景的侧面碰撞。我怎样才能做到?(摄影机仅跟随主节点) 我有一门障碍课 在我的传销中 -(id)init { if(self = [super init]) { int aux = arc4random()%3; switch (aux) { case 0: self = [MLObstaculo spriteNodeWithColor:[UICo
-(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;
}
所以我给我的世界级增加了障碍
在我的世界里
-(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;
}
}
更新
-(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\u t ObstacleCategory=0x1通过定义冲突位掩码首次编辑
-(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;
然后将Physics.h导入到所有类中(物理不需要alloc或init.h,只需使用ObstacleCategory和VisibleSidesCategory)从这个问题和另一个问题的问题中,我最终确定API中存在错误。具体地说,考虑节点的锚点(0,0)在初始化过程中,如果使用基于的带rect:
或FromRect:
的初始值设定项(但不是基于RectOfSize:
或center:
的初始值设定项),则会出现意外行为
因此,即使场景和其他对象的锚点设置为(0.5,0.5),节点也会相对于父节点的中点放置其左下角,而不是相对于父节点的中点放置子节点的中点
具体而言,这可以通过以下三种方式之一解决:
使用(0,0)的锚点
在不使用基于Rect的初始值设定项的情况下创建节点。您可以使用shapeNodeWithRectOfSize:
而不是shapeNodeWithRect:
和BodyWithEdgeLopFromPath:
而不是BodyWithEdgeLopFromRect:
将矩形的初始位置设置为左下方,如下所示:
node.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(-node.size.width/2,-node.size.height/2,node.size.width,node.size.height)]
您是否也向非主节点添加了物理?我尝试了您的代码。我知道应该可以,因为它也在Ios开发人员文档中,但不起作用。我已经用didBeginContact方法编写了代码。但仍然没有。您是否在内部将此代码编写为-(id)initWithSize:(CGSize)size{if(self=[超级初始化大小:大小]){你的所有节点都有物理特性吗?是的,这段代码应该可以用,我在我的应用程序中使用。是的,我的所有节点都有物理特性。我的节点实际上可以与任何东西碰撞,但不能与移动场景的侧面碰撞。你的所有节点都有唯一的categoryBitMasks吗?你也可以检查你所有节点的碰撞位Masks吗?这可能是p的来源问题OK我将障碍设置为处理碰撞。但问题仍然存在。到底发生了什么?从您的代码和您描述的所有内容来看,如果位掩码设置和应用正确,那么障碍不应该忽略边缘,因此,当您运行代码时,这将有助于准确了解您看到了什么。此外,您遇到障碍的原因是什么's unit不称其super's init?@XtDiego我编辑了我的答案,以便用您所说的内容提供问题的解决方案。我相信第二点,缺少主播点,可能是您遇到的问题。我的主播点设置在我的项目代码以及我的类的super init调用中。问题仍然存在。到底发生了什么当我的障碍物与我的主节点碰撞并飞走时,当它们与我的场景边缘接触时,它们应该碰撞,但节点只是通过。
typedef enum : uint8_t {
ObstacleCategory = 1,
VisibleSidesCategory = 2,
} ColliderType;