2010-06-15 9 views
3

Je dois utiliser la fonctionnalité d'un accéléromètre dans mon jeu iPhone. Je dois juste déplacer une image en inclinant l'appareil. Cependant, la plupart des vidéos sur youtube montrent simplement la fonction d'inclinaison qui est en quelque sorte inversée et oublient d'inclure le calibrage. Je veux que l'utilisateur calibre son appareil à n'importe quelle position. Est-ce que quelqu'un sait comment je devrais commencer?Accéléromètre et étalonnage - iPhone SDK

Votre aide est grandement appréciée,

Kevin

Répondre

7

J'ai fait une application comme cette fois. Je vais poster ici, mais il est pour iOS 4 ...

http://localhostr.com/files/7ca39c/Tilter.zip

Pour calibrer:

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]; 
    } 
} 

Et ...

- (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 

Code de déplacement:

- (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); 
} 

Devrait fonctionner la plupart du temps.

+2

MERCI !! Je suis aussi un développeur, j'ai donc aussi le firmware 4.0. Je vérifierai! – lab12

+0

De rien! –

+1

C'est parfait !!! MERCI BEAUCOUP DE NOUVEAU! – lab12