首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKPhysicsBody和[SKNode setScale:]

SKPhysicsBody和[SKNode setScale:]
EN

Stack Overflow用户
提问于 2013-10-11 04:31:11
回答 6查看 5.5K关注 0票数 9

在我目前使用SpriteKit的项目中,我有一堆精灵需要在不同的时间独立地放大和缩小。问题是,当我缩放节点时,物理体并没有随之缩放,所以它搞砸了物理。下面是我为这个问题准备的一个小例子:

代码语言:javascript
复制
CGSize objectSize = CGSizeMake(100, 100);
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 0, self.size.width, self.size.height)];

SKSpriteNode *n1 = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:objectSize];
n1.position = CGPointMake(self.size.width/2, 2*self.size.height/3);
n1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectSize];
n1.physicsBody.affectedByGravity = YES;
[self addChild:n1];

SKSpriteNode *n2 = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:objectSize];
n2.position = CGPointMake(self.size.width/2, self.size.height/3);
n2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectSize];
n2.physicsBody.affectedByGravity = YES;
[self addChild:n2];

[n1 setScale:0.5];

注意到蓝色的精灵(缩小了)坐在红色的上面,但你可以看出它的物理实体仍然有我告诉它的尺寸,但它没有缩放。

因此,很明显,缩小节点并不会缩小physicsBody。所以我的问题是,如果我必须手动完成,我该如何去做呢?

我试着在缩放时将身体换成合适的大小,但如果旧身体有关节,事情就会变得非常复杂,等等。如果我能以某种方式缩放现有的身体,那就简单多了。

EN

回答 6

Stack Overflow用户

发布于 2014-01-10 04:46:18

使用SKAction或更新循环,可以创建具有适当比例的新SKPhysicsBody并将其应用于对象。但是,通过这样做,您将失去速度。要解决此问题,可以执行以下操作:

代码语言:javascript
复制
SKPhysicsBody *newBody = [SKPhysicsBody bodyWithRectangleOfSize:boxObject.size];
newBody.velocity = boxObject.physicsBody.velocity;

boxObject.physicsBody = newBody;
票数 7
EN

Stack Overflow用户

发布于 2013-10-17 07:00:35

物理身体形状不能缩放。当然不是在雪碧包内部使用的Box2D中。

除了内部优化,缩放一个物理体将具有深远的影响。例如,放大物体的形状可能会使物体陷入碰撞。它会影响关节的交互方式。它肯定会改变物体的密度或质量,从而改变它的行为。

您可以使用SKNode,在其中添加不带物理实体的精灵,然后添加具有给定大小的实体的附加SKNode。然后,可以在开始缩放精灵时启用或禁用实体。如果你选择了正确的时间,玩家不会注意到碰撞形状只是从全尺寸变成了半尺寸,而精灵却在动画中进行缩放转换。

不过,你必须根据它的大小来计算物体的密度,也许还有其他属性。

票数 5
EN

Stack Overflow用户

发布于 2017-03-26 11:30:06

对于其他阅读这个答案的人来说,我相信现在物理体可以与SKNode一起扩展。我使用的是Xcode 8.2.1和Swift 3.0.2。我开始一个新的项目,选择游戏,填写详细信息。更改2个文件:

GameViewController.swift (添加一行)

代码语言:javascript
复制
view.showsFPS = true
view.showsNodeCount = true

// add this to turn on Physics Edges    
view.showsPhysics = true

游戏Scene.swift (将sceneDidLoad())函数替换为:

代码语言:javascript
复制
override func sceneDidLoad() {

    var found = false
    self.enumerateChildNodes(withName: "testSprite") {
        node, stop in
            found = true
    }
    if !found {
        let testSprite = SKSpriteNode(color: UIColor.white, size: CGSize(width: 200.0, height: 200.0))
        testSprite.physicsBody = SKPhysicsBody(polygonFrom: CGPath(rect: CGRect(x: -100.0, y: -100.0, width: 200.0, height: 200.0), transform: nil))
        testSprite.physicsBody?.affectedByGravity = false
        testSprite.name = "testSprite"
        let scaleAction = SKAction.repeatForever(SKAction.sequence([
            SKAction.scale(to: 2.0, duration: 2.0),
            SKAction.scale(to: 0.5, duration: 2.0)
            ]))
        testSprite.run(scaleAction)
        self.addChild(testSprite)
    }

}

物理边界使用精灵节点进行缩放。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19305653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档