Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 雪碧套件接头_Ios_Iphone_Objective C_Sprite Kit - Fatal编程技术网

Ios 雪碧套件接头

Ios 雪碧套件接头,ios,iphone,objective-c,sprite-kit,Ios,Iphone,Objective C,Sprite Kit,我正在尝试制作一个动画角色,它可以在不移动躯干的情况下伸手去拿屏幕上的东西 如果他够不着,那么他的手应该朝这个方向最大限度地移动,然后被他的静态躯干的物理限制抵消 因此,在我的代码中,绿色矩形(手)在我单击的位置移动,躯干随之移动。 我希望能够使红色矩形(主体)静止,并使绿色矩形“指向”接触点位置 我尝试在场景和红色主体矩形之间应用固定连接,但这似乎不起作用 - (void) createSceneContent { SKSpriteNode *body = [SKSpriteNode

我正在尝试制作一个动画角色,它可以在不移动躯干的情况下伸手去拿屏幕上的东西

如果他够不着,那么他的手应该朝这个方向最大限度地移动,然后被他的静态躯干的物理限制抵消

因此,在我的代码中,绿色矩形()在我单击的位置移动,躯干随之移动。 我希望能够使红色矩形(主体)静止,并使绿色矩形“指向”接触点位置

我尝试在场景和红色主体矩形之间应用固定连接,但这似乎不起作用

- (void) createSceneContent
{
    SKSpriteNode *body = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(100, 100)];
    body.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:body];

    body.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:body.size];
    body.physicsBody.affectedByGravity = NO;
    body.physicsBody.dynamic = YES;

    self.hand = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(150, 20)];
    self.hand.position = CGPointMake(body.position.x + body.size.width / 2 + self.hand.size.width / 2, body.position.y);
    [self addChild:self.hand];
    self.hand.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.hand.size];
    self.hand.physicsBody.dynamic = NO;

    self.scene.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

    [self.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:body.physicsBody bodyB:self.hand.physicsBody anchor:CGPointMake(body.position.x + body.size.width / 2, body.position.y)]];

    [self.hand runAction:[SKAction moveByX:100 y:10 duration:0.1]];
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CGPoint location = [touch locationInNode:self];
    [self.hand runAction:[SKAction moveTo:location duration:0.1]];
}

首先,如果你只想让手臂指向被触摸的位置,你不需要在这里使用物理
只需将手臂节点的
锚定点
更改为肩部(您将在关节上放置销的位置),并围绕该点旋转它(该点位于辅助肩部节点中,以便稍后很容易转换为其坐标)。您可以使用atan2f计算旋转角度。代码如下:

- (void) createSceneContent
{
    SKSpriteNode *body = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(100, 100)];
    body.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:body];

    self.hand = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(150, 20)];
    self.hand.position = CGPointMake(body.position.x + body.size.width*0.5, body.position.y);
    self.hand.anchorPoint = CGPointMake(0, 0.5);
    [self addChild:self.hand];

    SKNode *shoulderNode = [SKNode node];
    shoulderNode.position = self.hand.position;
    shoulderNode.name = @"shoulderNode";
    [self addChild:shoulderNode];

}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CGPoint location = [touch locationInNode:self];
    CGPoint locationConv = [self convertPoint:location toNode:[self childNodeWithName:@"shoulderNode"]];

    self.hand.zRotation = (atan2f(locationConv.y, locationConv.x));
}
另一方面,如果您需要在此处使用物理实体,那么使用SKActions来移动手臂可能不是一个好主意,您还可能需要设置
body.physicsBody.dynamic=NO
以使躯干静止。然后,确保正确添加销接头,并将其“摩擦扭矩”属性设置为高值以减少悬挂。使手点位于正确位置的方法之一是在更新方法中设置其速度向量-只需使用转换后的位置坐标(此处它们相对于身体节点的中心)。完整示例代码:

- (void) createSceneContent {
    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

    body = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(100, 100)];
    body.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:body];

    body.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:body.size];
    body.physicsBody.dynamic = NO;
    body.physicsBody.affectedByGravity = YES;

    self.hand = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(20, 150)];
    // experiment with the anchorPoint for different results
    self.hand.anchorPoint = CGPointMake(0.5, 0);
    self.hand.position = CGPointMake(body.position.x, body.position.y);
    [self addChild:self.hand];

    self.hand.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.hand.size];
    self.hand.physicsBody.dynamic = YES;
    self.hand.physicsBody.affectedByGravity = NO;

    SKPhysicsJointPin *pinHand = [SKPhysicsJointPin jointWithBodyA:body.physicsBody bodyB:self.hand.physicsBody anchor:CGPointMake(body.position.x, body.position.y-5)];
    [self.physicsWorld addJoint:pinHand];
    // experiment with the friction torque value to achieve desired results
    pinHand.frictionTorque = 1.0;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    location = [touch locationInNode:self];
}

-(void)update:(CFTimeInterval)currentTime {
    CGPoint locationConv = [self convertPoint:location toNode:body];
    // experiment with the multiplier (here: 10) for faster/slower movement
    self.hand.physicsBody.velocity = CGVectorMake(locationConv.x*10, locationConv.y*10);
}

希望有帮助

这确实有效。最终,我想塑造一个更复杂的角色,有两部分甚至更多的手臂;所以协调所有的旋转会有点麻烦。我也想让这个角色自我包容,所以也许可以把手作为身体的孩子来添加?在任何情况下,我都有点困惑如何轻松构建这样一个可伸缩的角色。为什么不将物理实体与动作一起使用?如果您想将角色作为一个实体进行控制,那么将手作为实体的子对象肯定会很有用。只需记住适当地重新调整位置和坐标之间的转换。但是,如果你想要实际的复杂关节,我建议你尝试物理(确保身体不是动态的,只是手臂,并且确保它们不受重力影响)。在物理体上使用的动作可能会导致不稳定的行为和口吃,因为物理世界的规则可能与这些动作可能尝试做的事情相冲突。好的,我会尝试这样做。感谢您的输入。您将如何使用atan2f来计算CGVector?我会在手的末端做一个小的看不见的SpriteNode,我会用一个关节连接它。然后我会得到触摸屏上的位置,然后对这个不可见的精灵施加一个脉冲,这个精灵是一个CGVector,带有点的x分量和点的y分量,带有一个乘数。这难道不管用吗?如果你只是将基于CGVector的脉冲按原样应用到看不见的精灵上,你的手臂最终会旋转好几圈。:)我刚刚编辑了我的原始帖子,向您展示了一个简单的示例,说明基于物理的手臂如何使用速度指向给定位置,无需角度计算或辅助节点,您可以根据需要对其进行改进。