【问题标题】:Accelerometer and calibration - iPhone SDK加速度计和校准 - iPhone SDK
【发布时间】:2011-03-03 23:58:38
【问题描述】:

我需要在我的 iPhone 游戏中使用加速度计的功能。我只需要通过倾斜设备来移动图像。然而,YouTube 上的大多数视频只显示了某种倒置的倾斜功能,而忘记包含校准。

我希望用户将他们的设备校准到他们所处的任何位置。有人知道我应该如何开始吗?

【问题讨论】:

    标签: objective-c iphone xcode accelerometer calibration


    【解决方案1】:

    我曾经做过这样的应用程序。我会在这里发布,但它适用于 iOS 4...

    校准:

    int tapCount = 0;
    - (void)cancelDoubleTap {
        if (tapCount < 2) {
            tapCount = 0;
        }
    }
    - (void)reset {
        [[NSUserDefaults standardUserDefaults] setFloat:0 forKey:@"X-Calibrate"];
        [[NSUserDefaults standardUserDefaults] setFloat:0 forKey:@"Y-Calibrate"];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Reset!" message:@"Calibration reset." delegate:nil cancelButtonTitle:@"Okay." otherButtonTitles:nil];
        [alert show];
        [alert release];
    }
    - (void)calibrate {
        if (tapCount == 3) {
            tapCount = 0;
            return;
        }
        [[NSUserDefaults standardUserDefaults] setFloat:accelX forKey:@"X-Calibrate"];
        [[NSUserDefaults standardUserDefaults] setFloat:accelY forKey:@"Y-Calibrate"];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Calibrated!" message:[NSString stringWithFormat:@"Calibrated to: %.2f %.2f.", accelX, accelY] delegate:nil cancelButtonTitle:@"Okay." otherButtonTitles:nil];
        [alert show];
        [alert release];
        tapCount = 0;
    }
    - (BOOL)canBecomeFirstResponder {
        return YES;
    }
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(cancelDoubleTap) userInfo:nil repeats:NO];
        tapCount ++;
        if (tapCount == 3) {
            [timer invalidate];
            [self reset];
            return;
        }
        if (tapCount == 2) {
            [timer invalidate];
            timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(calibrate) userInfo:nil repeats:NO];
        }  
    }
    

    还有……

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
        but = [[UIButton alloc] initWithFrame:window.frame];
        [but addTarget:self action:@selector(touchesEnded:withEvent:) forControlEvents:UIControlEventTouchUpInside];
        [window addSubview:but];
         // Override point for customization after application launch.
        box = [[UIView alloc] initWithFrame:CGRectMake(self.window.center.x - 50, self.window.center.y - 50, 100, 100)];
      [window makeKeyAndVisible];
        box.backgroundColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:0.75];
        [window addSubview:box];
        [[UIAccelerometer sharedAccelerometer] setDelegate:self];
        [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1/100.0)];
        slider = [[UISlider alloc] initWithFrame:CGRectMake(20, 438, 280, 22)];
        [slider setMinimumValue:2.0];
        [slider setMaximumValue:50.0];
        [window addSubview:slider];
        return YES;
     }
    

    .h 文件:

    #import <UIKit/UIKit.h>
    
    @interface TilterAppDelegate : NSObject <UIApplicationDelegate, UIAccelerometerDelegate> {
        UIWindow *window;
        UIView *box;
        UISlider *slider;
        UIButton *but;
    }
    
    @property (nonatomic, retain) IBOutlet UIButton *but;
    @property (nonatomic, retain) IBOutlet UISlider *slider;
    @property (nonatomic, retain) IBOutlet UIView *box;
    @property (nonatomic, retain) IBOutlet UIWindow *window;
    
    @end
    

    移动代码:

     - (void)moveBoxByX:(float)x byY:(float)y {
        float newX = box.center.x + x;
        float newY = box.center.y + y;
        if (newX < 50)
            newX = 50;
        if (newX > 270)
            newX = 270;
        if (newY < 50)
            newY = 50;
        if (newY > 430)
            newY = 430;
        box.center = CGPointMake(newX, newY);
    }
    

    大部分时间都应该工作。

    【讨论】:

    • 谢谢!!我也是开发人员,所以我也有 4.0 固件。我去看看!
    • 抱歉不能在 23 小时后提供赏金 :(。但我会确保给你!
    • 非常有用的答案。我会给你一个赞成票,但我已经达到了我的每日投票上限:(
    • 旧线程但是如果我们想从另一个视图控制器校准它,那将如何工作。此代码也是横向应用程序还是纵向应用程序?
    • 在单独的类中实现UIAccelerometerDelegate,或者用委托调用原类的方法。由于它使用用户默认值,因此应该可以从任何类访问它。此外,它与风景/肖像无关。
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多