我正在努力让精灵顺利关注&根据屏幕上的触摸旋转。玩家不会被迫触摸精灵本身以使其移动,因为他一次只能控制一个精灵。因此,无论屏幕上的触摸如何,玩家都必须遵循动作。这是我到目前为止所做的:
在 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方法太快而无法使用动作。
我该怎么做才能解决这个问题?非常感谢!
答案 0 :(得分:0)
一种选择是使用物理引擎(花栗鼠,box2d,......)并在手指位置和精灵之间使用阻尼弹簧。
如果你在游戏中买不起物理引擎,并且你想要一个平滑的现实生活,你应该保持精灵位置,速度和加速度(角度,角速度,角加速度的同意)。然后,您的手指移动将更新加速度(就像弹簧一样),然后启动调度程序以更新速度和位置60次/秒。
我就是这样做的