0

いい加減にしろ。

タイトルが言うように、私は少し漬け物になっています。

これが私の問題の概要です。私はこの船を正しく持っています。画面の中央下部(240,0)にあります。ユーザーが240を超えるポイントで右にタッチすると、船は右に移動します。そして、ユーザーが240未満のポイントでタッチした場合は左に移動します。ただし、画面上に一度に1本の指しかない場合はこれが最適です。ユーザーが右に触れて指を離さずに左に触れた場合(画面に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. ユーザーが人差し指で画面の左側に触れる
  4. ユーザーが最初のタッチを持ち上げていないために船がまだ右に動いている間に、ユーザーは最初のタッチを持ち上げます
  5. その後、船は即座に進路を変更し、2番目のタッチに向かって左に移動します

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

  1. ユーザーが画面の右側に触れる
  2. 船は右に移動します
  3. ユーザーが人差し指で画面の左側に触れる
  4. 船が左に移動し、ユーザーが最初のタッチを持ち上げます
  5. ユーザーが2回目のタッチを解除していなくても、船はトラックで停止します
4

3 に答える 3

0

各 UITouch は、ユーザーがタッチを開始してから停止するまで一意です。だからあなたの問題は本当にこの行です:

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

あなたはただ接触を望んでいません。もし存在するなら、あなたが目指してきたのと同じタッチが欲しいのです。セット内でそのタッチを探し、そこにない場合は別のタッチに向かって移動を開始します。

于 2010-10-04T05:46:27.483 に答える
0

これは実際の/疑似コードバージョンです-お役に立てば幸いです...

-(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;
        }
    }
}

乾杯、

マイケル・オブライエン

于 2010-10-05T10:41:09.963 に答える
0

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

2 つのグローバル タッチを設定できます。したがって、[touch locationInView:self.view] の位置が > 250 globalRightTouch = touch の場合。左も同じ。

次に、右側を叩くと、タッチをグローバルRightに割り当て、船が右に動き始めます-次に、同時に左側にタッチすると、別のタッチが始まります-それをglobalLeftTouchに割り当てます。次に、次のようなことができます: if(!globalRightTouch){start leftTimer) およびその逆。

あなたの touhcesEnded 関数では、タッチ終了時に null でない場合は leftTimer に kill するように指示しています。タッチが終了したら、もう少し具体的にする必要があります。

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

  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でない場合はそのタッチのタイマーを殺し、現在画面に別のタッチがある場合-その側のタイマーを開始します。

お役に立てれば、

乾杯、

マイケル

于 2010-10-04T12:08:50.073 に答える