【问题标题】:SpriteKit bouncy boxSpriteKit 弹力盒
【发布时间】:2014-01-31 13:11:22
【问题描述】:

我想创建一个弹力盒。像果冻一样的东西,任何击中它的东西也会弹跳。我试过physicsBody.restitution,但它不起作用,因为如果它撞到另一个物体,它似乎是一个物体的弹性。但我想要的是被物体击中时的弹性。

正在查看docs 并没有找到任何东西。有人对制作这样的东西有任何想法吗?

我目前有一个球和一个挡板(乒乓球)进行练习,我希望球每次击中挡板时反弹得更快一点。所以我在球上添加了1.02restitution。对吗?

_ball.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:ballPath];
_ball.physicsBody.friction       = 0.f;
_ball.physicsBody.restitution    = 1.02f;
_ball.physicsBody.linearDamping  = 0.f;
_ball.physicsBody.allowsRotation = NO;
_ball.physicsBody.affectedByGravity = NO;

我还有一些应该被球击中的积木,这些积木是果冻状的,所以它应该弹得更厉害,但是给它添加恢复力并不会改变场景中的任何东西。

_block.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_block.size];
_block.physicsBody.friction = 0.f;
_block.physicsBody.restitution = 0.f;

【问题讨论】:

    标签: ios objective-c sprite-kit


    【解决方案1】:

    归还

    restitution 设置为1.02 将不起作用。 Apple 文档指出:

    该属性的值必须介于 0.0 和 1.0 之间。默认值为 0.2。

    要增加对象的速度,只需获取节点的zRotation 并在该方向上施加一个小脉冲。脉冲是CGVectorhere 是一些用于将角度转换为CGVectors 的有用代码。

    [ball.physicsBody applyImpulse:impulse];
    

    果冻

    至于果冻效应,我建议研究SKTUtils categories provided by Ray Wenderlich。示例项目演示了几种与您的需求相似的效果。

    该代码提供了许多 SpriteKit 目前支持的计时功能,例如弹性、立方和反弹。考虑在碰撞后对“果冻”对象应用弹性缩放函数。

    #import "SKNode+SKTExtras.h"
    #import "SKTEffects.h"
    
    SKTScaleEffect *scaleEffect = [SKTScaleEffect effectWithNode:node duration:0.25f startScale:1.5f endScale:1.5f];
    scaleEffect.timingFunction = SKTTimingFunctionElasticEaseOut;
    [node runAction:[SKAction actionWithEffect:scaleEffect]];
    

    数据封装

    另外,不要使用_ball,而是使用self.ball:这样可以确保调用相应的getter/setter。 根据Apple docs

    一般来说,你应该使用访问器方法或点语法来访问属性,即使你是从它自己的实现中访问一个对象的属性,在这种情况下你应该使用 self. (...) 此规则的例外是在编写初始化、释放或自定义访问器方法时,如本节后面所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多