在我目前使用SpriteKit的项目中,我有一堆精灵需要在不同时间独立地放大和缩小.问题是当我缩放节点时,物理体不会随之缩放,因此它会破坏物理学.这是我为了这个问题而放在一起的一个小例子:
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];
Run Code Online (Sandbox Code Playgroud)

注意蓝色精灵(按比例缩小)如何位于红色精灵之上,但你可以告诉它的物理体仍然具有我告诉它的尺寸,并且它没有缩放.
很明显,缩小节点不会缩小物理体.所以我的问题是如果我必须手动完成它,我该怎么做呢?
我尝试在缩放时用一个合适的尺寸交换身体,但是如果旧的身体有关节等,那么事情会变得非常复杂......如果我能以某种方式扩展现有的身体,那就简单多了.
小智 7
使用SKAction或更新循环,您可以SKPhysicsBody使用适当的比例创建新的并将其应用于对象.但是,通过这样做,您将失去速度.要解决此问题,您可以执行以下操作:
SKPhysicsBody *newBody = [SKPhysicsBody bodyWithRectangleOfSize:boxObject.size];
newBody.velocity = boxObject.physicsBody.velocity;
boxObject.physicsBody = newBody;
Run Code Online (Sandbox Code Playgroud)
物理身体形状无法缩放.绝对不是Box2D内部使用的Sprite Kit.
除了内部优化之外,扩展物理机构也会产生深远的影响.例如,缩放身体的形状可能会使身体陷入碰撞.它会影响关节的相互作用.它肯定会改变身体的密度或质量,从而改变它的行为.
你可以使用一个SKNode,你没有物理主体添加精灵,然后添加额外的SKNode与给定大小的物体.然后,您可以在开始缩放精灵时启用或禁用实体.如果你正确计时,玩家将不会注意到碰撞形状只是从全尺寸变为半尺寸,而精灵会动画缩放过渡.
你必须根据它的大小来计算身体的密度和其他属性.
对于阅读此答案的其他任何人,我相信现在物理体与 SKNode 一起扩展。我使用 Xcode 8.2.1 和 Swift 3.0.2。我开始一个新项目,选择游戏,填写详细信息。更改2个文件:
GameViewController.swift(添加一行)
view.showsFPS = true
view.showsNodeCount = true
// add this to turn on Physics Edges
view.showsPhysics = true
Run Code Online (Sandbox Code Playgroud)
Game Scene.swift(替换sceneDidLoad())函数如下:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
物理边界随精灵节点缩放。
我遇到了完全相同的问题,我认为这是精灵套件中的错误。
尝试使用动作来缩放,这适用于整个场景。
[self runAction:[SKAction scaleTo:0.5 duration:0]];
Run Code Online (Sandbox Code Playgroud)
我原来的问题
这是你想要发生的吗
- (void) anthoertest
{
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:n1.size];
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:n2.size];
n2.physicsBody.affectedByGravity = YES;
[self addChild:n2];
[self shrinkMe:n1];
}
- (void) shrinkMe:(SKSpriteNode *) s
{
[s setScale:0.5];
s.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:s.size];
}
Run Code Online (Sandbox Code Playgroud)
