2013-08-26 58 views
2

我想让精灵顺利跟随&根据在屏幕上的触摸旋转。玩家不会被迫触及精灵本身以使其移动,因为他一次只能控制一个精灵。因此,无论触摸在屏幕上,玩家都必须遵循这一运动。这是我到目前为止有:Cocos2D - 让精灵顺利跟随和旋转触摸

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

你不是因素的运动和旋转应该可能会发生一段时间,而不是瞬间。如果直接将运动和旋转与触摸位置或运动行为进行触摸移动联系起来,您所看到的可能是触摸更新的效果可能相当“跳跃”,而不是平滑渐变。 – LearnCocos2D

+0

我在做幽闭恐怖症时做了类似的事情,但一切都是通过改变旋转等动作完成的。精灵应该“瞄准”新角度,而不是跳到它。那会更顺利。 – PKCLsoft

+0

但由于touchMoved的调用非常迅速,因此每次都会覆盖操作,因此您是如何通过操作来实现的? – RaphBlanchet

回答

0

一种选择是使用物理引擎(花栗鼠,box2d,...),并在手指位置和精灵之间有一个阻尼弹簧。如果你在你的游戏中买不起一个物理引擎,并且你想要一个像运动一样平滑的现实生活,你应该保持精灵的位置,速度和加速度(对于角度,角速度,角加速度同样)。然后你的手指移动会更新加速度(就像春天会做的那样),然后你开始一个调度程序来更新速度和位置,每秒60次。

这就是我该怎么做