0

私は 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番目の問題

2 点間の距離を計算する方法。

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

問題、 currentLocation は、毎回他の値を持つ各ポイントで一定ではありません....なぜですか?

多分私はスクロールする背景を持っているからですか??

4

2 に答える 2

1

[boat runAction: [CCMoveTo actionWithDuration:1 position:location]];1 秒間に複数回呼び出しているため、複数のCCMoveToアクションが同時に実行されています。これは、cocos2d のアクション ツールが使用されるように設計された方法ではありません。

あなたが定義したより遅い速度でボートをタッチに追従させたい場合は、CCMoveToに応答して複数のアクションをキューに入れることはできませんccTouchMoved:

UITouch代わりに、オブジェクト (またはNSValueCGPoint) をにプッシュします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];
}
于 2012-07-30T18:23:58.000 に答える