2013-08-26 94 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次。

這就是我該怎麼做