【发布时间】:2014-02-24 05:24:37
【问题描述】:
所以我有这个应用程序正在开发,您可以通过倾斜设备(加速度计)在屏幕上滚动球。如何更改下面的代码,这样我就不必将手机平放并将其作为我的中性平衡点。我想要的是,在应用程序加载的那一刻你对设备有什么倾斜,这将是神经平衡点。从当前角度,您拿着中性点的设备。中性平衡点意味着球几乎静止的点。希望这很清楚我想要什么。此外,该应用程序仅适用于 LandscapeRight。
注意下面的代码 100% 运行良好,就像它需要它为我的应用程序运行一样。只是我需要将手机平放以滚动球......
CGRect screenRect;
CGFloat screenHeight;
CGFloat screenWidth;
double currentMaxAccelX;
double currentMaxAccelY;
@property (strong, nonatomic) CMMotionManager *motionManager;
-(id)initWithSize:(CGSize)size {
//init several sizes used in all scene
screenRect = [[UIScreen mainScreen] bounds];
screenHeight = screenRect.size.height;
screenWidth = screenRect.size.width;
if (self = [super initWithSize:size]) {
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.accelerometerUpdateInterval = .2;
[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
[self outputAccelertionData:accelerometerData.acceleration];
if(error)
{
NSLog(@"%@", error);
}
}];
}
return self;
}
-(void)outputAccelertionData:(CMAcceleration)acceleration{
currentMaxAccelX = 0;
currentMaxAccelY = 0;
if(fabs(acceleration.x) > fabs(currentMaxAccelX))
{
currentMaxAccelY = acceleration.x;
}
if(fabs(acceleration.y) > fabs(currentMaxAccelY))
{
currentMaxAccelX = acceleration.y;
}
}
-(void)update:(CFTimeInterval)currentTime {
/* Called before each frame is rendered */
//set min and max bounderies
float maxY = screenHeight - (self.ball.size.width/2);
float minY = 0 + (self.ball.size.width/2);
float maxX = screenWidth - (self.ball.size.height/2);
float minX = 0 + (self.ball.size.height/2);
float newY = 0;
float newX = 0;
//left and right tilt
if(currentMaxAccelX > 0.05){
newX = currentMaxAccelX * -10;
}
else if(currentMaxAccelX < -0.05){
newX = currentMaxAccelX*-10;
}
else{
newX = currentMaxAccelX*-10;
}
//up and down tilt
newY = currentMaxAccelY *10;
newX = MIN(MAX(newX+self.ball.position.x,minY),maxY);
newY = MIN(MAX(newY+self.ball.position.y,minX),maxX);
self.ball.position = CGPointMake(newX, newY);
}
【问题讨论】:
-
如果我理解正确:在 applaunch 时,注册 x/y 值,这就是你的新“零”。然后使用这个新的零作为偏移量来做你想做的事情。
-
@Larme 这应该是一个答案,因为它是正确的方法
-
是的,但我喜欢代码中与我如何在代码中完成的事情相关的答案。很难找到任何代码示例来说明如何在我的搜索中使用偏移量。
标签: ios ios7 sprite-kit core-motion uiaccelerometer