2010-09-29 6 views
3

Я пытаюсь повернуть спрайт с помощью акселерометра. когда я наклонить вправо, я хочу, чтобы он слегка повернуть вправо, и когда я наклоняйте налево, я хочу, чтобы он слегка повернуть налево ...Cocos2d iPhone: вращать спрайт с помощью акселерометра

Заранее спасибо, Reed

ответ

1

Не должны быть слишком сложным. Просто где-то в вашем коде, который обрабатывает класс UIAccelerometerDelegate и применяет изменения к вашим спрайтам на основе значений, которые вы получаете через параметры, для обратного вызова – accelerometer:didAccelerate:.

Apple, документы для класса делегата доступны на ...

https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIAccelerometerDelegate_Protocol/UIAccelerometerDelegate/UIAccelerometerDelegate.html

9

Елки выключен - в вашем ч файла вам необходимо сделать следующие переменные:

UIAccelerationValue accelerationX; 
UIAccelerationValue accelerationY; 
float currentRawReading; 
float calibrationOffset; 

Кроме того, убедитесь, что ваш файл h имеет:

@interface myViewName : UIViewController <UIAccelerometerDelegate> 

Тогда в вашем .m файле j усть ниже вашего импорта в верхней ГОВОРЯ:

#define kFilteringFactor 0.05 
CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI/180;}; 
CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180/M_PI;}; 

Затем в файле .m на вашем viewDidLoad Функция положить:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer]; 
accel.delegate = self; 
accel.updateInterval = 1.0f/60.0f; 

также добавить следующую функцию в файл .m:

-(void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{ 

accelerationX = acceleration.x * kFilteringFactor + accelerationX * (1.0 - kFilteringFactor); 
accelerationY = acceleration.y * kFilteringFactor + accelerationY * (1.0 - kFilteringFactor); 

// keep the raw reading, to use during calibrations 
currentRawReading = atan2(accelerationY, accelerationX); 

float rotation = -RadiansToDegrees(currentRawReading); 

targetView.transform = CGAffineTransformMakeRotation(-(DegreesToRadians(rotation))); 
//targetView.transform = CGAffineTransformRotate(targetView.transform, -(rotation * 3)); //if you want easing 
} 

вам придется немного подстроить его в зависимости от того, какой вид или объект вы нацеливаете, но это в значительной степени.

Надеется, что это помогает,

Майкла

+0

Обратите внимание, что это касается обычных приложений для iOS. Для cocos2d все объекты CCLayer уже соответствуют UIAccelerometerDelegate, и вам просто нужно установить node.isAccelerometerEnabled = YES, а затем создать акселерометр: DidAccelerate: метод, как обычно. Обратитесь к http://www.cocos2d-iphone.org/wiki/doku.php/tips%3ausing_accelerometer_for_sprite_movement. Однако вам, вероятно, следует отфильтровать показания акселерометра, как показал Майкл О'Брайен. Подробнее об этом см. Http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html. – aiham

0

В функции делегата акселерометра просто написать код - >>

float angleRadians = atanf((float)X_Position/(float)Y_Position); 
float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians); 
float cocosAngle = 1 * angleDegrees; 
sprite.rotation = cocosAngle; 

и спрайт повернется на желаемый угол с изменениями значения X_position, Y_Position и angle.

Njoy .. :)

Смежные вопросы