在cocos2d - iPhone中平滑拖动Sprite

时间:2010-01-07 13:54:28

标签: iphone cocos2d-iphone

我已经在精灵对象上实现了拖动,如下所示..

-(BOOL)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch * touch = [touches anyObject];
CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];    
[diskSprite setPosition:ccp(location.x , location.y )];
return kEventHandled;
}

但这种拖延并不顺利..... 当我用拇指快速拖动物体离开路径时。

由于

4 个答案:

答案 0 :(得分:10)

可能有点迟了但我正在寻找类似的东西。 我发现这个很棒的教程解释了一切: http://www.raywenderlich.com/2343/how-to-drag-and-drop-sprites-with-cocos2d

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {       
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];

    CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
    oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
    oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];

    CGPoint translation = ccpSub(touchLocation, oldTouchLocation);    
    CGPoint newPos = ccpAdd(mySpriteToMove.position, translation);
    mySpriteToMove.position = newPos;
}

答案 1 :(得分:1)

我的游戏遇到了同样的问题。拖动操作显得生涩。我相信原因是触摸事件的生成速度不够快,无法提供平滑的外观。

为了解决这个问题,我通过在sprite上向所需位置运行一个动作来平滑运动,而不是立即设置位置。

答案 2 :(得分:0)

我不确定你所说的“从路径上留下的物体”是什么意思。我想你的意思是,如果你用手指在屏幕上以弧形或圆形拖动,那么精灵将从一点到另一点“跳跃”,而不是精确地按照你的手指。这是对的吗?

如果你想让你的精灵遵循一个确切的路径,你必须创建一个路径,然后设置精灵来跟随它。您现在所做的只是将精灵的位置设置为触摸位置,但“拖动”触摸不会为其触摸的每个像素创建事件。
为接收的触摸创建路径相当容易,并且可以在这里和那里找到代码样本。但是,如果精灵的速度(以每帧像素为单位)太高,即使使用平滑路径,也总会看到它“跳跃”。

例:
您可以在圆形路径上为精灵设置动画。如果您设置动画以在1秒内完成路径,您可能会看到平滑的动画。但是如果它以高速运行,就像4帧中的整圆一样,你只会在4个位置看到你的精灵,而不是在光滑的圆圈中。 如果你想“纠正”那个,你需要考虑混合,或者确定可接受动作的最大速度是什么,并在速度过快时减慢你的精灵。

我希望能回答你的问题。如果不清楚,请随时编辑您的问题,或在我的答案中添加评论。

答案 3 :(得分:0)

看看这里,我建议你在这种情况下尝试:

-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
    if (_binCaptured) {
        CGPoint location = [self convertTouchToNodeSpace:touch];

        [_sprite stopAllActions];

        id move = [CCEaseIn actionWithAction:[CCMoveTo actionWithDuration:0.1 position:ccp(location.x, _sprite.position.y)]];
        [_sprite runAction:move];
    }
} 

它真的很顺利。

我很喜欢这种方式。