【问题标题】:iOS SpriteKit - Creating physics for a bobblehead?iOS SpriteKit - 为摇头娃娃创造物理效果?
【发布时间】:2014-05-23 02:31:03
【问题描述】:

我正在尝试创建一个逼真的摇头应用程序,并希望将物理用于摇头动画。我已经看到其他应用程序可以做到这一点,据我所知,我需要使用 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)];
}

【问题讨论】:

  • 关节锚点应该更靠近身体。
  • 好的,现在更近一点。我将锚点设置为“self.body.position”,但现在头部绕了一个大圆圈。
  • 添加一个弹簧接头以使头部保持直立并赋予其摇晃的感觉。弹簧在头部居中的位置(或者可能更靠近头部的顶部)连接到静态体,弹簧的另一端连接到头部。当它旋转时,弹簧会尝试将头部带回直立位置。
  • @LearnCocos2D 你有关于 Spring Joints 的好的/简单的文档吗?还是代码示例? SpriteKit 对我来说是全新的......

标签: ios animation sprite-kit physics


【解决方案1】:

让这个工作的唯一方法是制作一个“雪橇”。

所以:制作一个应用程序,屏幕上有(比如说)六个滑块。

TBC 我的意思是,当应用实际运行时,您会看到六个滑块。

TBC,这只是雪橇,它只适合作为开发者的你,而不适合消费者应用。

(我相信“雪橇”一词来自汽车行业;当他们制造第一个版本的底盘/发动机进行测试时。)

让一些滑块控制弹簧力/阻尼(或任何你在 cocos 中可用的因素),而其他滑块微调连接/弹簧长度的位置。

这是获得结果的唯一方法!一定要在屏幕上显示这些值,或者至少在它们发生变化时在控制台上打印出来。

这是游戏开发中的日常。 通常,雪橇比实际的消费场景或功能更多。如果没有“雪橇”,您将无法实现它。希望对你有帮助!

【讨论】:

  • +1 只是为了添加...这正是“跳板抖动”的创建方式。 Steve Jobs 得到了一个 iOS 安装,带有各种值的滑块,他对其进行了调整以使其“恰到好处”。然后,工程师将这些值硬编码到 iOS 的实际构建中。
  • 对!!!!!!!!!这是一个很好的例子,雾!!!!就像我提到的,雪橇通常,实际上通常,远比实际游戏复杂得多。诸如赛车游戏和格斗游戏之类的雪橇是巨大的 747 模拟器之类的东西。这实际上是对詹姆斯问题的回答。史诗般的例子,雾。
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2023-04-01
  • 1970-01-01
  • 2021-09-04
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多