ユーザーが画面に2本の指を持ち、1つを持ち上げるとき、私は何も起こりません
-
27-09-2019 - |
質問
いい加減にしろ。
タイトルが言うように、私は少しピクルスにいます。
これが私の問題の概要です。私はこの船を正しく持っています。画面の中央の底(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」という助けに完全に複製しようとしています。あなたが助けたら、私はあなたを永遠に真剣に愛します。
明確にするために、私はこれを起こさせたい:
- ユーザーは画面の右側に触れます
- 船は右に動きます
- ユーザーは、2本目の指で画面の左側に触れます
- ユーザーが最初のタッチを持ち上げていないため、船がまだ正しく動いていますが、ユーザーは最初のタッチを持ち上げます
- その後、船はすぐにコースを変更して、左に2回目のタッチに向かって移動します
現在、マルチタッチを有効にしているので、今では次のように機能します。
- ユーザーは画面の右側に触れます
- 船は右に動きます
- ユーザーは、2本目の指で画面の左側に触れます
- 船の移動は左に移動し、ユーザーは最初のタッチを持ち上げます
- ユーザーが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;
}
}
}
乾杯、
マイケル・オブライエン