Cocos2D - 让精灵顺利跟随&旋转触摸

时间:2013-08-26 13:49:46

标签: ios objective-c cocos2d-iphone

我正在努力让精灵顺利关注&根据屏幕上的触摸旋转。玩家不会被迫触摸精灵本身以使其移动,因为他一次只能控制一个精灵。因此,无论屏幕上的触摸如何,玩家都必须遵循动作。这是我到目前为止所做的:

GameScene.m

- (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

    lastTouchLocation = location;

    return YES;
}

- (void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

    //moveBy determine the translate vector
    CGPoint moveBy = ccpSub(lastTouchLocation, location);
    [player moveBy:moveBy];

    lastTouchLocation = location;
}

这是 Player.m

- (float) calculateAngleForNextPoint:(CGPoint) point
{
    CGPoint nextPoint = point;
    CGPoint pos = self.position;

    float offX = nextPoint.x - pos.x;
    float offY = nextPoint.y - pos.y;

    float angle = atan2f(offY, offX);
    angle = CC_RADIANS_TO_DEGREES(angle);
    angle = -angle + 90;

    return angle;
}

- (void) moveBy:(CGPoint)_pos
{
    CGPoint newPos = ccpSub(self.position, _pos);
    float angle = [self calculateAngleForNextPoint:newPos];

    self.position = newPos;
    self.rotation = angle;   

}

此代码效果很好,但旋转根本不平滑,主要是当玩家在屏幕上慢慢移动手指时,精灵会变得疯狂!我尝试了很多东西,比如设置动作,但是调用touchMoved方法太快而无法使用动作。

我该怎么做才能解决这个问题?非常感谢!

1 个答案:

答案 0 :(得分:0)

一种选择是使用物理引擎(花栗鼠,box2d,......)并在手指位置和精灵之间使用阻尼弹簧。

如果你在游戏中买不起物理引擎,并且你想要一个平滑的现实生活,你应该保持精灵位置,速度和加速度(角度,角速度,角加速度的同意)。然后,您的手指移动将更新加速度(就像弹簧一样),然后启动调度程序以更新速度和位置60次/秒。

我就是这样做的