2012-07-30 36 views
0

我讓我用cocos2d的第一個應用程序,所以我很新在這裏的Cocos2D使對象跟隨觸摸/手指

我的第一個問題:

我不會使對象(船)按照我的手指。

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint location = [self convertTouchToNodeSpace: touch]; 
    NSLog(@"location X: %f", location.x); 
    NSLog(@"location Y: %f", location.y); 


    if(startGameButtonIsPressed == YES) { 
     [boat runAction: [CCMoveTo actionWithDuration:1 position:location]]; 
    } 
} 

它確實遵循,但它不流暢。如果我快速移動手指,它會停下來,只有當我停下來時纔跟着。

第二個問題

如何計算2點之間的距離。

CGPoint currentLocation = ccp(boat.position.x, boat.position.y);  
float distanceApart = ccpDistance(currentLocation, location); 

問題是,currentLocation在每個點上都不是常量,它每次都有其他值....爲什麼?

也許因爲我有一個滾動背景?

+0

您應該避免在性能嚴重的代碼段中使用NSLog。 – Mark 2012-07-30 18:49:06

+0

但是這不是問題,如果我刪除NSLog,它不是流體 – 2012-07-30 18:52:21

回答

1

您每秒呼叫[boat runAction: [CCMoveTo actionWithDuration:1 position:location]];多次,這會導致多個CCMoveTo操作同時運行。這不是如何設計使用cocos2d的動作工具的

如果您希望船隻按照您定義的較慢速度跟蹤觸摸,則無法排隊多個CCMoveTo行動以響應ccTouchMoved:

取而代之,將UITouch對象(或的NSValue)推入NSMutableArray。然後定義一個回調函數,在每個CCMoveTo完成後讓你的船繼續移動。

例如代碼:

//...defined elsewhere, e.g. your header file: 
    #define kBoatMoveTag 123 

    NSMutableArray *touchQueue; //treat the array like a queue. 
           //don't forget to alloc it before using. 


-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint location = [self convertTouchToNodeSpace: touch]; 
    NSLog(@"location X: %f", location.x); 
    NSLog(@"location Y: %f", location.y); 

    [touchQueue insertObject:[NSValue valueWithCGPoint:location] atIndex:0]; 
    [self continueBoatMovement]; 
} 

-(void)continueBoatMovement { 
    //if no queued point, or boat is already moving... 
    if(touchQueue.count < 1 || [boat getActionByTag:kBoatMoveTag]) { 
     return; //dont do anything 
    } 

    NSValue valueOfPt = [touchQueue lastObject]; 
    [touchQueue removeLastObject]; 
    CGPoint newPt = [valueOfPt CGPointValue]; 
    float distance = ccpDistance(boat.position, newPt); 
    float duration = distance/boatSpeed; //you must define boatSpeed somewhere 

    CCMoveTo *move = [CCMoveTo actionWithDuration:duration position:newPt]; 

    CCSequence *moveSeq = [CCSequence actionOne:move two:[CCCallFunc actionWithTarget:self selector:@selector(continueBoatMovement)]]; 
    moveSeq.tag = kBoatMoveTag; 
    [boat runAction:moveSeq]; 
} 
+0

是的,但actionWithDuration chnage船的移動。不僅是反應 – 2012-07-30 18:30:59

+0

@Fincha我不明白你想說什麼。請重新評論你的評論? – MechEthan 2012-07-30 18:37:24

+0

如果我使用[boat runAction:[CCMoveTo actionWithDuration:1 position:location]];移動spead是好的,但[boat runAction:[CCMoveTo actionWithDuration:0.1 position:location]];它太快而且不穩定。 – 2012-07-30 18:44:13

0
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ 
    CGPoint location = [touch locationInView:[touch view]]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 
    //Declare the lastTouchLocation as a CGPoint 
    lastTouchLocation = location; 
} 

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint location = [self convertTouchToNodeSpace: touch];  
    CGPoint moveBy = ccpSub(location, lastTouchLocation); 
    //Vary the duarion to make the sprite move slower. 
    [self runAction:[CCMoveBy actionWithDuration:1 position:location]]; 
    lastTouchLocation = location; 
} 

在茯苓2D版本2觸摸調度是CCDirector的一部分,並且沒有更多的單個類。因此請調用這個代理函數來工作。

[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];