0

精灵基于加速度计的 x 轴旋转和移动。当手机进一步倾斜时,精灵会旋转并移动得更快。一切正常,但并不顺利。当精灵缓慢移动时,它是滞后的。

我尝试根据加速度计的 x 轴控制速度。

if (data.acceleration.x >= 0.09) {
    angle = 0.4 * data.acceleration.x;
}
if (data.acceleration.x >= 0.20) {
    angle = 0.6 * data.acceleration.x;
}

if (data.acceleration.x <= -0.09) {
    angle = 0.4 * data.acceleration.x;
}

if (data.acceleration.x <= -0.20) {
    angle = 0.6 * data.acceleration.x;
}

if (data.acceleration.x <= 0.09 & data.acceleration.x >= -0.09) {
    angle = 0;
}

但这并不能解决问题。有人知道如何停止滞后吗?

代码:

#import "GameScene.h"

static int kPlayerSpeed = 20.0;

@implementation GameScene

{
    SKSpriteNode *_character;

    // cmmotionmanager
    float _destY;
    float _currentY;
    float _currentX;
    CMAccelerometerData *_lastReading;
    BOOL _shouldMoveToRight;
    BOOL _shouldMoveToLeft;
}

-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */

    // background settings
    self.backgroundColor = [SKColor whiteColor];

    // setup charachter
    _character = [SKSpriteNode spriteNodeWithImageNamed:@"Monster_final_01"];
    _character.position = CGPointMake(self.size.width * 0.5, self.size.height * 0.2);
    _character.anchorPoint = CGPointMake(0.5, 0.5);
    _character.xScale = 0.3;
    _character.yScale = 0.3;
    [self addChild:_character];

    // setup motionmanager
    self.manager = [[CMMotionManager alloc] init];
    [self.manager setAccelerometerUpdateInterval:1.0/30.0];
    [self.manager startAccelerometerUpdates];
}

-(void)acceleratorUpdates
{
    CMAccelerometerData *data = self.manager.accelerometerData;
    if(_lastReading == nil)
    {
        _lastReading = data;
    }

    BOOL threshhold = (fabs(_lastReading.acceleration.x - data.acceleration.x) > 0.01);
    //if the absolute of acceleration is < the absolute of last, then we changed direction

    BOOL changeDir = (fabs(data.acceleration.x) < fabs(_lastReading.acceleration.x));

    //if changing direction is above our threshhold, or we didnt change direction
    BOOL _aboveThreshold = ( threshhold && changeDir ) || (!changeDir);

    CGFloat angle = 0;
    CGFloat _destX = 0.0;

    if (data.acceleration.x >= 0.09) {
        angle = 0.4 * data.acceleration.x;
    }
    if (data.acceleration.x >= 0.20) {
        angle = 0.6 * data.acceleration.x;
    }

    if (data.acceleration.x <= -0.09) {
        angle = 0.4 * data.acceleration.x;
    }

    if (data.acceleration.x <= -0.20) {
        angle = 0.6 * data.acceleration.x;
    }

    if (data.acceleration.x <= 0.09 & data.acceleration.x >= -0.09) {
        angle = 0;
    }

    if(fabs(data.acceleration.x) > 0.25) { // tilting the device to the right
        _destX = -(data.acceleration.x * kPlayerSpeed);
    }
    [_character removeAllActions];
    SKAction *moveAction = [SKAction moveByX:_destX y:0 duration:0];
    [_character runAction:moveAction];
    _character.position = CGPointMake(_character.position.x + _destX, _character.position.y);
    if(_aboveThreshold)
    { 
        SKAction *rotateAction = [SKAction rotateByAngle:angle duration:0]; 
        [_character runAction:rotateAction]; 

        _lastReading = data; 
    }

    NSLog(@"_lastReading.acceleration.x = %f & data.acceleration.x = %f", _lastReading.acceleration.x, data.acceleration.x);

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];
    }
}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
    [self acceleratorUpdates];

}
4

0 回答 0