IOS--简单的汤姆猫代码

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

// 汤姆猫图像视图
@property (weak, nonatomic) IBOutlet UIImageView *tomcatImageView;

// 动画操作
- (IBAction)animationAction:(UIButton *)sender;

@end

-------------------------------------------------------------------------------------------------

#import "ViewController.h"
#import <AudioToolbox/AudioToolbox.h>

typedef enum
{
    kTomCatFart = 0,        // 放屁
    kTomCatCymbal,          // 打叉
    kTomcatDrink,           // 喝牛奶
    kTomCatEat,             // 吃鸟
    kTomCatPie,             // 拍饼
    kTomCatScratch,         // 玻璃
    kTomCatKnockout,        // 打脸
    kTomCatStomach,         // 肚皮
    kTomCatFootRight,       // 右脚
    kTomCatFootLeft,        // 左脚
    kTomCatAngryTail,       // 尾巴
} kTomCatAnimationType;

@interface ViewController ()
{
    // 汤姆猫数据字典
    NSMutableDictionary *_tomcatDict;
   
    // 音效的数据字典
    NSMutableDictionary *_soundDict;
}

@end

@implementation ViewController
/**
 用数据字典来实现音效的管理
 */
- (SystemSoundID)loadSoundId:(NSString *)soundFile
{
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:soundFile ofType:nil]];
   
    SystemSoundID soundId;
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundId);
   
    return soundId;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
    // 数据初始化工作,加载数据字典成员变量
    // 1. 需要指定路径
    NSString *path = [[NSBundle mainBundle]pathForResource:@"Tomcat" ofType:@"plist"];
    // 2. 加载数据字典
    _tomcatDict = [NSMutableDictionary dictionaryWithContentsOfFile:path];
   
    NSLog(@"%@", _tomcatDict);
   
    // 3. 初始化音效字典
    _soundDict = [NSMutableDictionary dictionary];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Actions
// 汤姆猫动画操作
- (IBAction)animationAction:(UIButton *)sender
{
    // 如果汤姆猫正在动画中,不允许中断动画
    if ([_tomcatImageView isAnimating]) {
        return;
    }
   
    // 1. 判断按钮的tag,根据不同的tag加载不同的序列帧图像数组
    // 2. 设置汤姆猫的图像,开始动画
    // 要让代码的可读性更好,可以考虑使用枚举来替代tag的数字
    // 引入数据字典,会简化我们的操作!
    NSDictionary *dict;
    switch (sender.tag) {
        case kTomCatAngryTail:
            dict = _tomcatDict[@"angry-tail"];
            break;
        case kTomCatFart:
            dict = _tomcatDict[@"fart"];
            break;
        case kTomCatCymbal:
            dict = _tomcatDict[@"cymbal"];
            break;
        case kTomcatDrink:
            dict = _tomcatDict[@"drink"];
            break;
        case kTomCatEat:
            dict = _tomcatDict[@"eat"];
            break;
        case kTomCatPie:
            dict = _tomcatDict[@"pie"];
            break;
        case kTomCatScratch:
            dict = _tomcatDict[@"scratch"];
            break;
        default:
            break;
    }
   
    // 根据选中的数据字典,初始化序列帧图像
    NSMutableArray *imageList = [NSMutableArray array];
   
    for (NSInteger i = 0; i < [dict[@"frames"]integerValue]; i++) {
        NSString *imageFile = [NSString stringWithFormat:dict[@"imageFormat"], i];
        UIImage *image = [UIImage imageNamed:imageFile];
       
        [imageList addObject:image];
    }
   
    //--------------------------------------------------
    // 音频处理部分代码
    // 1) 从汤姆猫的数据字典中,首先取出声音文件的数组
    NSArray *array = dict[@"soundFiles"];
    // 2) 判断数组中是否有数据,如果有数据做进一步处理
    SystemSoundID soundId = 0;
    if (array.count > 0) {
        // 3) 我们根据数组中得文件名,判断音频字典中是否有对应的记录,如果没有,建立新的音频数据字典
        for (NSString *fileName in array) {
            SystemSoundID playSoundId = [_soundDict[fileName]unsignedLongValue];
           
            // 如果在字典中没有定义音频代号,初始化音频Id,并且加入字典
            if (playSoundId <= 0) {
                playSoundId = [self loadSoundId:fileName];
                // 将playSoundId加入到数据字典,向字典中增加数值,不是用add
                // 向NSDict NSArray中添加数值需要“包装”
                // @() 会把一个NSInteger的数字,变成NSNumber的对象
                [_soundDict setValue:@(playSoundId) forKey:fileName];
            }
        }
        NSLog(@"============================");
        NSLog(@"%@", _soundDict);
       
        // 每一个动画的声音可以是多个,为了保证游戏的可玩度,可以采用随机数的方式播放音效
        NSInteger seed = arc4random_uniform(array.count);
        NSString *fileName = array[seed];
       
        soundId = [_soundDict[fileName]unsignedLongValue];
    }
   
    // 设置图像的动画属性
    [_tomcatImageView setAnimationImages:imageList];
    [_tomcatImageView setAnimationDuration:[dict[@"frames"]integerValue] / 10.0];
    [_tomcatImageView setAnimationRepeatCount:1];
    [_tomcatImageView startAnimating];
   
    // 播放声音
    if (soundId > 0) {
        AudioServicesPlaySystemSound(soundId);
    }
}

@end

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。