我正在使用一个iPhone游戏,使用COSCO2D。我正在尝试使用加速度计来移动一个精灵在肖像模式下左右移动。由于某种原因,我使用的是默认值,除非电话倾斜到45度角,否则返回的值都是正的(指示它应该向右移动),直到它以45度角倾斜,无论是向左还是向右。死点在600左右返回,然后进一步倾斜你的手机左或右,直到它达到45度角(其中它击中0,并开始负)。下面是我正在使用的代码。任何帮助都将不胜感激。
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
#define kFilteringFactor 0.75
static UIAccelerationValue rollingX = 0, rollingY = 0, rollingZ = 0;
rollingX = (acceleration.x * kFilteringFactor) +
(rollingX * (1.0 - kFilteringFactor));
rollingY = (acceleration.y * kFilteringFactor) +
(rollingY * (1.0 - kFilteringFactor));
rollingZ = (acceleration.z * kFilteringFactor) +
(rollingZ * (1.0 - kFilteringFactor));
float accelX = rollingX;
float accelY = rollingY;
float accelZ = rollingZ;
CGSize winSize = [CCDirector sharedDirector].winSize;
#define kRestAccelX 0.6
#define kShipMaxPointsPerSec (winSize.height*0.5)
#define kMaxDiffX 0.2
float accelDiffX = kRestAccelX - ABS(accelX);
float accelFractionX = accelDiffX / kMaxDiffX;
float pointsPerSecX = kShipMaxPointsPerSec * accelFractionX;
_shipPointsPerSecX = pointsPerSecX;
NSLog(@"_shipPointsPerSecX: %f", _shipPointsPerSecX);
}
- (void)updateShipPos:(ccTime)dt {
CGSize winSize = [CCDirector sharedDirector].winSize;
float maxX = winSize.width - _ship.contentSize.width/2;
float minX = _ship.contentSize.width/2;
float newX = _ship.position.x + (_shipPointsPerSecX * dt);
newX = MIN(MAX(newX, minX), maxX);
_ship.position = ccp(newX, _ship.position.y);
// NSLog(@"newx: %f", newX);
}
最佳答案
基本上,你的加速度计应该做的是更新加速度(像你这样的过滤因子)。
但是在它旁边,你应该保持速度和位置,并在你的计划步骤(浮动DT)函数中同时适应:
速度+=加速度*dt
位置+=速度*dt
为X和Y做这个
关于iphone - 使用iPhone加速度计沿X轴移动 Sprite ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14905871/