ios – 在SpriteKit中使用Accelerometer移动和旋转精灵

发布时间:2020-09-15 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了ios – 在SpriteKit中使用Accelerometer移动和旋转精灵编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Spritekit制作我的第一款游戏,所以我有一个精灵,我需要使用我的加速度计来移动.嗯,这样做没问题;运动是非常平滑和敏感的,问题是,当我试图旋转我的精灵,以使它面对自己的运动时,我会让它“摇晃”,就像他有帕金森. (:d)

我确实意识到当加速度计数据在x,y轴之一上太接近0时会发生这种情况.

所以问题是:我的宠物帕金森有没有解决方法? :d

这是一些代码:

-(void) update:(NSTimeInterval)currentTime{
    static CGPoint oldVelocity;
    //static CGFloat oldAngle;

    if(_lastUpdatedTime) {
        _dt = currentTime - _lastUpdatedTime;
    } else {
        _dt = 0;
    }

    _lastUpdatedTime = currentTime;

    CGFloat updatedAccelX = self.motionManager.accelerometerData.acceleration.y;
    CGFloat updatedAccelY = -self.motionManager.accelerometerData.acceleration.x+sinf(M_PI/4.0);


    CGFloat angle = vectorAngle(CGPointMake(updatedAccelX,updatedAccelY));

    _velocity = cartesianFromPolarCoordinate(MAX_MOVE_PER_SEC,angle);


    if(oldVelocity.x != _velocity.x || oldVelocity.y != _velocity.y){
        _sprite.physicsBody.velocity = CGVectorMake(0,0);
        [_sprite.physicsBody applyImpulse:CGVectorMake(_velocity.x*_sprite.physicsBody.mass,_velocity.y*_sprite.physicsBody.mass)];

        _sprite.zRotation = vectorAngle(_velocity);
        oldVelocity = _velocity;

    }
}

static inline CGFloat vectorAngle(CGPoint v){
    return atan2f(v.y,v.x);
}

我确实尝试仅在更新的AccelX或updatedAccelY时启动_velocity向量的更新,绝对值> =某些值,但结果是我的运动不平滑,如果值在0.1和之间,则改变方向0.2,当值低于0.1时,问题并没有消失.

我想保持方向响应,但我也想修复精灵旋转的“摇动”.

我很抱歉我的英语不好,并提前感谢任何建议.

解决方法

您可以尝试使用低通滤波器(参见隔离重力效应)或高通滤波器(以隔离用户加速效果).

#define filteringFactor 0.1

    - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

        //low pass
        accelerX = (acceleration.x * filteringFactor) + (accelerX * (1.0 - filteringFactor));
        //idem …  accelerY
        //idem … accelerZ 

        //or high pass
        accelerX = acceleration.x - ( (acceleration.x * filteringFactor) + (accelerX * (1.0 - filteringFactor)) );
        //idem …  accelerY
        //idem … accelerZ
    }

总结

以上是编程之家为你收集整理的ios – 在SpriteKit中使用Accelerometer移动和旋转精灵全部内容,希望文章能够帮你解决ios – 在SpriteKit中使用Accelerometer移动和旋转精灵所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!