gpt4 book ai didi

ios - Spritekit bodyWithbodies 不起作用

转载 作者:行者123 更新时间:2023-11-29 12:03:05 25 4
gpt4 key购买 nike

我希望我的 spritenode 有多个 physicbodies。我使用了 bodyWithbodies 并添加了 phyisicbodies。但是没有检测到碰撞。

下面是创建 spritenode 的方法,它应该有更多的 physicbodies

-(void)spawnBrick
{
SKPhysicsBody *brickLeftEdge = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(brick.size.width - brick.size.width, brick.size.height - brick.size.height) toPoint:CGPointMake(brick.size.width - brick.size.width, brick.size.height)];
brickLeftEdge.categoryBitMask = brickLeftEdgeCategory;
brickLeftEdge.contactTestBitMask = leftEdgeCategory;

SKPhysicsBody *brickRightEdge = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(brick.size.width, brick.size.height - brick.size.height) toPoint:CGPointMake(brick.size.width, brick.size.height)];
brickRightEdge.categoryBitMask = brickRightEdgeCategory;
brickRightEdge.contactTestBitMask = rightEdgeCategory;

brick = [[BrickNodeOne alloc] init];
brick.name = @"Brick";

NSArray *array = [self objectForKeyedSubscript:@"Brick"];
BrickNodeOne *oldBrick;
if ([array count] > 0) {
oldBrick = [array objectAtIndex:([array count]-1)];
}
brick.position = CGPointMake(brick.size.width / 2, (brick.size.height + oldBrick.position.y)-15);
brick.physicsBody = [SKPhysicsBody bodyWithBodies:@[brickLeftEdge, brickRightEdge]];

brick.physicsBody.collisionBitMask = 0;
[self addChild:brick];
}

DidMoveToView 中,我用 spritenode 声明了屏幕的左右边缘以进行碰撞检测

    // setup edges
_leftEdge = [[SKNode alloc] init];
// heigt + 1000 = for spawned objects above screen
_leftEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(0.0, 0.0) toPoint:CGPointMake(0.0, self.size.height + 1000)];
_leftEdge.physicsBody.dynamic = NO;
_leftEdge.physicsBody.categoryBitMask = leftEdgeCategory;
_leftEdge.physicsBody.contactTestBitMask = brickLeftEdgeCategory;
_leftEdge.position = CGPointZero;
[self addChild:_leftEdge];

_rightEdge = [[SKNode alloc] init];
// heigt + 1000 = for spawned objects above screen
_rightEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(self.size.width, 0.0) toPoint:CGPointMake(self.size.width, self.size.height + 1000)];
_rightEdge.physicsBody.dynamic = NO;
_rightEdge.physicsBody.categoryBitMask = rightEdgeCategory;
_rightEdge.physicsBody.contactTestBitMask = brickRightEdgeCategory;
[self addChild:_rightEdge];

以下代码包含位掩码信息:

我在头文件中声明了 SKPhysicsContactDelegate。在 didMoveToView

中设置委托(delegate)
static const uint32_t leftEdgeCategory          = 0x1 << 0;
static const uint32_t rightEdgeCategory = 0x1 << 1;
static const uint32_t brickLeftEdgeCategory = 0x1 << 2;
static const uint32_t brickRightEdgeCategory = 0x1 << 3;
static const uint32_t kCarCategory = 0x1 << 4;

评论信息

所以我将 physicsbody 从边缘更改为矩形,不幸的是没有检测到接触。

SKPhysicsBody *brickLeftEdge = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(40, brick.size.height) center:CGPointMake((brick.size.width - brick.size.width) + 20 , self.size.height / 2)];
brickLeftEdge.categoryBitMask = brickLeftEdgeCategory;
brickLeftEdge.contactTestBitMask = leftEdgeCategory;

SKPhysicsBody *brickRightEdge = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(40, brick.size.height) center:CGPointMake(brick.size.width - 20, brick.size.height / 2)];
brickRightEdge.categoryBitMask = brickRightEdgeCategory;
brickRightEdge.contactTestBitMask = rightEdgeCategory;

最佳答案

您遇到的问题与您使用的是静态物理体有关。这是来自关于 bodyWithEdgeFromPoint: toPoint 的文档方法:

An edge has no volume or mass and is always treated as if the dynamic property is equal to NO. Edges may only collide with volume-based physics bodies.

意味着,只有当至少一个物体被定义为动态时才会发生碰撞(默认情况下,基于体积的物理物体是动态的)。

关于ios - Spritekit bodyWithbodies 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com