精灵基于加速度计的 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];
}