Tôi cố gắng mở rộng chức năng của SimpleAudioEngine của cocos2d với khả năng phát một số hiệu ứng âm thanh cái khác như một số loại chuỗi. Tôi đã cố gắng làm điều này với một phần mở rộng. Tuy nhiên bây giờ tôi nhận ra rằng tôi có lẽ cũng cần một iVar để nhớ tên của tất cả các tập tin âm thanh và một để nhớ âm thanh hiện đang chơi.Mục tiêu-C Danh mục và iVar mới
Tuy nhiên có vẻ như tôi không thể thêm iVars vào danh mục. Thay vào đó tôi đã cố gắng sử dụng một phần mở rộng, nhưng có vẻ như họ cần phải ở trong tập tin .m ban đầu của lớp để cũng không hoạt động. Có cách nào khác, điều đó cho phép tôi làm điều này không?
Các tiêu đề với các loại
#import <Foundation/Foundation.h>
@interface SimpleAudioEngine(SoundChainHelper)<CDLongAudioSourceDelegate>
-(void)playSoundChainWithFileNames:(NSString*) filename, ...;
@end
Và .m-file với phần mở rộng:
#import "SoundChainHelper.h"
@interface SimpleAudioEngine() {
NSMutableArray* soundsInChain;
int currentSound;
}
@end
@implementation SimpleAudioEngine(SoundChainHelper)
// read in all filenames and start off playing process
-(void)playSoundChainWithFileNames:(NSString*) filename, ... {
soundsInChain = [[NSMutableArray alloc] initWithCapacity:5];
va_list params;
va_start(params,filename);
while (filename) {
[soundsInChain addObject:filename];
filename = va_arg(params, NSString*);
}
va_end(params);
currentSound = 0;
[self cdAudioSourceDidFinishPlaying:nil];
}
// play first file, this will also always automatically be called as soon as the previous sound has finished playing
-(void)cdAudioSourceDidFinishPlaying:(CDLongAudioSource *)audioSource {
if ([soundsInChain count] > currentSound) {
CDLongAudioSource* mySound = [[CDAudioManager sharedManager] audioSourceForChannel:kASC_Right];
[mySound load:[soundsInChain objectAtIndex:0]];
mySound.delegate = self;
[mySound play];
currentSound++;
}
}
@end
Ngoài ra tôi đã cố gắng để xác định Ivars như tài sản, mà sẽ biên dịch. Tuy nhiên tôi không thể tổng hợp chúng cũng như tôi không có khả năng khác để ràng buộc chúng với bất kỳ phương pháp nào.
Tôi cố gắng triển khai chức năng dưới dạng danh mục của SimpleAudioEngine để tôi chỉ cần nhớ một lớp có giao dịch với tất cả các vấn đề âm thanh của mình. và để tôi có thể tạo một chuỗi đơn giản như thế này:
[[SimpleAudioEngine sharedEngine] playSoundChainWithFileNames:@"6a_loose1D.mp3", @"6a_loose2D.mp3", @"6a_loose3D.mp3", @"6a_loose4D.mp3", @"6b_won1D.mp3", nil];
Nếu có cách khác mang lại kết quả tương tự/tương tự, tôi cũng rất biết ơn.
Tại sao không phân lớp SimpleAudioEngine? – lawicko
có thể trùng lặp của [Mục tiêu-C: Thuộc tính trong Danh mục] (http: // stackoverflow.com/questions/8733104/objective-c-property-in-category) – hfossli