Cocos2D - ccTouchMoved повторно запускает звук, а ccTouchEnded не работает - PullRequest
0 голосов
/ 10 октября 2011

Я пытаюсь создать приложение, в котором должен воспроизводиться короткий образец звука, пока человек, использующий приложение, проводит пальцем по экрану. Когда палец (пальцы) поднят с экрана - звук прекратится.

Это текущая функция, которая запускает звук (я пробовал разные методы):

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{

NSLog(@"Ja, den börjar...");
return YES; 
}

-(void)ccTouchMoved:(NSSet *)touch withEvent:(UIEvent *)event{

    soundFile = [[CDAudioManager sharedManager] audioSourceForChannel:kASC_Right];
    [soundFile load:@"sound.wav"];
    soundFile.backgroundMusic = NO;
    soundSourceForFile:@"sound.wav"]retain];
}

Это функция, которая останавливает звук:

-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{
    [soundFile stop]; 
}

Я впервые начал использовать ccTouchBegan (просто для того, чтобы какой-то звук работал), который плавно зацикливал звук. В этот момент ccTouchEnded работал вместе с событием «Touch Up Inside».

Суть, как я уже сказал, заключается в том, что звук должен воспроизводиться, когда пользователь проводит пальцем по экрану. Но когда я попытался связать функцию playSound с "ccTouchMoved", звук многократно перекручивается вокруг самого себя, а не по одному, что делает его адским в использовании. Функция stopSound не работает после перехода на ccTouchMoved.

Я пытался использовать NSTimer, чтобы создать какой-то способ обработки циклов, но безуспешно.

Я начал этот проект с обычного iOS SDK и обнаружил свои ограничения, когда узнал, что не смог справиться с манипулированием высотой и усилением без Cocos2d.

Я получил все, что работает в обычном SDK, заключив его в оператор if:

if(![mySound isPlaying]{
    [mySound play];
}

Это, как я уже сказал, прекрасно работало в обычном SDK, но не сейчас, когда я использую Cocos2d.

У вас, ребята, есть хорошие идеи? Я начинающий, когда дело доходит до Objective-C, разработки для iPhone и XCode - так откровенно со мной.

1 Ответ

1 голос
/ 10 октября 2011

ccTouchMoved будет вызываться непрерывно, когда палец перемещается по экрану.Проблема, с которой вы здесь сталкиваетесь, заключается в том, что каждый раз, когда это вызывается, вы загружаете новый звуковой файл, и они перекрываются, потому что они являются вновь созданными отдельными объектами.У вас есть только ссылка на последний загруженный вами звук (на который указывает soundFile), и вы не освобождаете память.

Пример:

(когда вы перетаскиваетеfinger)

LoadedSoundA created and starts playing
soundfile points to LoadedSoundA
// finger moves
LoadedSoundB created and starts playing
soundfile points to LoadedSoundB
// finger moves
LoadedSoundC created and starts playing
soundfile points to LoadedSoundC
... etc

единственный звук, на который у вас есть указатель в данный момент, это последний созданный звук, так как вы каждый раз переназначаете звуковой файл.Таким образом, вы можете «остановить» только тот звук, который вы создали последним.

Вы также теряете много памяти, поскольку сохраняете все эти звуки и никогда не выпускаете их.

Я бы предложилдругая тактика:

В touchsBegan вы должны загрузить звук и заставить его воспроизводиться в цикле и записывать время касания на уровне класса iVar.

Теперь в TouchesMoved вы должны получить времятекущего касания и посмотрите, достаточно ли близко оно ко времени, которое вы записали.Если он находится в пределах, скажем, 0,5 секунды, просто обновите записанную метку времени и продолжайте;Однако если с момента последнего касания прошло слишком много времени, вы прекращаете воспроизводимый звук.

Таким образом, воспроизводится цельный звук, он создается только один раз, и вы сохраняете свое право собственности на него.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...