我正在尝试使用iOS SpriteKit以编程方式使用内置物理构建一个钟摆。
目前,我有摆锤枢轴,重量和有限的关节,允许重量摆动......但是,我不知道如何在枢轴和重量之间编码线(杆)。
我认为用SKShapeNode画一条线会是一个开始......?
-(void)setupPendulum
{
pivot = [SKSpriteNode spriteNodeWithImageNamed:@"pivot.png"];
pivot.position = CGPointMake(self.size.width / 2, self.size.height / 2);
pivot.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:1.0];
pivot.physicsBody.dynamic = NO;
pivot.physicsBody.affectedByGravity = NO;
pivot.xScale = 0.25;
pivot.yScale = 0.25;
[self addChild:pivot];
weight = [SKSpriteNode spriteNodeWithImageNamed:@"weight.png"];
weight.position = CGPointMake(150, 512);
weight.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:100.0];
weight.physicsBody.dynamic = YES;
weight.physicsBody.affectedByGravity = YES;
weight.physicsBody.mass = 0.5;
weight.xScale = 0.75;
weight.yScale = 0.75;
[self addChild:weight];
SKPhysicsBody *ab = pivot.physicsBody;
SKPhysicsBody *bb = weight.physicsBody;
CGPoint ap = pivot.position;
CGPoint bp = weight.position;
SKPhysicsJointLimit *joints = [SKPhysicsJointLimit jointWithBodyA:ab
bodyB:bb
anchorA:ap
anchorB:bp];
[self.physicsWorld addJoint:joints];
}
答案 0 :(得分:4)
我的项目需要SKPhysicsJointLimit
而不是pin,所以在经过大量的反复试验后我找到了以下解决方案。该行将被删除并在didSimulatePhysics
中绘制。该线连接“satelliteShip”,因为它围绕“motherShip”运行。我是这一切的新手,所以我很感激有关这种方法的任何反馈。
首先设置变量:
SKShapeNode *_lineNode;
现在在didSimulatePhysics中绘制线:
- (void)didSimulatePhysics {
if (_lineNode){
[_lineNode removeFromParent];
}
SKNode *satelliteShip = [self childNodeWithName:kSatelliteShipName];
CGMutablePathRef pathToDraw;
pathToDraw = CGPathCreateMutable();
CGPathMoveToPoint(pathToDraw, NULL, motherShip.position.x, motherShip.position.y);
CGPathAddLineToPoint(pathToDraw, NULL, satelliteShip.position.x, satelliteShip.position.y);
CGPathCloseSubpath(pathToDraw);
_lineNode = [SKShapeNode node];
_lineNode.path = pathToDraw;
CGPathRelease(pathToDraw);
_lineNode.strokeColor = [SKColor grayColor];
[self addChild:_lineNode];
}
答案 1 :(得分:1)
正确的方向是查看 SKPhysicsJointPin ,它可以使用SKShapeNode或SKSpriteNode(等)。
注意关于我的问题及其评论:
由于SpriteKit上没有太多文档(现在)超出Apple的(小书大小)参考文献以及在线的单一类应用程序示例/教程 - 大多数人的回应是, “只需查看它+谷歌中的Cocos2d”,然后重新做到这一点。这很好,但我不是一个复制粘贴的人。我喜欢学习可持续和可重复使用的最佳方法。这就是为什么我问最好的方法是什么,而不是发布破坏的Cocos2d移植的复制粘贴代码,让某些人填写空白,就像我经常看到的那样。