有没有办法直观地看到精灵套件的 SKPhysicsbody 边界?

Posted

技术标签:

【中文标题】有没有办法直观地看到精灵套件的 SKPhysicsbody 边界?【英文标题】:Is there a way to visually see sprite kit's SKPhysicsbody borderline? 【发布时间】:2014-02-08 10:15:58 【问题描述】:

我使用 bodyWithPolygonFromPath 来定义物理体的体积,并使用了

http://dazchong.com/spritekit/

获取所需的路径。但路径似乎不正确,我希望看到物理体路径的边界线以查看形状是否正确。

有什么方法可以查看物理体的体积轮廓吗?

我尝试了以下代码,但它不起作用。

ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];

CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 50 - offsetX, 110 - offsetY);
CGPathAddLineToPoint(path, NULL, 18 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 140 - offsetX, 15 - offsetY);

CGPathCloseSubpath(path);

SKShapeNode *yourline = [SKShapeNode node];
yourline.name = @"yourline";
yourline.path = path;
[yourline setStrokeColor:[UIColor redColor]];
 [self addChild:yourline];


ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
//[ship setScale:0.5];
ship.zRotation = - M_PI / 2;

【问题讨论】:

【参考方案1】:

对于 Objective-C 和 ios

在您的 ViewController.m 中找到此代码

SKView *skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;

在最后一行添加

skView.showsPhysics = YES;

构建并运行,您应该会看到所有物理 Body 边界

我注意到您将 shapeNode 添加到 self 而不是 spriteNode 所以尝试以下操作

SKSpriteNode *ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 50 - offsetX, 110 - offsetY);
CGPathAddLineToPoint(path, NULL, 18 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 140 - offsetX, 15 - offsetY);
CGPathCloseSubpath(path);

ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];

[self addChild:ship];

SKShapeNode *shape = [SKShapeNode node];
shape.path = path;
shape.strokeColor = [SKColor colorWithRed:1.0 green:0 blue:0 alpha:0.5];
shape.lineWidth = 1.0;
[ship addChild:shape];

对于 Swift 和 iOS >= 8.0

let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.showsPhysics = true

如果您想要自定义边界线

let ship = SKSpriteNode(imageNamed: "Spaceship")
let offsetX = ship.frame.size.width * ship.anchorPoint.x
let offsetY = ship.frame.size.height * ship.anchorPoint.y

let path = CGPathCreateMutable()
CGPathMoveToPoint(path, nil, 50 - offsetX, 110 - offsetY)
CGPathAddLineToPoint(path, nil, 18 - offsetX, 16 - offsetY)
CGPathAddLineToPoint(path, nil, 140 - offsetX, 15 - offsetY)
CGPathCloseSubpath(path)

ship.physicsBody = SKPhysicsBody(polygonFromPath: path)
addChild(ship)

let shape = SKShapeNode()
shape.path = path
shape.strokeColor = SKColor(red: 1.0, green: 0, blue: 0, alpha: 0.5)
shape.lineWidth = 1.0
addChild(shape)

已经测试过:]

祝你好运!!

【讨论】:

您在哪里看到“skView.showsPhysics”?也许您指的是测试版更新? 是的,仅适用于 iOS 7.1 Beta,我的答案已更新,谢谢【参考方案2】:

斯威夫特

GameViewController.swift 中,添加这一行:

override func viewDidLoad() 
    ...        
    if let view = self.view as! SKView? 
        ...
        view.showsPhysics = true // <--- add this line
    

【讨论】:

【参考方案3】:

出于测试目的,我会将船舶设置为 SKShapeNode,暂时注释掉您的行 SKShapeNode,并将 ship.path 设置为您用于 SKPhysicsBody 的相同路径。

或者你可以使用这个:

https://github.com/ymc-thzi/physicsDebugger

【讨论】:

【参考方案4】:

在新的 7.1 测试版中,如上所述,有允许这样做的功能。

【讨论】:

【参考方案5】:

我知道这有点晚了,但我想你可能会对我的新工具感兴趣,它会自动围绕精灵图像创建一条路径(因此你不必自己手动点击这些点),然后你可以调整各种设置以更好地满足您的要求。该工具还输出 Objective C 和 Swift 程序代码,用于添加精灵物理体的路径。希望它对某些人有所帮助。谢谢:

http://www.radicalphase.com/pathgen/

【讨论】:

抱歉域名已过期 - 工具现已重新上线 :) 新更新:现在包括强制凸模式(默认启用)以确保与 SpriteKit 物理实体 100% 兼容,并减少点数 - 尽情享受吧! :)【参考方案6】:

您的形状节点代码是正确的。看起来yourline 可能会在实际船之前添加到场景中,因此船的精灵将被绘制在它上面,使其变得模糊。确保将yourline.zPosition 设置为最高值,或确保[self addChild:yourline][self addChild:ship] 之后执行。

【讨论】:

【参考方案7】:

这将在您的节点顶部添加一个红线形状。使用与您为节点物理体定义的路径相同的路径。

+(void)debugPath:(CGPathRef)path onNode:(SKNode*)node 
    SKShapeNode *yourline = [SKShapeNode node];
    yourline.name = @"yourline";
    yourline.path = path;
    [yourline setStrokeColor:[UIColor redColor]];
    [node addChild:yourline];

即用法:

[[self class] debugPath:ship.physicsBody.path onNode:ship];

【讨论】:

以上是关于有没有办法直观地看到精灵套件的 SKPhysicsbody 边界?的主要内容,如果未能解决你的问题,请参考以下文章

具有相同 SKPhysics 身体对象的多个精灵

有没有办法从代码中获取放置在场景编辑器中的 SKSpriteNode 的当前位置? - 精灵套件

SKPhysics 到达某个位置后关闭 isDynamic

如何让我的精灵套件场景出现在 UIView 上方?

有没有办法在场景套件中添加轮廓?

SKPhysics体路径生成器