iOS SpriteKit - 为一个小人物创建物理效果?

4

我试图创建一个逼真的摇头娃娃应用程序,并希望使用物理学来实现摇头动画。我看到其他应用程序都这样做了,从我所了解的来看,我需要使用SpriteKit。

我已经创建了一个SKScene并使用了SKPhysicsJointPin将头部固定在身体上,但它根本不会移动。有什么想法或建议吗?

更新的代码(5/28):

现在在头部使用了2个弹簧关节,它可以左右移动,但不能上下移动。另外,快速点击会导致头部最终向右移动足够远,以至于“掉下”并消失在视野中。很奇怪。

您有任何关于合适的设置的想法,使其能够在保持远离指定区域和不脱落的情况下向上、下、左、右摇晃,同时保持在起始位置处居中吗?

BobbleheadView是SKView的子类

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.backgroundColor =[UIColor clearColor];
        self.showsFPS = YES;
        self.showsNodeCount = YES;

        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(animateBobble)];

        [self addGestureRecognizer:tap];

        SKScene *bobbleheadScene = [SKScene sceneWithSize:self.bounds.size];
        [self presentScene:bobbleheadScene];

        // 1. Body
        self.body = [SKSpriteNode spriteNodeWithImageNamed:@"Bobble-Body"];
        self.body.position = CGPointMake(self.frame.size.width/2, self.body.frame.size.height/2);
        self.body.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
        [bobbleheadScene addChild:self.body];

        // 2. Head
        self.head = [SKSpriteNode spriteNodeWithImageNamed:@"Bobble-Head"];
        self.head.position = CGPointMake(self.center.x, self.body.frame.size.height);
        //self.head.physicsBody.affectedByGravity = YES;
//        self.head.physicsBody.dynamic = NO;
        //This bobbles head great, but head falls off body and out of view
        self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size center:self.head.position];
        //End
        //self.head.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.head.frame];
        //self.head.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.head.size.height/2];
        [bobbleheadScene addChild:self.head];

        // 3. Ceiling
        self.ceiling = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(32, 32)];
        self.ceiling.position = CGPointMake(self.frame.origin.x+self.frame.size.width/2, self.frame.size.height);
        self.ceiling.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
        [bobbleheadScene addChild:self.ceiling];



        //Spring Joint for Ceiling to Head
        SKPhysicsJointSpring *spring1 = [SKPhysicsJointSpring jointWithBodyA:self.ceiling.physicsBody bodyB:self.head.physicsBody anchorA:self.ceiling.position anchorB:CGPointMake(self.head.frame.origin.x+self.head.frame.size.width/2, 0)];

        spring1.frequency = 20.0; //gives the spring some elasticity.
        spring1.damping = 5.0; //Will remove damping to create the 'pendulum'
        [bobbleheadScene.physicsWorld addJoint:spring1];


        //Spring Joint for Head to Body
        SKPhysicsJointSpring *spring = [SKPhysicsJointSpring jointWithBodyA:self.body.physicsBody bodyB:self.head.physicsBody anchorA:CGPointMake(self.body.position.x+self.body.size.width/2, self.body.position.y) anchorB:CGPointMake(self.head.position.x+self.head.size.width/2, self.body.position.y-self.body.size.height/2)];

        spring.frequency = 10.0; //gives the spring some elasticity.
        spring.damping = 1.0;
        [bobbleheadScene.physicsWorld addJoint:spring];

    }
    return self;
}

-(void)animateBobble{
    NSLog(@"Did Tap Bobblehead!");
    [self.head.physicsBody applyImpulse:CGVectorMake(100, -200)];
    //[self.body.physicsBody applyImpulse:CGVectorMake(20, 10)];
}

联合锚点可能应该更靠近身体一些。 - CodeSmile
添加一个弹簧关节来保持头部直立并赋予其摇晃的感觉。弹簧连接到静态物体,位置大约在头部中心(或者更靠近头部顶部),弹簧的另一端连接到头部。当它旋转时,弹簧会试图将头部带回直立位置。 - CodeSmile
好的,我快成功了!我更新了代码,我认为我只需要找出适当的SKPhysicsBody设置头部即可。你能指点我正确的方向,让头部能够在保持远离中心位置的同时上下左右晃动吗? - JimmyJammed
让我们在聊天中继续这个讨论 - JimmyJammed
@LearnCocos2D 我已经尝试了一下,设置了两个弹簧关节,一个固定在视图顶部到头部顶部,另一个固定在身体底部和头部底部。现在头部可以正确地放在身体上并左右摆动,但是无法使其上下移动。我已经调整了两个弹簧的频率和阻尼控制,但仍然没有成功。非常接近了!有什么建议吗?代码已更新。 - JimmyJammed
显示剩余4条评论
1个回答

5
唯一能让这个工作的方法是制作一个“滑板”。因此:制作一个应用程序,在屏幕上有(比如)六个滑块。TBC我的意思是,当应用程序实际运行时,您将看到六个滑块。TBC,这只是“滑板”,仅供开发人员使用,而不是面向消费者的应用程序。(我相信“滑板”一词来自汽车工业;当他们制造底盘/引擎的第一个版本进行测试时。)使一些滑块控制弹簧功率/阻尼(或在cocos中可用的任何因素),而其他滑块则推动连接位置/弹簧长度。这是唯一的方法来获得结果!请务必在屏幕上显示值,或者随着变化将它们打印在控制台上。这是游戏开发中的日常事情。通常,滑板比实际的消费场景或功能更需要工作。如果没有“滑板”,您将无法实现它。希望它有所帮助!

2
+1 只是为了补充...这正是“弹簧板晃动”如何被创建的。Steve Jobs被赋予了一个带有各种值的滑块的iOS安装程序,他进行了调整以使其“恰到好处”。然后工程师们硬编码这些值以进行iOS的实际构建。 - Fogmeister
2
太好了!这是一个很好的例子,Fog!就像我所提到的,雪橇通常比实际的游戏要复杂得多,事实上通常如此。像竞赛游戏和格斗游戏这样的游戏的雪橇就像巨大的747模拟器一样。这真正回答了詹姆斯的问题。Fog,你的例子太棒了。 - Fattie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接