【问题标题】:SpriteKit - Draw dynamic line between JointsSpriteKit - 在关节之间绘制动态线
【发布时间】:2016-06-20 19:06:07
【问题描述】:

我正在尝试使用 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];
}

【问题讨论】:

  • 正确,SKShapeNode 是您应该开始的地方。
  • 感谢您确认@prototypical,有关我如何正确实现它的任何指导?
  • 就我个人而言,我会从 SpriteKit 参考和编程指南开始,了解我想了解的任何内容。 developer.apple.com/LIBRARY/IOS/documentation/GraphicsAnimation/…
  • 很抱歉没有为您提供示例解决方案,但问题应该是关于您尝试做但卡住的事情,而不是作为采取正确第一步的替代品。我相信在这个网站上搜索SKShapeNode example 或通过谷歌搜索也会提供一个快速的答案。
  • 其实,是的...在向某人提问之前,我总是先查看参考资料。但是,您对查看 SKShapeNode 的指导并没有帮助我找出答案……查看 SKPhysicsJointPin 让我朝着正确的方向前进。

标签: ios sprite-kit


【解决方案1】:

我的项目需要SKPhysicsJointLimit 而不是引脚,所以经过大量试验和错误后,我找到了以下解决方案。这条线被删除并在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];
}

【讨论】:

  • 这看起来很有趣,我很快就会试一试并尝试给你反馈。到目前为止,看起来是我问题的一个很好的答案。谢谢!
【解决方案2】:

正确的方向是看SKPhysicsJointPin,可以使用SKShapeNode或SKSpriteNode等。

https://developer.apple.com/library/iOS/documentation/SpriteKit/Reference/SKPhysicsJointPin_Ref/Reference/Reference.html

请注意我的问题和上面的 cmets:

由于除了 Apple 的(小书本大小)参考和在线单类应用示例/教程之外,SpriteKit 上没有太多文档(现在)——大多数人的反应是, “只需在 google 中查找 + Cocos2d”,然后重新执行此操作。这一切都很好,但我不是那种复制粘贴的人。我喜欢学习可持续和可重复使用的最佳方法。这就是为什么我问最好的方法是什么,而不是发布破坏的 Cocos2d 移植的复制粘贴代码并让别人填补空白,就像我经常看到的那样。

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 2019-08-15
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多