iOS ZHBarrage - 游戏弹幕 CABasicAnimation动画、不卡扽弹幕动画

说明

1.大多数弹幕都采用时间来控制弹幕,能够很好的适配在播放器、或者是一些对除了弹幕动画外,其他动画很少的项目中运行。而当除了弹幕动画以外,还存在更多动画时,就会导致动画冲突,而使弹幕停留不前,内存消耗巨大。故结合实际,简单写下此弹幕

2.此动画采用CABasicAnimation动画,与大多数动画不同采用时间来控制弹幕的走向有所不同。但是目前无法控制弹幕的停留,实际我所接触的项目也没有这个需求。

3.存在问题点,或者说是可优化点在于创建时默认初始化多个弹幕通道,但可能程序运行中,有些通道并不能得到有效的利用,如何在利用到的时候在进行初始化,有时间我在提交一个版本。

弹幕展示

z9lb4-pte81.gif

处理弹幕消息

1.我的思路是在处理接受到弹幕到时候,从上往下依次判断所创建的通道是否畅通,若找到畅通的通道时,进行数据渲染,开始动画。当所创建的通道全部被占用时,默认将消息保存在内存中,并按时间0.2秒循环查找是否有畅通通道。当内存中没有未处理的消息时,将定时器释放,代码如下

- (void)sendMessage:(NSMutableAttributedString *)attributedString
     withSpseed:(int)spseed
      withImage:(NSString *)imagePath
     withInsets:(UIEdgeInsets)insets {
if (!_isaccording) {
    if (!_cacheInfoArr) {
        _cacheInfoArr = [[NSMutableArray alloc] init];
    }
    ZHModel *model = [[ZHModel alloc] init];
    model.attributedString = attributedString;
    model.imagePath = imagePath;
    model.spseed = spseed;
    model.textInsets = insets;
    [_cacheInfoArr addObject:model];
    return;
}
if (_cacheInfoArr && _cacheInfoArr.count > 0) {
    //别急,先处理当前缓存信息
    ZHModel *model = [[ZHModel alloc]init];
    model.attributedString = attributedString;
    model.spseed = spseed;
    model.imagePath = imagePath;
    model.textInsets = insets;
    [_cacheInfoArr addObject:model];
    return;
}
//是否查找到通道
for (int i = 0; i < _countChannel; i++) {
    ZHLabel *label = [self viewWithTag:ZH_Label_tag + I];
    NSLog(@"curr channel %d unblocked = %d",i,label.unblocked);
    if (label.unblocked == YES) {
        [label updateAttributed:attributedString
                     withSpseed:spseed
                      withImage:imagePath
                     withInsets:insets];
        return;
    }
}
//处理未找到通道时动作
NSLog(@"creat succeed");
if (!_cacheInfoArr) {
    _cacheInfoArr = [[NSMutableArray alloc] init];
}
ZHModel *model = [[ZHModel alloc] init];
model.attributedString = attributedString;
model.imagePath = imagePath;
model.spseed = spseed;
model.textInsets = insets;
[_cacheInfoArr addObject:model];
if (!caCcheTime) {
    caCcheTime = [NSTimer scheduledTimerWithTimeInterval:0.2
                                                  target:self
                                                selector:@selector(cacheTimeFunction)
                                                userInfo:nil
                                                 repeats:YES];
}
}
- (void)cacheTimeFunction{
ZHModel *model = [_cacheInfoArr firstObject];
for (int i = 0; i < _countChannel; i++) {
    ZHLabel *label = [self viewWithTag:ZH_Label_tag + I];
    if (label.unblocked == YES) {
        [label updateAttributed:model.attributedString
                     withSpseed:model.spseed
                      withImage:model.imagePath
                     withInsets:model.textInsets];
        [_cacheInfoArr removeObjectAtIndex:0];
        if (_cacheInfoArr.count == 0) {
            //清空集合,停止时间循环
            _cacheInfoArr = nil;
            [self stopCacheTime];
            NSLog(@"clean succeed");
        }
        return;
    }
}
}

2.动画采用CABasicAnimation动画,并监听动画是否完成

- (void)startAnimationandLabel:(ZHLabel *)label{
CGFloat customLabwith = label.frame.size.width;
int time = (ZH_ANIMATION_WIDTH + customLabwith*2 + 10)/self.spseed;
CGFloat left_P = - (customLabwith/2 - 10);
CGPoint center = CGPointMake(ZH_ANIMATION_WIDTH + customLabwith/2 + 5, label.center.y);
CGPoint finishPoint = CGPointMake(left_P, label.center.y);
CABasicAnimation *animationgo = [CABasicAnimation animationWithKeyPath:@"position"];
animationgo.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animationgo.duration = time;
animationgo.repeatCount = 1;
animationgo.delegate = self;
animationgo.removedOnCompletion = NO;
animationgo.beginTime = CACurrentMediaTime();
animationgo.fromValue = [NSValue valueWithCGPoint:center];
animationgo.toValue = [NSValue valueWithCGPoint:finishPoint];
[label.layer addAnimation:animationgo forKey:@"label"];
_label = label;
}
#pragma mark - CAAnimationDelegate
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
if (anim == [_label.layer animationForKey:@"label"]) {
    [_label.layer removeAnimationForKey:@"label"];
    _label.unblocked = YES;
}
}

介绍

给我们项目打一个广告吧,欢迎去AppStore搜索下载"欢乐狼人杀",有什么想法,或者看法,也可能联系我,欢迎大神点评

wiscq-y36zs.gif

dome:
https://github.com/Zhangyunjiang123/ZHBarrage

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,321评论 6 30
  • 姓名:吴龙飞 公司:杭州简品食品股份有限公司 组别:利他一组 【日精进打卡...
    加了冰的咖啡阅读 82评论 0 0
  • 1. 定义 观察者模式也叫发布订阅模式/模型,在项目中常用:定义对象间一种一对多的依赖关系,使得每当一个对象改变状...
    小楠总阅读 656评论 0 1
  • 最近因为崔永元老师,冰冰又大火了可是这次火却是法律不允许的;因为是偷税漏税的大小合同。 1 最近手机2又开始开拍了...
    超越凡尘118阅读 879评论 4 15