我正在使用iOS SpriteKit开发游戏。我试图在这个游戏中制作一个物体,将物体拉向它,并且随着物体靠近它,力会越来越大,比如磁铁或黑洞。我一直很难弄清楚要更改哪些属性才能使该节点PhysicalBody在经过时吸引其他节点。
[在iOS 8和OS X 10.10中,SpriteKit具有SKFieldNode
用于创建应用于区域中物体的力。这对于浮力,特定于区域的重力和“磁铁”非常有用。
但是请注意-从该类中获得的SKFieldNode
可能不是您想要的那种“磁铁”游戏玩法所想要的。磁场的行为按照magneticField
...进行,也就是说,它偏转移动的带电体。我们通常认为的磁铁-粘在冰箱上,捡垃圾车或使飞翔器飞起来的磁铁-是该力的magneticField
。
如果您想吸引附近的任何事物(或某些特定事物),则real-world physics at the micro level是您真正想要的。 (要仅吸引特定事物,请在字段上使用a higher-level effect,并在不应与之交互的正文上使用radialGravityField
。)
如果您想要一个或多或少强烈吸引不同事物或吸引某些事物而排斥其他事物的领域,则categoryBitMask
是一个不错的选择。您可以使用物理物体的fieldBitMask
属性,使它们受到磁场的吸引或排斥(负值或正值)或多或少受到强烈影响(或大或小的绝对值)。
在iOS 8和OS X 10.10之前,SpriteKit的物理模拟不包括这种作用力。
不过,这并不能阻止您自己进行模拟。在场景的electricField
方法中,您可以找到物体之间的距离,在每个物体上计算一个与该距离成正比的力(并与要模拟的磁场强度成正比),然后对每个物体施加力。
是的,您可以在Sprite Kit中创建磁力
charge
记住英雄和硬币身都需要动态
自苹果公司在iOS 8中引入update:
以来,您现在似乎可以了。
好,您可以使用以下代码段来完成所需的操作,但没有-(void)didSimulatePhysics
{
[self updateCoin];
}
-(void) updateCoin
{
[self enumerateChildNodesWithName:@"coin" usingBlock:^(SKNode *node, BOOL *stop) {
CGPoint position;
position=node.position;
//move coin right to left
position.x -= 10;
node.position = position;
//apply the magnetic force between hero and coin
[self applyMagnetForce:coin];
if (node.position.x <- 100)
[node removeFromParent];
}];
}
-(void)applyMagnetForce:(sprite*)node
{
if( gameViewController.globalStoreClass.magnetStatus)
{
//if hero under area of magnetic force
if(node.position.x<400)
{
node.physicsBody.allowsRotation=FALSE;
///just for fun
node.physicsBody.linearDamping=10;
node.physicsBody.angularVelocity=10*10;
//where _gameHero is magnet fulling object
[node.physicsBody applyForce:CGVectorMake((10*10)*(_gameHero.position.x- node.position.x),(10*10)*(_gameHero.position.y-node.position.y)) atPoint:CGPointMake(_gameHero.position.x,_gameHero.position.y)];
}
}
}
和SKFieldNode属性
正文代码:
attraction
与该黑洞物体接触:
repulsion