1

プレーヤーが線を引くと、スプライトがそれに続いて実行されるゲームを作成しています。可変配列と、うまく機能する描画メソッドがあります。しかし、スプライトを動かす方法がわかりません。さまざまなアプローチを試しましたが、イテレータを機能させることができません。

配列を反復処理することで機能するはずです。これには、以前に保存された CGPoint の場所が取り込まれます。スプライトを ccTouchedEnded に移動しようとしましたが、[toucharray objectAtIndex:0] が強調表示され、「互換性のない型 'CGPoint (別名 'struct CGPoint') のパラメーターに 'id' を渡しています」と表示されます。

   -(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  { 
    //remove objects each time the player makes a new path
    [toucharray removeAllObjects];
}

-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  {    
    UITouch *touch = [ touches anyObject];
    CGPoint new_location = [touch locationInView: [touch view]];
    new_location = [[CCDirector sharedDirector] convertToGL:new_location];

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

    // add touches to the touch array 
   [toucharray addObject:NSStringFromCGPoint(new_location)];
    [toucharray addObject:NSStringFromCGPoint(oldTouchLocation)];

}

-(void)draw
{
    glEnable(GL_LINE_SMOOTH);

    for(int i = 0; i < [toucharray count]; i+=2)
    {
        CGPoint start = CGPointFromString([toucharray objectAtIndex:i]);
        CGPoint end = CGPointFromString([toucharray objectAtIndex:i+1]);
        ccDrawLine(start, end);
    }
}

-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

  // here is the line I can't get to work to move the sprite

 _sprite.position = ccpAdd(ccpMult([toucharray objectAtIndex:0], progress),         ccpMult([toucharray objectAtIndex:0+1], 1-progress));

}
4

2 に答える 2

2

私は以前にこれを行いました.(あなたがこれまでに持っているもの)配列を作成することで、私は画面上に複数のスプライトを持っていたので、「タッチされたスプライト」という定義も1つありました

ontouchstart 空の配列を追加し、最初のポイント (開始点) を追加 + TouchedSprite を開始点に最も近いスプライトに設定) ontouchmove 配列にポイントを追加 ontouchend (アクションによってスプライトで配列を実行 (後で戻る)

いくつかの問題がありました。(1) 一度に 1 つのスプライトしか制御できず、(2) 描画された線のポイントが多すぎます。

1 番の解決策: スプライトのサブクラス オブジェクトを作成し、そのようなスプライトを作成します。そのオブジェクト内で、描画されたパス ポイントを配置できるようにする配列を作成します (@property および @synthesize でアクセスできるようにします)。また、「runPathAction」というパブリック メソッドを作成します。onTouchStart で配列を消去し、選択した spriteObject を設定します。OnTouchMove でアイテムを追加し、OntouchEnd で選択した spriteObject の配列をローカル配列に設定してから、「runPathAction」メソッドを実行します。(メソッドに渡すこともできましたが、配列にアクセスしたい場合に備えて、この方法が好きです)

解決策その 2: 線を引くと、多くの点への WAY が作成されることがわかりました。そこで、「CanDraw」と呼ばれるブール演算子と、canDraw を YES に設定するメソッドに対して、時間間隔が 0.1 のスケジュールを作成しました (いじってみてください)。次に、onTouchMove で「canDraw == YES」をチェックし、ポイントを追加して canDraw=NO に設定します。

このようにして、ポイントを追加する間隔が 0.1 秒になります。スケジュール onTouchEnd を削除することを忘れないでください!!!


次に、アクションを実行する方法を説明します。一定の速度が必要になるため、速度変数を設定する必要があります。ポイントの配列をウォークスルーし、各ポイント間の距離を計算して合計距離を作成します。(PS 最初のパイントは配列内の CurrentLocation から Point0 までであることを忘れないでください) 合計距離があれば、ステップごとにアクションに設定する必要がある遅延時間を計算できます。(これをしないとディレイタイムがわからず、修正すると変な動きになってしまいます)。

メソッドを作成し、配列の「カウント」を確認します。カウント = 0 の場合は戻ります。(完了!!! クリーンアップなどを行います) そうでなければ、最後に自分自身を呼び出すアクションシーケンスを実行します。(カウントのチェックは「ブレーク」を処理します。配列 CGPoint p = (objectAtIndex:0) の 1 つの項目を取得し、配列からその項目を削除します (removeAtIndex:0)。遅延時間でアクションを実行すると、そこで行く!

于 2012-08-23T05:22:16.113 に答える
1

パスの位置を配列またはリストに記録し、それを繰り返し処理してスプライトをトレイルに沿って移動します。これは、プレイヤーの背後にパーティクル トレイルを作成するために作成したゲームで行いました。サイズ 20 の配列を使用し、それを一定間隔で反復処理し、反復子の位置にある配列をキャラクターの位置で更新してから、配列に格納されている反復子の位置に 1 を加えた位置にパーティクル エフェクトを移動しました。

null 値を持たないように、配列に開始位置をシードする必要があります。範囲外の場所ではなく、コードを 0 の位置から読み取らせます。

于 2012-05-18T19:53:16.097 に答える