• UI小项目之拳皇动画的实现(抽取加载图片和播放音乐的方法)


    实现思路

    1、加载图片

    2、播放音乐

     

    实现思想

    1、封装思想

    抽取相同代码生成一个新的方法,通过传递参数调用该方法;

    2、内存管理思想

    不需要每次调用方法时都重新加载图片,for循环加载图片写在ViewdidLoad中

     

    下列代码没有对运行过程中内存管理进行优化

    其中加载图片有两种方法:

    通过imageNmae加载有缓存

    通过imageWithContentsOfFile加载无缓存

    有无缓存的区别:

    有缓存,使用时不需要重新加载

    无缓存,使用时才加载

    #import "ViewController.h"
    #import <AVFoundation/AVFoundation.h>
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    //播放器
    @property (nonatomic, strong) AVPlayer *player;
    //动画
    @property (nonatomic, strong) NSArray *standImages;
    @property (nonatomic, strong) NSArray *firstSkillImages;
    @property (nonatomic, strong) NSArray *secondSkillImages;
    @property (nonatomic, strong) NSArray *thirdSkillImages;
    @property (nonatomic, strong) NSArray *superSkillImages;
    @property (nonatomic, strong) NSArray *deadImages;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
    //    初始化
    / /      加载动画
    //    站立
        self.standImages = [self loadImagesWithImagePrefix:@"stand" Count:10];
    //    小招
        self.firstSkillImages = [self loadImagesWithImagePrefix:@"xiaozhao1" Count:21];
        self.secondSkillImages = [self loadImagesWithImagePrefix:@"xiaozhao2" Count:35];
        self.thirdSkillImages = [self loadImagesWithImagePrefix:@"xiaozhao3" Count:39];
    //    大招
        self.superSkillImages = [self loadImagesWithImagePrefix:@"dazhao" Count:87];
    //    死亡
        self.deadImages = [self loadImagesWithImagePrefix:@"dead" Count:23];
    //    让人物一开始就处于站立状态
        [self stand];
    
    
    
    // 加载音乐    
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"stand" withExtension:@"mp3"];
        AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url];
        self.player = [[AVPlayer alloc] initWithPlayerItem:item];
    }
    
    
    #pragma mark - 功能方法
    #pragma mark - 加载图片
    - (NSArray *)loadImagesWithImagePrefix:(NSString *)prefix Count:(NSInteger)count
    {
        NSMutableArray *images = [NSMutableArray array];
        for (int i = 0; i < count; i++) {
            NSString *imageName = [NSString stringWithFormat:@"%@_%i", prefix, i + 1];
            NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
            UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
            [images addObject:image];
        }
        return images;
    }
    #pragma mark - 执行动画并播放相应的音效
    - (void)playZhaoWithImages:(NSArray *)images withSoundName:(NSString *)soundName
    {
        //    设置播放的动画
        self.imageView.animationImages = images;
        //    设置播放的次数
        self.imageView.animationRepeatCount = 1;
    //    执行动画
        [self.imageView startAnimating];
    //    恢复站立
        NSTimeInterval delayTime = 1 / 30.0 *images.count - 0.1;
        [self performSelector:@selector(stand) withObject:nil afterDelay:delayTime];
        
    //    播放音乐
        NSURL *url = [[NSBundle mainBundle] URLForResource:soundName withExtension:@"mp3"];
        AVPlayerItem *replaceItem = [[AVPlayerItem alloc] initWithURL:url];
        [self.player replaceCurrentItemWithPlayerItem:replaceItem];
        self.player.rate = 1.5;
    }
    #pragma mark - 执行动画
    #pragma mark - 站立
    
    - (IBAction)stand {
    //    设置播放的动画
        self.imageView.animationImages = self.standImages;
    //    设置播放的次数
        self.imageView.animationRepeatCount = 0;
    //    设置执行的时间
    //    self.imageView.animationDuration = 0.8;
        
        [self.imageView startAnimating];
    }
    #pragma mark - 小招
    - (IBAction)firstSkill {
        [self playZhaoWithImages:self.firstSkillImages withSoundName:@"xiaozhao1"];
    }
    - (IBAction)secondSkill {
        [self playZhaoWithImages:self.secondSkillImages withSoundName:@"xiaozhao2"];
    }
    - (IBAction)thirdSkill {
        [self playZhaoWithImages:self.thirdSkillImages withSoundName:@"xiaozhao3"];
    }
    
    #pragma mark - 大招
    - (IBAction)superSkill {
        [self playZhaoWithImages:self.superSkillImages withSoundName:@"dazhao"];
    }
    #pragma mark - 死亡
    - (IBAction)dead {
        //    设置播放的动画
        self.imageView.animationImages = self.deadImages;
        //    设置播放的次数
        self.imageView.animationRepeatCount = 1;
        
        [self.imageView startAnimating];
    }
    #pragma mark - 游戏结束
    - (IBAction)gameOver {
        self.standImages = nil;
        self.firstSkillImages =nil;
        self.secondSkillImages = nil;
        self.thirdSkillImages = nil;
        self.superSkillImages = nil;
        self.deadImages = nil;
        self.player = nil;
        self.imageView.animationImages = nil;
    }
    @end

    优化后的代码

    #import "ViewController.h"
    #import <AVFoundation/AVFoundation.h>
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    //播放器
    @property (nonatomic, strong) AVPlayer *player;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    //    初始化
    
    //    让人物一开始就处于站立状态
        [self stand];
        
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"stand" withExtension:@"mp3"];
        AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url];
        self.player = [[AVPlayer alloc] initWithPlayerItem:item];
    }
    #pragma mark - 功能方法
    #pragma mark - 加载图片
    - (void)loadImagesWithImagePrefix:(NSString *)prefix Count:(NSInteger)count
    {
    //    if ([self.imageView isAnimating]) return;
        NSMutableArray *images = [NSMutableArray array];
        for (int i = 0; i < count; i++) {
            NSString *imageName = [NSString stringWithFormat:@"%@_%i", prefix, i + 1];
            NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
            UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
            [images addObject:image];
        }
        //    设置播放的动画
        self.imageView.animationImages = images;
        //    设置播放的次数
        self.imageView.animationRepeatCount = ![prefix isEqualToString:@"stand"];
        
        self.imageView.image = [UIImage imageNamed:@"stand_1"];
        self.imageView.animationDuration = count * 0.04;
        //    执行动画
        [self.imageView startAnimating];
        //    恢复站立
        if ([prefix isEqualToString:@"stand"]) return;
        [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
    }
    #pragma mark - 执行动画并播放相应的音效
    - (void)playMusicWithSoundName:(NSString *)soundName
    {
    //    播放音乐
        NSURL *url = [[NSBundle mainBundle] URLForResource:soundName withExtension:@"mp3"];
        AVPlayerItem *replaceItem = [[AVPlayerItem alloc] initWithURL:url];
        [self.player replaceCurrentItemWithPlayerItem:replaceItem];
        self.player.rate = 1.5;
    }
    #pragma mark - 执行动画
    #pragma mark - 站立
    
    - (IBAction)stand {
        [self loadImagesWithImagePrefix:@"stand" Count:10];
        [self playMusicWithSoundName:@"stand"];
    }
    #pragma mark - 小招
    - (IBAction)firstSkill {
        [self loadImagesWithImagePrefix:@"xiaozhao1" Count:21];
        [self playMusicWithSoundName:@"xiaozhao1"];
    }
    - (IBAction)secondSkill {
        }
    - (IBAction)thirdSkill {
        
    }
    
    #pragma mark - 大招
    - (IBAction)superSkill {
        [self loadImagesWithImagePrefix:@"dazhao" Count:87];
        [self playMusicWithSoundName:@"dazhao"];
    }
    #pragma mark - 死亡
    - (IBAction)dead {
    }
    #pragma mark - 游戏结束
    - (IBAction)gameOver {
    
        self.player = nil;
        self.imageView.animationImages = nil;
    }
    @end

    加载图片

    #pragma mark - 加载一系列图片
    //传入图片的名称的前缀及图片的数量
    - (NSArray *)loadImagesWithImagePrefix:(NSString *)prefix Count:(NSInteger)count
    {
        NSMutableArray *images = [NSMutableArray array];
        for (int i = 0; i < count; i++) {
            NSString *imageName = [NSString stringWithFormat:@"%@_%i", prefix, i + 1];
            NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
            UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
            [images addObject:image];
        }
        return images;
    }

    加载音乐

    #import <AVFoundation/AVFoundation.h>
    #pragma mark  - 创建播放器AVPlayer,
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"stand" withExtension:@"mp3"];
        AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:url];
        self.player = [[AVPlayer alloc] initWithPlayerItem:item];
    #pragma mark  - 传入要播放的音乐的名称(soundName)然后播放
    //    播放音乐
        NSURL *url = [[NSBundle mainBundle] URLForResource:soundName withExtension:@"mp3"];
        AVPlayerItem *replaceItem = [[AVPlayerItem alloc] initWithURL:url];
        [self.player replaceCurrentItemWithPlayerItem:replaceItem];
        self.player.rate = 1.5;
  • 相关阅读:
    如何使用RabbitMQ实现事件总线
    一起学Vue:UI框架(elementui)
    一起学Vue:访问API(axios)
    一起学Vue:CRUD(增删改查)
    一起学Vue:路由(vuerouter)
    如何使用IMemoryCache实现内存缓存
    手把手教你AspNetCore WebApi:Nginx(负载均衡)
    一起学Vue:状态管理(Vuex)
    自我介绍
    牛客练习赛74AB
  • 原文地址:https://www.cnblogs.com/dreamWanweidong/p/4999026.html
Copyright © 2020-2023  润新知