мультитач и звук

У меня есть несколько вопросов по мультитач

это часть моего кода в файле .m

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint pt = [touch locationInView:self.view];

if(pt.x>634 && pt.x<733 && pt.y >64 && pt.y<145)
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"si" ofType:@"mp3"];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];
}

if(pt.x>634 && pt.x<733 && pt.y >195 && pt.y<276)
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"la" ofType:@"mp3"];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];
}


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

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"rest" ofType:@"mp3"];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];
}

Надеюсь, это сработает.

На самом деле, вторая часть «if ((диапазон) &&(диапазон))» не работает. Может ли кто-нибудь сказать мне решение?

Первый диапазон работает, и я хочу, чтобы второй диапазон воспроизводил «la.mp3», но когда 2 пальца касаются, музыка не воспроизводится.


person 施毛佑    schedule 08.05.2012    source источник
comment
Ваш вопрос не ясен. Чего вы ожидаете и почему? Что происходит вместо этого?   -  person Shaggy Frog    schedule 08.05.2012
comment
извините, я исправил свой вопрос.   -  person 施毛佑    schedule 08.05.2012
comment
Вы тестировали, чтобы определить, работает ли код воспроизведения звука независимо от сенсорного кода?   -  person ThomasW    schedule 08.05.2012
comment
да, если каждый по отдельности может играть   -  person 施毛佑    schedule 08.05.2012


Ответы (2)


Извините, это будет полное редактирование ответа, так как я не могу удалить последний. Я сделал серьезную ошибку чтения, и мне нужно написать новый ответ. Вы не должны использовать [touches anyObject], потому что это не даст вам надежного касания, которое вы хотите в мультитач-системе.

Вы должны использовать [[touches allObjects] objectAtIndex:#] для извлечения касания. Прикосновения будут там в том порядке, в котором они пришли.

person borrrden    schedule 08.05.2012
comment
извините, я исправил свой код: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [[touches allObjects] objectAtIndex:#]; CGPoint pt = [touch locationInView:self.view]; я знаю, что # должен быть одним числом, но если у меня не более 7 кнопок, мне следует ввести 7 или...? что бы я ни набрал 1 или 7, это все еще не работает›‹ я очень новичок, поэтому я не совсем понимаю ваш ответ, извините - person 施毛佑; 10.05.2012
comment
Цифры — это сами прикосновения (если коснуться двумя пальцами, получится 2), а не кнопки или что-то в этом роде. Дело в том, что вам нужно проверять все касания, а ваш код проверяет только первое. Самый простой способ сделать это, вероятно, цикл, упомянутый в другом ответе. - person borrrden; 11.05.2012
comment
извините, у меня проблема. Это мой код в файле.m: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ for (UITouch * touch in touches) { CGPoint pt = [touch locationInView:self.view]; if([[touches allObjects] objectAtIndex:1] && ((pt.x>634 && pt.x<733 && pt.y >64 && pt.y<145))) { NSString *path = [[NSBundle mainBundle] pathForResource:@"si" ofType:@"mp3"]; theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; theAudio.delegate = self; [theAudio play]; } - person 施毛佑; 12.05.2012
comment
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ NSString *path = [[NSBundle mainBundle] pathForResource:@"rest" ofType:@"mp3"]; theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; theAudio.delegate = self; [theAudio play]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.multipleTouchEnabled=YES; } и запустите симулятор, он остановится на main.m, он говорит, что поток 1: программа получила сигнал: SIGABRT. когда я касаюсь своего симулятора. - person 施毛佑; 12.05.2012
comment
Попробуйте сделать это так, как это описывает Макворт. for(UITouch *touch in touches) { CGPoint pt = [touch locationInView:self]; //... } - person borrrden; 12.05.2012
comment
извините, я думаю, что это моя проблема с кодом, the.view не решает ее, спасибо. - person 施毛佑; 12.05.2012

Вам нужно перечитать документы по MultiTouch Events. Во-первых, вам нужно установить для свойства MultipleTouchEnabled представления значение YES. Во-вторых, вы получаете только одно событие касания каждый раз, так как вы устанавливаете

UITouch *touch = [touches anyObject];   

Вместо этого попробуйте

for (UITouch * touch in touches) {

для выполнения вашего кода при каждом касании в текущем наборе.

Во-вторых, я обеспокоен тем, что ваш AVAudioPlayer будет выпущен после завершения TouchDidBegin; Я бы подумал, что это отменит остальную часть воспроизведения. Вероятно, это должно быть свойство. Кроме того, AVAudioPlayer может воспроизводить только одну звуковую дорожку за раз, поэтому вам нужно иметь две разные звуковые дорожки.

Другой (лучшей) альтернативой было бы полностью отказаться от касаний и использовать только кнопки. Вы можете получить уведомление, когда кнопка нажата (запуск ноты) и когда кнопка отпущена (следите за тем, какие из них все еще нажаты, и если вы нажали последний раз, затем воспроизведите «rest.mp3»). ).

person mackworth    schedule 08.05.2012