ユーザーが画面に2本の指を持ち、1つを持ち上げるとき、私は何も起こりません

StackOverflow https://stackoverflow.com/questions/3852877

質問

いい加減にしろ。

タイトルが言うように、私は少しピクルスにいます。

これが私の問題の概要です。私はこの船を正しく持っています。画面の中央の底(240,0)に置かれます。ユーザーが240を超えるポイントで右に触れると、船は右に移動します。そして、ユーザーが240未満の時点で触れた場合に去ります。ただし、これは、一度に画面に1本の指しかない場合に最適です。ユーザーが右に触れて指を上げない場合、左に触れない場合(画面に2本の指があります)右指を持ち上げるまで船が右に動き続け、突然船が左に移動します。 2番目のタッチ。

タイマーを使用して、現在のX座標から数値を追加/減算して移動します。

これは私が一言で言えば持っているものです:(笑ったり、嫌いではありません)

-(void)moveShipLeft:(id)sender {

 shipView.center = CGPointMake(shipView.center.x - 2, 320 - (shipView.image.size.height / 2));

}
-(void)moveShipRight:(id)sender { 

 shipView.center = CGPointMake(shipView.center.x + 2, 320 - (shipView.image.size.height / 2));

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

 UITouch *touch = [[event allTouches] anyObject];
 CGPoint location = [touch locationInView:touch.view];

 if (240 < location.x){rightTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(moveShipRight:) userInfo:nil repeats:YES];}
 if (240 > location.x){leftTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(moveShipLeft:) userInfo:nil repeats:YES];}

 [shipView setCenter:shipView.center];
 }
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {


  if (rightTimer != nil)               //Kill the timer that goes right upon touch removal
   [rightTimer invalidate];
  rightTimer = nil;

  if (leftTimer != nil)                //Kill the timer that goes left on touch removal
   [leftTimer invalidate];
  leftTimer = nil;
}

ゲームのコントロールを「Radiant」という助けに完全に複製しようとしています。あなたが助けたら、私はあなたを永遠に真剣に愛します。

明確にするために、私はこれを起こさせたい:

  1. ユーザーは画面の右側に触れます
  2. 船は右に動きます
  3. ユーザーは、2本目の指で画面の左側に触れます
  4. ユーザーが最初のタッチを持ち上げていないため、船がまだ正しく動いていますが、ユーザーは最初のタッチを持ち上げます
  5. その後、船はすぐにコースを変更して、左に2回目のタッチに向かって移動します

現在、マルチタッチを有効にしているので、今では次のように機能します。

  1. ユーザーは画面の右側に触れます
  2. 船は右に動きます
  3. ユーザーは、2本目の指で画面の左側に触れます
  4. 船の移動は左に移動し、ユーザーは最初のタッチを持ち上げます
  5. ユーザーが2回目のタッチを持ち上げていない場合でも、船はトラックで停止します
役に立ちましたか?

解決

まず、右touchがリリースされていない場合は、refttimerをアクティブにしないことについて。

2つのグローバルなタッチを設定できます。したがって、[touch locationInview:self.view]の場合、Blahは250 GlobalRightTouch = touchです。左に同じ。

次に、右側にヒットすると、グローバル右にタッチを割り当て、船が右に移動し始めます - 左側に同時に触れます - 別のタッチが始まります - それをGlobalLeftTouchに割り当てます。次に、次のようなものに移動できます。if(!globalRightTouch){lefttimerを開始)、Vise Versa。

あなたのtouhcesedencededfunctionでは、タッチの終わりにnullでない場合はLefttimerに殺すように言っています - したがって、左のタッチダウンがまだある場合でも、両方のタイマーにタッチリリースで殺すように言っています。タッチが終了すると、もう少し具体的である必要があります。

次に、タッチが終了したコードで、次のようなものを行く必要があります。

  UITouch *touch = [[event allTouches] anyObject];

  if (rightTimer != nil && touch == globalRightTouch){               //Kill the timer that goes right upon touch removal
   [rightTimer invalidate];
  rightTimer = nil;
   if(globalLeftTouch)
     leftTimerStartFunction //I dont know what your variables are sorry
  }

  if (leftTimer != nil && touch == globalLeftTouch){                //Kill the timer that goes left on touch removal
   [leftTimer invalidate];
  leftTimer = nil;
   if(globalRightTouch){
      rightTimerStartFunction //I dont know what you variables are sorry
   }
 }
}

基本的にあなたは言いたい - 私がタッチを手放すなら - それがどれであるかをチェックし、それがnullでない場合、そして現在画面に別のタッチがある場合、そのタッチのためにタイマーを殺します - その側のタイマーを起動します。

お役に立てれば、

乾杯、

マイケル

他のヒント

各uitouchは、ユーザーが停止するまで触れ始めるまでにユニークです。あなたの問題は本当にこの行です:

 UITouch *touch = [[event allTouches] anyObject];

あなたはただ欲しくない どれか 触る。あなたが存在する場合、あなたが向かっているのと同じタッチであるタッチが欲しいです。セットでそのタッチを探してください。そこにない場合は、別のタッチに向かって移動し始めます。

これが実際の/擬似コードバージョンです - それが役立つことを願っています...

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)even{
UITouch *touch = [touches anyObject];

if(touch.x < 240){
    globalTouchLeft = touch;
    if(!globalTouchRight){
        startLeftTimer; //again I don't know what your timere/variable is
    }
}else if(touch.x  >= 240){

    globalTouchRight = touch;
    if(!globalTouchLeft){
        startRightTimer; //again I don't know what your timere/variable is
    }

    }
}

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

    UITouch *touch = [touches anyObject];

    if(touch == globalLeftTouch){
        stopLeftTimer
        globalLeftTouch = nil;

        if(globalRightTouch){
            startRightTimer;
        }

    }

    if(touch == globalTouchRight){
        stopRightTimer
        globalRightTouch = nil;

        if(globalLeftTouch){
            startLeftTimer;
        }
    }
}

乾杯、

マイケル・オブライエン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top