I am trying to move a dot at center to 8 directions of iphone screen using Devicemotion such that it moves faster when tilted at a faster rate. Rough sketch is below:
I could find a similar implementation in an app called Gyrododge in appstore, i cant figure out how to make it work...
Update:
This is what i have done so far, but the response is not smooth, and is very jittery..
xdiff and ydiff are the change of device attitude in x and y directions, derived from quatenion implementation.
if (currDeviceMotion.rotationRate.x < -2) {
NSLog(@"To Top");
if (195+800*ydiff >=193 && 195+800*ydiff <= 197) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (195+800*ydiff >=390 ) {
[self.pitchDot setFrame:CGRectMake(150, 390, 20, 20)];
}else if (195+800*ydiff <= 0){
[self.pitchDot setFrame:CGRectMake(150, 0, 20, 20)];
}else if(195+800*ydiff < 194){
[self.pitchDot setFrame:CGRectMake(150, 195+800*ydiff, 20, 20)];
}else if(195+800*ydiff > 196){
[self.pitchDot setFrame:CGRectMake(150, 195+800*ydiff, 20, 20)];
}
}
}else if (currDeviceMotion.rotationRate.x > 2){
NSLog(@"To Bottom");
if (195+800*ydiff >=193 && 195+800*ydiff <= 197) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (195+800*ydiff >=390 ) {
[self.pitchDot setFrame:CGRectMake(150, 390, 20, 20)];
}else if (195+800*ydiff <= 0){
[self.pitchDot setFrame:CGRectMake(150, 0, 20, 20)];
}else if(195+800*ydiff < 194){
[self.pitchDot setFrame:CGRectMake(150, 195+800*ydiff, 20, 20)];
}else if(195+800*ydiff > 196){
[self.pitchDot setFrame:CGRectMake(150, 195+800*ydiff, 20, 20)];
}
}
}else if (currDeviceMotion.rotationRate.y < -2){
NSLog(@"To Left");
if (150+500*xdiff >= 148 && 150+500*xdiff <=152) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (150+500*xdiff >= 300 ) {
[self.pitchDot setFrame:CGRectMake(300, 195, 20, 20)];
}else if (150+500*xdiff <= 0){
[self.pitchDot setFrame:CGRectMake(0, 195, 20, 20)];
}else if(150+500*xdiff < 148){
[self.pitchDot setFrame:CGRectMake(150+500*xdiff, 195, 20, 20)];
}else if(150+500*xdiff > 152){
[self.pitchDot setFrame:CGRectMake(150+500*xdiff, 195, 20, 20)];
}
}
}else if (currDeviceMotion.rotationRate.y > 2){
NSLog(@"To Right");
if (150+500*xdiff >= 148 && 150+500*xdiff <=152) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (150+500*xdiff >= 300 ) {
[self.pitchDot setFrame:CGRectMake(300, 195, 20, 20)];
}else if (150+500*xdiff <= 0){
[self.pitchDot setFrame:CGRectMake(0, 195, 20, 20)];
}else if(150+500*xdiff < 148){
[self.pitchDot setFrame:CGRectMake(150+500*xdiff, 195, 20, 20)];
}else if(150+500*xdiff > 152){
[self.pitchDot setFrame:CGRectMake(150+500*xdiff, 195, 20, 20)];
}
}
}else if (currDeviceMotion.rotationRate.x < -0.20 && currDeviceMotion.rotationRate.y > 0.20 ){
NSLog(@"To Diagonal Right Top");
if (150+650*xdiff >= 148 && 150+650*xdiff <=152) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (150+650*xdiff >= 300 ) {
[self.pitchDot setFrame:CGRectMake(300, 0, 20, 20)];
}else if(150+650*xdiff > 152){
[self.pitchDot setFrame:CGRectMake(150+650*xdiff, 195-1.3*650*xdiff, 20, 20)];
}
}
}else if (currDeviceMotion.rotationRate.x > 0.20 && currDeviceMotion.rotationRate.y < -0.20 ){
NSLog(@"To Diagonal Left Bottom");
if (150+650*xdiff >= 148 && 150+650*xdiff <=152) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (150+650*xdiff <= 0 ) {
[self.pitchDot setFrame:CGRectMake(0, 390, 20, 20)];
}else if(150+650*xdiff < 148){
[self.pitchDot setFrame:CGRectMake(150+650*xdiff, 195-1.3*650*xdiff, 20, 20)];
}
}
}else if (currDeviceMotion.rotationRate.x < -0.20 && currDeviceMotion.rotationRate.y < -0.20 ){
NSLog(@"To Diagonal Left Top and xdiff is %f",xdiff);
if (150+650*xdiff >= 148 && 150+650*xdiff <=152) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (150+650*xdiff <= 0 ) {
[self.pitchDot setFrame:CGRectMake(0, 0, 20, 20)];
}else if(150+650*xdiff < 148){
[self.pitchDot setFrame:CGRectMake(150+650*xdiff, 195+1.3*650*xdiff, 20, 20)];
}
}
}else if (currDeviceMotion.rotationRate.x > 0.20 && currDeviceMotion.rotationRate.y > 0.20 ){
NSLog(@"To Diagonal Right Bottom");
if (150+650*xdiff >= 148 && 150+650*xdiff <=152) {
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}else{
if (150+650*xdiff >= 300 ) {
[self.pitchDot setFrame:CGRectMake(300, 390, 20, 20)];
}else if(150+650*xdiff > 152){
[self.pitchDot setFrame:CGRectMake(150+650*xdiff, 195+1.3*650*xdiff, 20, 20)];
}
}
}else if((currDeviceMotion.rotationRate.x < 0.20 && currDeviceMotion.rotationRate.x < -0.20) ||(currDeviceMotion.rotationRate.y < 0.20 && currDeviceMotion.rotationRate.y < -0.20) ||(currDeviceMotion.rotationRate.z < 0.20 && currDeviceMotion.rotationRate.z < -0.20)){
[self.rollDot setFrame:CGRectMake(150, 195, 20, 20)];
[self.pitchDot setFrame:CGRectMake(150, 195, 20, 20)];
}
It could be great if i could make it move like the application i have stated above, called Gyrododge
This link also addresses a similar question:Link.
Any advice or help is greatly appreciated...
Thanks.