Files
yinmeng-ios/xplan-ios/Main/Room/View/AnimationView/XPRoomAnimationView.m

1166 lines
46 KiB
Mathematica
Raw Normal View History

//
// XPRoomAnimationView.m
// xplan-ios
//
// Created by on 2021/12/6.
//
#import "XPRoomAnimationView.h"
///Third
#import <Masonry/Masonry.h>
#import <SVGA.h>
#import <NIMSDK/NIMSDK.h>
#import <POP.h>
///Tool
#import "XPGiftStorage.h"
#import "XPMacro.h"
#import "ThemeColor+Room.h"
#import "NetImageView.h"
///Model
#import "MicroQueueModel.h"
#import "MicroStateModel.h"
#import "UserInfoModel.h"
#import "GiftReceiveInfoModel.h"
#import "GiftInfoModel.h"
#import "RoomInfoModel.h"
#import "AttachmentModel.h"
#import "XPGiftBigPrizeModel.h"
#import "XPGiftBannerUserInfoModel.h"
#import "XPRoomGiftBroadCastModel.h"
2021-12-17 15:18:34 +08:00
#import "XPMessageRemoteExtModel.h"
2022-01-05 21:48:21 +08:00
#import "DatingInfoModel.h"
///View
#import "XPRoomGiftBannerView.h"
#import "XPRoomGiftBroadcastView.h"
#import "XPRoomCandyGiftView.h"
2022-01-05 21:48:21 +08:00
#import "XPRoomDatingAnimationView.h"
#import "XPRoomNobleLevelUpView.h"
2021-12-16 20:22:01 +08:00
@interface XPRoomAnimationView ()<SVGAPlayerDelegate,NIMBroadcastManagerDelegate, XPRoomGiftBroadcastViewDelegate>
///
///
@property (nonatomic,strong) XPRoomAnimationHitView * lowLevelView;
///
@property (nonatomic,strong) XPRoomAnimationHitView * middleLevelView;
///
@property (nonatomic,strong) XPRoomAnimationHitView * highLevleView;
///
@property (strong, nonatomic) SVGAParser *parser;
///
@property (nonatomic,strong) SVGAImageView *giftEffectView;
///
@property (nonatomic,weak) id<RoomHostDelegate>delegate;
///
@property (nonatomic,strong) NSMutableArray<GiftReceiveInfoModel *> *giftEffectQueue;
///
@property (strong,nonatomic)NSMutableSet * bannerDequePool;
///
@property (strong,nonatomic)NSMutableSet * bannerVisiablePool;
/// 6s
@property (nonatomic,strong)dispatch_source_t giftEffectTimer;
///
@property (nonatomic,strong) NSMutableArray<XPGiftBigPrizeModel *> *bigPrizeGiftQueue;
///
@property (nonatomic,strong)dispatch_source_t luckyprizeTimer;
///广
@property (nonatomic,strong) NSMutableArray<XPRoomGiftBroadCastModel *> *giftBroadcastQueue;
#pragma mark -
///
@property (nonatomic,strong) NSMutableArray<GiftReceiveInfoModel *> *giftQueue;
///
@property (nonatomic ,strong)dispatch_source_t giftTimer;
///
@property (nonatomic,strong) NSMutableSet<NetImageView *> * giftReuseArray;
///
@property (nonatomic,strong) NSMutableSet<NetImageView *> * giftVisibleArray;
///
@property (nonatomic,strong) NSMutableArray *candyTreegiftQueue;
///
@property (nonatomic, strong) NSMutableArray *nobleLevelUpQueue;
2021-12-17 15:18:34 +08:00
#pragma mark -
2021-12-16 20:22:01 +08:00
@property (nonatomic, strong) NSMutableArray<NSString *> *carEffectQueue;
@property (nonatomic,strong) SVGAImageView *carEffectView;
2021-12-17 15:18:34 +08:00
#pragma mark -
@property (nonatomic, strong) NSMutableArray<NSDictionary *> *enterEffectQueue;
@property (nonatomic,strong) SVGAImageView *enterEffectView;
2022-01-05 21:48:21 +08:00
#pragma mark -
@property (nonatomic, strong) NSMutableArray<DatingInfoModel *> *datingEffectQueue;
@property (nonatomic,strong) SVGAImageView *datingEffectView;
@end
@implementation XPRoomAnimationView
- (void)dealloc {
[NSObject cancelPreviousPerformRequestsWithTarget:self];
2021-12-16 20:22:01 +08:00
[[NIMSDK sharedSDK].broadcastManager removeDelegate:self];
}
2022-01-13 18:45:17 +08:00
- (instancetype)initWithDelegate:(id<RoomHostDelegate>)delegate {
self = [super init];
if (self) {
[[NIMSDK sharedSDK].broadcastManager addDelegate:self];
self.delegate = delegate;
[self initSubViews];
[self initSubViewConstraints];
}
return self;
}
#pragma mark - Private Method
- (void)initSubViews {
[self addSubview:self.lowLevelView];
[self addSubview:self.middleLevelView];
[self addSubview:self.highLevleView];
}
- (void)initSubViewConstraints {
[self.lowLevelView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self);
}];
[self.middleLevelView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self);
}];
[self.highLevleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self);
}];
}
#pragma mark - NIMBroadcastDelegate
// 广
- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage{
if (broadcastMessage.content) {
NSDictionary *msgDictionary = [broadcastMessage.content toJSONObject];
AttachmentModel *attachment = [AttachmentModel modelWithJSON:msgDictionary[@"body"]];
if (attachment.first == CustomMessageType_Gift && attachment.second == Custom_Message_Sub_Gift_ChannelNotify){///广
[self receiveBroadcastGift:attachment];
}
}
}
2021-12-16 20:22:01 +08:00
#pragma mark - RoomGuestDelegate
2021-12-25 16:57:50 +08:00
- (void)handleNIMCustomMessage:(NIMMessage *)message {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
AttachmentModel *attachment = (AttachmentModel *)obj.attachment;
if (attachment.first == CustomMessageType_Gift) {
GiftReceiveInfoModel * receiveInfo = [GiftReceiveInfoModel modelWithJSON:attachment.data];
receiveInfo.isLuckyBagGift = attachment.second == Custom_Message_Sub_Gift_LuckySend;
receiveInfo.isBatch = YES;
[self receiveGiftHandleSendGiftAnimation:attachment];
[self receiveGift:receiveInfo];
} else if (attachment.first == CustomMessageType_AllMicroSend) { //
GiftReceiveInfoModel * receiveInfo = [GiftReceiveInfoModel modelWithJSON:attachment.data];
receiveInfo.isLuckyBagGift = (attachment.second == Custom_Message_Sub_AllMicroLuckySend || attachment.second == Custom_Message_Sub_AllBatchMicroLuckySend);
receiveInfo.isBatch = (attachment.second == Custom_Message_Sub_AllBatchSend || attachment.second == Custom_Message_Sub_AllBatchMicroLuckySend);
[self receiveGiftHandleSendGiftAnimation:attachment];
[self receiveGift:receiveInfo];
} else if (attachment.first == CustomMessageType_LuckyBag) {//
[self receiveLuckyGiftBigPrize:attachment];
} else if (attachment.first == CustomMessageType_Candy_Tree && (attachment.second == Custom_Message_Sub_Candy_Tree_InRoom_NeedAllMicSend || attachment.second == Custom_Message_Sub_Candy_Tree_AllRoom_Notify) ) {//
[self receiveCandyTreeGiftHighLevle:attachment];
} else if (attachment.first == CustomMessageType_Car_Notify && attachment.second == Custom_Message_Sub_Car_EnterRoom ) {//
[self receiveDriveCarEnterRoom:attachment];
2022-01-05 21:48:21 +08:00
} else if(attachment.first == CustomMessageType_RoomPlay_Dating && attachment.second == Custom_Message_Sub_Room_Play_Dating_Public_Result) {
[self roomDatingPublicResult:attachment];
} else if (attachment.first == CustomMessageType_Noble_VIP && attachment.second == Custom_Message_Sub_Room_Noble_LevelUp_Suspend) { ///
[self receiveNobleLevelUp:attachment];
}
2021-12-16 20:22:01 +08:00
}
}
2021-12-17 15:18:34 +08:00
- (void)handleNIMNotificationMessage:(NIMMessage *)message {
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content;
if (content.eventType == NIMChatroomEventTypeEnter) {
NIMMessageChatroomExtension * messageExt = (NIMMessageChatroomExtension *)message.messageExt;
NSDictionary * dic = [(NSDictionary *)messageExt.roomExt.toJSONObject objectForKey:message.from];
XPMessageRemoteExtModel * extModel = [XPMessageRemoteExtModel modelWithJSON:dic];
[self userEnterRoom:content ext:extModel];
}
}
2022-01-05 21:48:21 +08:00
#pragma mark -
- (void)roomDatingPublicResult:(AttachmentModel *)attachment {
self.datingEffectQueue = [NSMutableArray array];
///
NSArray * results = [DatingInfoModel modelsWithArray:attachment.data[@"list"]];
[self.datingEffectQueue addObjectsFromArray:results];
if (self.datingEffectQueue.count > 0) {
[self startDatingAnimation:self.datingEffectQueue.firstObject];
}
}
- (void)startDatingAnimation:(DatingInfoModel *)datingModel {
[[NSNotificationCenter defaultCenter] postNotificationName:@"message" object:[self createRoomDatingResultMessage:datingModel]];
NSString * targetUid= [NSString stringWithFormat:@"%ld", datingModel.targetUid];
NSString * uid= [NSString stringWithFormat:@"%ld", datingModel.uid];
if (datingModel.hasHeart || datingModel.hasSelectUser) {
2022-01-13 18:45:17 +08:00
datingModel.originPoint = [self.delegate animationPointAtStageViewByUid:uid];
datingModel.targetPoint = [self.delegate animationPointAtStageViewByUid:targetUid];
2022-01-05 21:48:21 +08:00
}
XPRoomDatingAnimationView * datingView = [[XPRoomDatingAnimationView alloc] init];
[self.highLevleView addSubview:datingView];
[datingView startAnimationWithModel:datingModel finishBlock:^(BOOL finish) {
2022-01-06 10:47:52 +08:00
[datingView removeFromSuperview];
2022-01-05 21:48:21 +08:00
[self.datingEffectQueue removeObject:datingModel];
2022-01-06 10:47:52 +08:00
if (self.datingEffectQueue.count > 0) {
2022-01-05 21:48:21 +08:00
DatingInfoModel * datingModel = [self.datingEffectQueue firstObject];
[self startDatingAnimation:datingModel];
}
}];
}
- (NIMMessage *)createRoomDatingResultMessage:(DatingInfoModel *)datingModel {
NIMMessage * message = [[NIMMessage alloc] init];
NIMSession * session = [NIMSession session:[NSString stringWithFormat:@"%ld", self.delegate.getRoomInfo.roomId] type:NIMSessionTypeChatroom];
[message setValue:session forKey:@"session"];
AttachmentModel * attach = [[AttachmentModel alloc] init];
attach.first = CustomMessageType_RoomPlay_Dating;
if (datingModel.hasHeart) {///
attach.second = Custom_Message_Sub_Room_Play_Dating_Result_Mutual;
} else {
attach.second = Custom_Message_Sub_Room_Play_Dating_Result_Not_Mutual;
}
attach.data = [datingModel model2dictionary];
NIMCustomObject * object = [[NIMCustomObject alloc] init];
object.attachment = attach;
message.messageObject = object;
return message;
}
2021-12-17 15:18:34 +08:00
#pragma mark - XXX
- (void)userEnterRoom:(NIMChatroomNotificationContent *)content ext:(XPMessageRemoteExtModel *)extModel {
if (extModel.experLevelSeq < 30) return;
NSString * title = [NSString stringWithFormat:@"%@进入了房间", content.source.nick];
if (self.enterEffectQueue.count ==0) {
[self playUserEnterRoomAnimation:title experLevelSeq:extModel.experLevelSeq];
}
NSDictionary * dic= @{@"title":title, @"experLevelSeq":[NSString stringWithFormat:@"%ld", extModel.experLevelSeq]};
[self.enterEffectQueue addObject:dic];
}
- (void)playUserEnterRoomAnimation:(NSString *)title experLevelSeq:(NSInteger)experLevelSeq {
NSString * path;
if (experLevelSeq >= 30 && experLevelSeq <= 39) {
path = @"svga_member_in_lv30";
} else if (experLevelSeq >= 40 && experLevelSeq <= 49) {
path = @"svga_member_in_lv40";
} else if (experLevelSeq >= 50 && experLevelSeq <= 59) {
path = @"svga_member_in_lv50";
} else if (experLevelSeq >= 60 && experLevelSeq <= 69) {
path = @"svga/svga_member_in_lv60";
} else if (experLevelSeq >= 70 && experLevelSeq <= 79) {
path = @"svga/svga_member_in_lv70";
} else if (experLevelSeq >= 80 && experLevelSeq <= 89) {
path = @"svga/svga_member_in_lv80";
} else {
path = @"svga/svga_member_in_lv90";
}
if (self.enterEffectView.superview == nil) {
self.enterEffectView.frame = CGRectMake(KScreenWidth, 339 + kSafeAreaTopHeight, KScreenWidth, 40);
[self.lowLevelView addSubview:self.enterEffectView];
}
NSMutableAttributedString * attribute = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:26], NSForegroundColorAttributeName:[UIColor whiteColor]}];
@kWeakify(self);
[self.parser parseWithNamed:path inBundle:[NSBundle mainBundle] completionBlock:^(SVGAVideoEntity * _Nonnull videoItem) {
@kStrongify(self);
self.enterEffectView.loops = 1;
self.enterEffectView.hidden = NO;
self.enterEffectView.clearsAfterStop = NO;
self.enterEffectView.alpha = 1;
self.enterEffectView.videoItem = videoItem;
[self.enterEffectView setAttributedText:attribute forKey:@"room_text"];
[self.enterEffectView startAnimation];
} failureBlock:^(NSError * _Nonnull error) {
}];
[UIView animateWithDuration:0.5 animations:^{
self.enterEffectView.frame = CGRectMake(0, 339 + kSafeAreaTopHeight, KScreenWidth, 40);
} completion:^(BOOL finished) {
}];
}
2021-12-16 20:22:01 +08:00
#pragma mark -
- (void)receiveDriveCarEnterRoom:(AttachmentModel *)attatchment {
2021-12-25 18:34:54 +08:00
if (!self.delegate.getRoomInfo.hasAnimationEffect) {return;}
2021-12-16 20:22:01 +08:00
NSString * effect = attatchment.data[@"effect"];
if (effect.length <= 0) return;
if (self.carEffectQueue.count == 0) {
[self playCarEffect:effect];
}
[self.carEffectQueue addObject:effect];
}
- (void)playCarEffect:(NSString *)carEffect {
if (self.carEffectView.superview == nil) {
[self.middleLevelView addSubview:self.carEffectView];
[self.carEffectView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.mas_equalTo(self.middleLevelView);
make.width.mas_equalTo(KScreenWidth);
make.height.mas_equalTo(KScreenHeight);
}];
}
[self.parser parseWithURL:[NSURL URLWithString:carEffect] completionBlock:^(SVGAVideoEntity * _Nullable videoItem) {
if (videoItem != nil) {
CGFloat width = videoItem.videoSize.width;
CGFloat height = videoItem.videoSize.height;
if (width > height) {
self.giftEffectView.contentMode = UIViewContentModeScaleAspectFit;
} else {//
CGFloat resizeH = KScreenWidth * height / width;//
if (resizeH > KScreenHeight) {//
self.giftEffectView.contentMode = UIViewContentModeScaleAspectFill;
} else {//
self.giftEffectView.contentMode = UIViewContentModeScaleAspectFit;
}
}
2021-12-17 15:18:34 +08:00
self.carEffectView.hidden = NO;
2021-12-16 20:22:01 +08:00
self.carEffectView.alpha = 1;
self.carEffectView.loops = 1;
self.carEffectView.clearsAfterStop = YES;
self.carEffectView.videoItem = videoItem;
[self.carEffectView startAnimation];
}
2021-12-16 20:22:01 +08:00
} failureBlock:^(NSError * _Nullable error) {
}];
}
#pragma mark -
- (void)receiveCandyTreeGiftHighLevle:(AttachmentModel *)attatchment {
if (self.candyTreegiftQueue.count == 0) {
[self createCandyTreeBannerAnimation:attatchment.data];
}
[self.candyTreegiftQueue addObject:attatchment.data];
}
- (void)createCandyTreeBannerAnimation:(NSDictionary *)dic {
XPRoomCandyGiftView *candyTreeView = [[XPRoomCandyGiftView alloc] initWithFrame:CGRectMake(KScreenWidth, kNavigationHeight + 15, KScreenWidth, 45)];
candyTreeView.candyInfo = dic;
[self.middleLevelView addSubview:candyTreeView];
POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
springAnimation.springSpeed = 12;
springAnimation.springBounciness = 10.f;
springAnimation.fromValue = [NSValue valueWithCGPoint:candyTreeView.center];
springAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(candyTreeView.frame.size.width / 2, candyTreeView.center.y)];
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
if (finished) {
POPBasicAnimation *moveAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];
2021-12-11 12:00:24 +08:00
moveAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, candyTreeView.center.y)];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(-KScreenWidth/2, candyTreeView.center.y)];
moveAnimation.beginTime = CACurrentMediaTime() + 3;
moveAnimation.duration = 0.5;
moveAnimation.repeatCount = 1;
moveAnimation.removedOnCompletion = YES;
@kWeakify(self);
[moveAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
@kStrongify(self);
if (finished) {
[candyTreeView removeFromSuperview];
[self.candyTreegiftQueue removeObjectAtIndex:0];
if (self.candyTreegiftQueue.count > 0) {
[self createCandyTreeBannerAnimation:self.candyTreegiftQueue.firstObject];
}
}
}];
[candyTreeView pop_addAnimation:moveAnimation forKey:@"moveOutAnimation"];
}
}];
[candyTreeView pop_addAnimation:springAnimation forKey:@"candyTreespingOutAnimation"];
}
#pragma mark -
- (void)receiveNobleLevelUp:(AttachmentModel *)attachment {
if (self.nobleLevelUpQueue.count == 0) {
[self createNobleLevelUpBannerAnimation:attachment.data];
}
[self.nobleLevelUpQueue addObject:attachment.data];
}
- (void)createNobleLevelUpBannerAnimation:(NSDictionary *)dic {
XPRoomNobleLevelUpView *nobleLevelUpView = [[XPRoomNobleLevelUpView alloc] initWithFrame:CGRectMake(KScreenWidth, kNavigationHeight + 15, KScreenWidth, 90)];
nobleLevelUpView.nobleInfo = dic;
[self.middleLevelView addSubview:nobleLevelUpView];
POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
springAnimation.springSpeed = 12;
springAnimation.springBounciness = 10.f;
springAnimation.fromValue = [NSValue valueWithCGPoint:nobleLevelUpView.center];
springAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(nobleLevelUpView.frame.size.width / 2, nobleLevelUpView.center.y)];
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
if (finished) {
POPBasicAnimation *moveAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];
moveAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, nobleLevelUpView.center.y)];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(-KScreenWidth/2, nobleLevelUpView.center.y)];
moveAnimation.beginTime = CACurrentMediaTime() + 3;
moveAnimation.duration = 0.5;
moveAnimation.repeatCount = 1;
moveAnimation.removedOnCompletion = YES;
@kWeakify(self);
[moveAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
@kStrongify(self);
if (finished) {
[nobleLevelUpView removeFromSuperview];
[self.nobleLevelUpQueue removeObjectAtIndex:0];
if (self.nobleLevelUpQueue.count > 0) {
[self createNobleLevelUpBannerAnimation:self.nobleLevelUpQueue.firstObject];
}
}
}];
[nobleLevelUpView pop_addAnimation:moveAnimation forKey:@"moveOutAnimation"];
}
}];
[nobleLevelUpView pop_addAnimation:springAnimation forKey:@"candyTreespingOutAnimation"];
}
#pragma mark -
- (void)receiveGiftHandleSendGiftAnimation:(AttachmentModel *)attachment {
2021-12-25 18:34:54 +08:00
if (!self.delegate.getRoomInfo.hasAnimationEffect) {return;}
GiftReceiveInfoModel * receiveInfo = [GiftReceiveInfoModel modelWithJSON:attachment.data];
GiftInfoModel * giftInfo = receiveInfo.gift ? receiveInfo.gift : receiveInfo.giftInfo;
if (attachment.second == Custom_Message_Sub_AllMicroLuckySend || attachment.second == Custom_Message_Sub_AllBatchMicroLuckySend || attachment.second == Custom_Message_Sub_Gift_LuckySend) {
NSString * giftId = [NSString stringWithFormat:@"%ld", receiveInfo.luckyGiftList.giftList.firstObject.giftId];
giftInfo = [[XPGiftStorage shareStorage] findGiftInfo:giftId];
}
if (giftInfo == nil) {
giftInfo = [[XPGiftStorage shareStorage] findGiftInfo:receiveInfo.giftId];
}
/// 使
receiveInfo.gift = giftInfo;
receiveInfo.isLuckyBagGift = (attachment.second == Custom_Message_Sub_AllMicroLuckySend || attachment.second == Custom_Message_Sub_AllBatchMicroLuckySend || attachment.second == Custom_Message_Sub_Gift_LuckySend);
[self.giftQueue addObject:receiveInfo];
if (self.giftTimer == nil && self.giftQueue > 0) {
[self startGiftQueueTimer];
}
}
//
- (void)startGiftQueueTimer {
NSTimeInterval period = 0.5; //
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, period * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(_timer, ^{
dispatch_async(dispatch_get_main_queue(), ^{
if (self.giftQueue.count) {
GiftReceiveInfoModel * receiveInfo = self.giftQueue.firstObject;
[self handoutGiftDistributeAnimation:receiveInfo];
[self.giftQueue removeObject:receiveInfo];
}else {
dispatch_source_cancel(_timer);
self.giftTimer = nil;
}
});
});
dispatch_resume(_timer);
self.giftTimer = _timer;
}
///
- (void)handoutGiftDistributeAnimation:(GiftReceiveInfoModel *)receiveInfo {
GiftInfoModel * giftInfo = receiveInfo.gift;
NSString * sendUid = receiveInfo.uid;
CGPoint starPoint = [self getGiftAnimationPoint:sendUid isEnd:NO];
CGPoint endPoint;
if (receiveInfo.targetUids.count > 0) {
if (receiveInfo.isLuckyBagGift) {
NSString * targetUid = [NSString stringWithFormat:@"%ld", receiveInfo.luckyGiftList.user.uid];
endPoint = [self getGiftAnimationPoint:targetUid isEnd:YES];
dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC);
dispatch_after(timer, dispatch_get_main_queue(), ^{
[self beginGiftAnimation:giftInfo.giftUrl startPoint:starPoint endPoint:endPoint];
});
} else {
for (NSString *targetUid in receiveInfo.targetUids) {
endPoint = [self getGiftAnimationPoint:targetUid isEnd:YES];
dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC);
dispatch_after(timer, dispatch_get_main_queue(), ^{
[self beginGiftAnimation:giftInfo.giftUrl startPoint:starPoint endPoint:endPoint];
});
}
}
} else {
NSString * targetUid = receiveInfo.targetUid;
endPoint = [self getGiftAnimationPoint:targetUid isEnd:YES];
dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC);
dispatch_after(timer, dispatch_get_main_queue(), ^{
[self beginGiftAnimation:giftInfo.giftUrl startPoint:starPoint endPoint:endPoint];
});
}
}
///
- (CGPoint)getGiftAnimationPoint:(NSString *)uid isEnd:(BOOL)isEnd{
2022-01-13 18:45:17 +08:00
CGPoint point = [self.delegate animationPointAtStageViewByUid:uid];
//
if (point.x <= 0 || point.y <= 0) {
if (isEnd) {
point = CGPointMake([UIScreen mainScreen].bounds.size.width /2 + 30, 44);
} else {
point = CGPointMake([UIScreen mainScreen].bounds.size.width / 2, 44);
}
}
return point;
}
- (void)beginGiftAnimation:(NSString *)giftUrl startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint {
NetImageView * giftImageView = [self.giftReuseArray anyObject];
if (giftImageView == nil) {
giftImageView = [[NetImageView alloc]initWithFrame:CGRectMake(0, 0 , 55, 55)];
giftImageView.center = startPoint;
giftImageView.alpha = 1;
giftImageView.layer.anchorPoint = CGPointMake(0.5, 0.5);
giftImageView.imageUrl = giftUrl;
[self.giftVisibleArray addObject:giftImageView];
}else {
[self.giftReuseArray removeObject:giftImageView];
}
giftImageView.hidden = NO;
giftImageView.imageUrl = giftUrl;
[self.lowLevelView addSubview:giftImageView];
CAAnimationGroup *group = [self createGiftAnimationStartPoint:startPoint endPoint:endPoint];
[giftImageView.layer addAnimation:group forKey:@"giftDisplayViewAnimation"];
[self performSelector:@selector(aniationDidFinish:) withObject:giftImageView afterDelay:(3.2+0.25)];
}
///
/// @param startPoint
/// @param endPoint
- (CAAnimationGroup *)createGiftAnimationStartPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint{
CGPoint centerPoint = CGPointMake(KScreenWidth / 2, KScreenHeight / 2);
CAKeyframeAnimation *animation0 = [CAKeyframeAnimation animation];
animation0.duration = 0.8;
animation0.keyPath = @"transform.scale";
animation0.values = @[@1.0,@1.5,@2.0,@1.5];
animation0.repeatCount = 1;
animation0.calculationMode = kCAAnimationCubic;
animation0.removedOnCompletion = NO;
animation0.fillMode = kCAFillModeForwards;
CAKeyframeAnimation *animation1 = [CAKeyframeAnimation animation];
animation1.duration = 0.8;
animation1.beginTime = 0.8;
animation1.keyPath = @"transform.scale";
animation1.values = @[@1.5,@2.0,@2.5,@3.0];
animation1.repeatCount = 1;
animation1.calculationMode = kCAAnimationCubic;
animation1.removedOnCompletion = NO;
animation1.fillMode = kCAFillModeForwards;
CAKeyframeAnimation *animation2 = [CAKeyframeAnimation animation];
animation2.duration = 0.8;
animation2.beginTime = 0.8;
animation2.keyPath = @"position";
animation2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];;
animation2.values = @[[NSValue valueWithCGPoint:startPoint],[NSValue valueWithCGPoint:CGPointMake(centerPoint.x ,centerPoint.y)]];
animation2.repeatCount = 1;
animation2.removedOnCompletion = NO;
animation2.fillMode = kCAFillModeForwards;
CAKeyframeAnimation *animation3 = [CAKeyframeAnimation animation];
animation3.duration = 0.8;
animation3.beginTime = 2.6;//0.8+0.8+1
animation3.keyPath = @"transform.scale";
animation3.values = @[@3,@2.5,@2,@1.5,@1];
animation3.repeatCount = 1;
CAKeyframeAnimation *animation4 = [CAKeyframeAnimation animation];
animation4.duration = 0.8;
animation4.beginTime = 2.6;
animation4.keyPath = @"position";
animation4.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
animation4.values = @[[NSValue valueWithCGPoint:CGPointMake(centerPoint.x ,centerPoint.y)],[NSValue valueWithCGPoint:endPoint]];
animation4.repeatCount = 1;
CAAnimationGroup *group = [CAAnimationGroup animation];
group.duration = 3.2;
group.animations = @[animation0,animation1,animation2, animation3,animation4];
group.repeatCount = 1;
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
return group;
}
- (void)aniationDidFinish:(NetImageView *)giftImageView{
[giftImageView removeFromSuperview];
giftImageView.image = nil;
giftImageView.hidden = YES;
[self.giftVisibleArray removeObject:giftImageView];
[self.giftReuseArray addObject:giftImageView];
}
#pragma mark -
- (void)receiveBroadcastGift:(AttachmentModel *)attachment {
XPRoomGiftBroadCastModel *giftNotifyInfo = [XPRoomGiftBroadCastModel modelWithJSON:attachment.data];
if (self.giftBroadcastQueue.count == 0) {
[self createGiftBroadcastViewAnimation:giftNotifyInfo];
}
[self.giftBroadcastQueue addObject:giftNotifyInfo];
}
- (void)createGiftBroadcastViewAnimation:(XPRoomGiftBroadCastModel *)giftModel {
XPRoomGiftBroadcastView * view = [[XPRoomGiftBroadcastView alloc] init];
view.delegate = self;
view.frame = CGRectMake(KScreenWidth, 35 + statusbarHeight, KScreenWidth, 150);
view.broadcastModel = giftModel;
[self.highLevleView addSubview:view];
[self beginGiftBraodcastViewAnimation:view notifyStaySecond:giftModel.notifyStaySecond];
}
- (void)beginGiftBraodcastViewAnimation:(XPRoomGiftBroadcastView *)view notifyStaySecond:(int)notifyStaySecond{
CGFloat startTime = notifyStaySecond > 0 ? notifyStaySecond : 3.0;
POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
springAnimation.springSpeed = 12;
springAnimation.springBounciness = 10.f;
springAnimation.fromValue = [NSValue valueWithCGPoint:view.center];
springAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(0 + view.frame.size.width / 2, view.center.y)];
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
if (finished) {
[self removeGiftBroadcastOutAnimation:view stayTime:startTime];
}
}];
[view pop_addAnimation:springAnimation forKey:@"spingOutAnimation"];
}
- (void)removeGiftBroadcastOutAnimation:(XPRoomGiftBroadcastView *)view stayTime:(CGFloat)stayTime{
POPBasicAnimation *moveAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];
moveAnimation.fromValue = [NSValue valueWithCGPoint:view.center];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(-KScreenWidth/2, view.center.y)];
moveAnimation.beginTime = CACurrentMediaTime() + stayTime;
moveAnimation.duration = 0.5;
moveAnimation.repeatCount = 1;
moveAnimation.removedOnCompletion = YES;
@kWeakify(self);
[moveAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
@kStrongify(self);
if (finished) {
[view removeFromSuperview];
[self.giftBroadcastQueue removeObjectAtIndex:0];
if (self.giftBroadcastQueue.count > 0) {
[self createGiftBroadcastViewAnimation:self.giftBroadcastQueue.firstObject];
}
}
}];
[view pop_addAnimation:moveAnimation forKey:@"moveOutAnimation"];
}
#pragma mark - XPRoomGiftBroadcastViewDelegate
- (void)xPRoomGiftBroadcastView:(XPRoomGiftBroadcastView *)view enterRoom:(NSString *)roomUid {
//TODO: 退
}
- (void)xPRoomGiftBroadcastView:(XPRoomGiftBroadcastView *)view didClickClose:(XPRoomGiftBroadCastModel *)broadcastModel {
[view removeFromSuperview];
[view pop_removeAllAnimations];
if ([self.giftBroadcastQueue containsObject:broadcastModel]) {
[self.giftBroadcastQueue removeObject:broadcastModel];
}
if (self.giftBroadcastQueue.count > 0) {
[self createGiftBroadcastViewAnimation:self.giftBroadcastQueue.firstObject];
}
}
#pragma mark -
- (void)receiveLuckyGiftBigPrize:(AttachmentModel *)attachment {
if (attachment.second == Custom_Message_Sub_Room_Gift_LuckBag || attachment.second == Custom_Message_Sub_Room_Gift_LuckBag_Server) {
XPGiftBigPrizeModel * prizeModel = [[XPGiftBigPrizeModel alloc] init];
prizeModel.giftName = attachment.data[@"giftName"];
prizeModel.luckyBagName = attachment.data[@"luckyBagName"];
prizeModel.nick = attachment.data[@"nick"];
[self.bigPrizeGiftQueue addObject:prizeModel];
if (self.luckyprizeTimer == nil) {
[self startHandleBigPrizeGiftTimer];
}
}
}
- (void)startHandleBigPrizeGiftTimer {
NSTimeInterval period = 1.0; //
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //
@kWeakify(self);
dispatch_source_set_event_handler(_timer, ^{
@kStrongify(self)
if (self.bigPrizeGiftQueue.count > 0) {
dispatch_sync(dispatch_get_main_queue(), ^{
XPGiftBigPrizeModel * prizeModel = [self.bigPrizeGiftQueue firstObject];
[self createBigPrizeAnimation:prizeModel];
[self.bigPrizeGiftQueue removeObject:prizeModel];
});
}else {
dispatch_source_cancel(_timer);
self.luckyprizeTimer = nil;
}
});
dispatch_resume(_timer);
self.luckyprizeTimer = _timer;
}
- (void)createBigPrizeAnimation:(XPGiftBigPrizeModel *)prizeModel {
NSAttributedString *text = [self createBigPrizeAttribute:prizeModel];
UIImageView *luckyBgView = [[UIImageView alloc] initWithFrame:CGRectMake(KScreenWidth, kNavigationHeight + 15, KScreenWidth, 45)];
luckyBgView.contentMode = UIViewContentModeScaleAspectFill;
luckyBgView.image= [UIImage imageNamed:@"room_lucky_gift_big_prize_bg"];
UILabel *contentLabel = [[UILabel alloc] initWithFrame:CGRectMake(90, 0, KScreenWidth - 160, 45)];
contentLabel.attributedText = text;
contentLabel.textAlignment = NSTextAlignmentCenter;
contentLabel.numberOfLines = 2;
[luckyBgView addSubview:contentLabel];
[self.lowLevelView addSubview:luckyBgView];
[UIView animateWithDuration:0.5 animations:^{
luckyBgView.frame = CGRectMake(0, kNavigationHeight + 15, KScreenWidth, 45);
} completion:^(BOOL finished) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.5 animations:^{
luckyBgView.hidden = YES;
} completion:^(BOOL finished) {
[luckyBgView removeFromSuperview];
}];
});
}];
}
- (NSAttributedString *)createBigPrizeAttribute:(XPGiftBigPrizeModel *)prizModel {
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];
[attributedString appendAttributedString:
[self createTextAttribute:@"哇偶 ! "
color:[ThemeColor messageViewTipColor] font:12]];
[attributedString appendAttributedString:
[self createTextAttribute:prizModel.nick
color:[ThemeColor messageNickColor] font:12]];
[attributedString appendAttributedString:
[self createTextAttribute:@"通过"
color:[ThemeColor messageViewTipColor] font:12]];
[attributedString appendAttributedString:
[self createTextAttribute:prizModel.luckyBagName
color:[ThemeColor messageNickColor] font:12]];
[attributedString appendAttributedString:
[self createTextAttribute:@"开出了"
color:[ThemeColor messageNickColor] font:12]];
[attributedString appendAttributedString:
[self createTextAttribute:prizModel.giftName color:[ThemeColor messageNickColor] font:12]];
return attributedString;
}
///
/// @param text
/// @param color
/// @param font
- (NSMutableAttributedString *)createTextAttribute:(NSString *)text color:(UIColor *)color font:(CGFloat)font {
if (text == nil || text.length <= 0) {
text = @"";
}
NSDictionary * dic = @{NSFontAttributeName:[UIFont systemFontOfSize:12], NSForegroundColorAttributeName:color};
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:text attributes:dic];
return attribute;
}
#pragma mark -
///
- (void)receiveGift:(GiftReceiveInfoModel *)receiveInfo {
///CPU
RoomInfoModel * roomInfor = [self.delegate getRoomInfo];
if (receiveInfo.isLuckyBagGift) {
// SVGA
if (receiveInfo.displayGift.count > 0) {
[receiveInfo.displayGift enumerateObjectsUsingBlock:^(GiftInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.hasVggPic && roomInfor.hasAnimationEffect) {
GiftReceiveInfoModel * model = [[GiftReceiveInfoModel alloc] init];
model.vggUrl = obj.vggUrl;
[self.giftEffectQueue addObject:model];
}
}];
}
} else {
GiftInfoModel *giftInfo = receiveInfo.gift != nil ? receiveInfo.gift : receiveInfo.giftInfo;
if (!giftInfo) {
giftInfo = [[XPGiftStorage shareStorage] findGiftInfo: receiveInfo.giftId];
}
///
if (giftInfo) {
receiveInfo.gift = giftInfo;
}
if (receiveInfo.targetUsers.count > 0 && receiveInfo.targetUids.count <= 0) {
receiveInfo.targetUids = [receiveInfo.targetUsers valueForKeyPath:@"uid"];
}
NSInteger giftTotal = 0;
if (receiveInfo.targetUids.count > 0) {
giftTotal = receiveInfo.giftNum * giftInfo.goldPrice * receiveInfo.targetUids.count;
} else {
giftTotal = receiveInfo.giftNum * giftInfo.goldPrice;
}
///
if (giftTotal >= 520) {
///
[self.giftEffectQueue addObject:receiveInfo];
} else {
///SVGA
if (giftInfo.hasVggPic && roomInfor.hasAnimationEffect) {
receiveInfo.vggUrl = giftInfo.vggUrl;
[self.giftEffectQueue addObject:receiveInfo];
}
}
}
if (self.giftEffectTimer == nil && self.giftEffectQueue.count > 0) {
[self startHandleGiftEffectTimer];
}
}
///
- (void)startHandleGiftEffectTimer {
NSTimeInterval period = 6.0; // 6 1svga 2.svga 3
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //
@kWeakify(self);
dispatch_source_set_event_handler(_timer, ^{
@kStrongify(self)
if (self.giftEffectQueue.count > 0) {
dispatch_sync(dispatch_get_main_queue(), ^{
GiftReceiveInfoModel * receiveModel = [self.giftEffectQueue firstObject];
[self createGiftBannerViewAnimation:receiveModel];
[self.giftEffectQueue removeObject:receiveModel];
});
}else {
dispatch_source_cancel(_timer);
self.giftEffectTimer = nil;
}
});
dispatch_resume(_timer);
self.giftEffectTimer = _timer;
}
- (void)createGiftBannerViewAnimation:(GiftReceiveInfoModel *)receiveInfo {
GiftInfoModel *giftInfo = receiveInfo.gift != nil ? receiveInfo.gift : receiveInfo.giftInfo;
if (!giftInfo) {
giftInfo = [[XPGiftStorage shareStorage] findGiftInfo: receiveInfo.giftId];
}
NSInteger giftTotal = 0;
if (receiveInfo.targetUids.count > 0) {
giftTotal = receiveInfo.giftNum * giftInfo.goldPrice * receiveInfo.targetUids.count;
} else {
giftTotal = receiveInfo.giftNum * giftInfo.goldPrice;
}
if (giftTotal >= 520) {
__block XPRoomGiftBannerView *view = [self.bannerDequePool anyObject];
if (view == nil) {
view = [[XPRoomGiftBannerView alloc] init];
[self.bannerVisiablePool addObject:view];
}else{
[self.bannerDequePool removeObject:view];
}
[self removeGiftBannerView:view];
[view configGiftBanner:receiveInfo users:[self makeBannerUsers]];
view.frame = CGRectMake(KScreenWidth, 100, KScreenWidth, 153);
[self.lowLevelView addSubview:view];
POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];
springAnimation.springSpeed = 12;
springAnimation.springBounciness = 10.f;
springAnimation.fromValue = [NSValue valueWithCGPoint:view.center];
springAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(view.frame.size.width / 2, view.center.y)];
@kWeakify(self);
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
@kStrongify(self);
if (finished) {
[self removeAnimation:view];
}
}];
[springAnimation setAnimationDidStartBlock:^(POPAnimation *anim) {
@kStrongify(self);
if (giftInfo.hasVggPic && [self.delegate getRoomInfo].hasAnimationEffect) {
[self playGiftEffect:giftInfo.vggUrl];
}
}];
[view pop_addAnimation:springAnimation forKey:@"spingOutAnimation"];
} else {
if (receiveInfo.vggUrl.length > 0) {///
[self playGiftEffect:receiveInfo.vggUrl];
}
}
}
//
- (void)removeAnimation:(XPRoomGiftBannerView *)view{
POPBasicAnimation *moveAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];
moveAnimation.fromValue = [NSValue valueWithCGPoint:view.center];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(view.center.x - KScreenWidth, view.center.y)];
moveAnimation.beginTime = CACurrentMediaTime() +5;
moveAnimation.duration = 0.5;
moveAnimation.repeatCount = 1;
moveAnimation.removedOnCompletion = YES;
[view pop_addAnimation:moveAnimation forKey:@"moveOutAnimation"];
}
- (NSArray<XPGiftBannerUserInfoModel *> *)makeBannerUsers {
NSArray<MicroQueueModel *> * microArray = [self.delegate getMicroQueue].allValues;
NSMutableArray * array = [NSMutableArray array];
[microArray enumerateObjectsUsingBlock:^(MicroQueueModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
XPGiftBannerUserInfoModel * bannserUser = [[XPGiftBannerUserInfoModel alloc] init];
bannserUser.position = obj.microState.position;
bannserUser.uid = obj.userInfo.uid;
[array addObject:bannserUser];
}];
return array;
}
/// SVGA
- (void)playGiftEffect:(NSString *)vggUrl {
self.giftEffectView.hidden = NO;
if (self.giftEffectView.superview == nil) {
[self.middleLevelView addSubview:self.giftEffectView];
[self.giftEffectView mas_makeConstraints:^(MASConstraintMaker *make) {
2021-12-16 20:22:01 +08:00
make.center.mas_equalTo(self.middleLevelView);
make.width.mas_equalTo(KScreenWidth);
make.height.mas_equalTo(KScreenHeight);
}];
}
[self.parser parseWithURL:[NSURL URLWithString:vggUrl] completionBlock:^(SVGAVideoEntity * _Nullable videoItem) {
if (videoItem != nil) {
CGFloat width = videoItem.videoSize.width;
CGFloat height = videoItem.videoSize.height;
if (width > height) {
self.giftEffectView.contentMode = UIViewContentModeScaleAspectFit;
} else {//
CGFloat resizeH = KScreenWidth * height / width;//
if (resizeH > KScreenHeight) {//
self.giftEffectView.contentMode = UIViewContentModeScaleAspectFill;
} else {//
self.giftEffectView.contentMode = UIViewContentModeScaleAspectFit;
}
}
self.giftEffectView.alpha = 1;
self.giftEffectView.loops = 1;
self.giftEffectView.clearsAfterStop = YES;
self.giftEffectView.videoItem = videoItem;
[self.giftEffectView startAnimation];
}
} failureBlock:^(NSError * _Nullable error) {
}];
}
///veiw
- (void)removeGiftBannerView:(XPRoomGiftBannerView *)view {
[view removeFromSuperview];
[view resetData];
[self.bannerVisiablePool removeObject:view];
[self.bannerDequePool addObject:view];
///svga
[self.giftEffectView stopAnimation];
self.giftEffectView.hidden = YES;
}
#pragma mark -
- (void)svgaPlayerDidFinishedAnimation:(SVGAPlayer *)player {
if (player == self.giftEffectView) {
self.giftEffectView.hidden = YES;
2021-12-17 15:18:34 +08:00
} else if(player == self.carEffectView) {
self.carEffectView.hidden = YES;
[self.carEffectView removeFromSuperview];
[self.carEffectQueue removeObjectAtIndex:0];
2021-12-16 20:22:01 +08:00
if (self.carEffectQueue.count > 0) {
[self playCarEffect:self.carEffectQueue.firstObject];
2021-12-17 15:18:34 +08:00
}
} else if(player == self.enterEffectView) {
self.enterEffectView.hidden = YES;
[self.enterEffectView removeFromSuperview];
[self.enterEffectQueue removeObjectAtIndex:0];
if (self.enterEffectQueue.count > 0) {
NSString * title = [self.enterEffectQueue.firstObject objectForKey:@"title"];
NSInteger experLevelSeq = [(NSString *)[self.enterEffectQueue.firstObject objectForKey:@"experLevelSeq"] integerValue];
[self playUserEnterRoomAnimation:title experLevelSeq:experLevelSeq];
2021-12-16 20:22:01 +08:00
}
}
}
#pragma mark - Getters And Setters
- (SVGAImageView *)giftEffectView {
if (!_giftEffectView) {
_giftEffectView = [[SVGAImageView alloc]init];
_giftEffectView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
_giftEffectView.userInteractionEnabled = NO;
_giftEffectView.delegate = self;
_giftEffectView.hidden = YES;
}
return _giftEffectView;
}
- (SVGAParser *)parser {
if (!_parser) {
_parser = [[SVGAParser alloc]init];
}
return _parser;
}
- (NSMutableArray<GiftReceiveInfoModel *> *)giftEffectQueue {
if (!_giftEffectQueue) {
_giftEffectQueue = [NSMutableArray array];
}
return _giftEffectQueue;
}
- (NSMutableArray<XPGiftBigPrizeModel *> *)bigPrizeGiftQueue {
if (!_bigPrizeGiftQueue) {
_bigPrizeGiftQueue = [NSMutableArray array];
}
return _bigPrizeGiftQueue;
}
- (NSMutableArray<XPRoomGiftBroadCastModel *> *)giftBroadcastQueue {
if (!_giftBroadcastQueue) {
_giftBroadcastQueue = [NSMutableArray array];
}
return _giftBroadcastQueue;
}
- (NSMutableSet *)bannerDequePool {
if (!_bannerDequePool) {
_bannerDequePool = [NSMutableSet set];
}
return _bannerDequePool;
}
- (NSMutableSet *)bannerVisiablePool {
if (!_bannerVisiablePool) {
_bannerVisiablePool = [NSMutableSet set];
}
return _bannerVisiablePool;
}
- (XPRoomAnimationHitView *)lowLevelView {
if (!_lowLevelView) {
_lowLevelView = [[XPRoomAnimationHitView alloc] init];
_lowLevelView.backgroundColor = [UIColor clearColor];
_lowLevelView.userInteractionEnabled = YES;
}
return _lowLevelView;
}
- (XPRoomAnimationHitView *)middleLevelView {
if (!_middleLevelView) {
_middleLevelView = [[XPRoomAnimationHitView alloc] init];
_middleLevelView.backgroundColor = [UIColor clearColor];
_middleLevelView.userInteractionEnabled = YES;
}
return _middleLevelView;
}
- (XPRoomAnimationHitView *)highLevleView {
if (!_highLevleView) {
_highLevleView = [[XPRoomAnimationHitView alloc] init];
_highLevleView.backgroundColor = [UIColor clearColor];
_highLevleView.userInteractionEnabled = YES;
}
return _highLevleView;
}
- (NSMutableArray<GiftReceiveInfoModel *> *)giftQueue {
if (!_giftQueue) {
_giftQueue = [NSMutableArray array];
}
return _giftQueue;
}
- (NSMutableSet<NetImageView *> *)giftReuseArray {
if (!_giftReuseArray) {
_giftReuseArray = [NSMutableSet set];
}
return _giftReuseArray;
}
- (NSMutableSet<NetImageView *> *)giftVisibleArray {
if (!_giftVisibleArray) {
_giftVisibleArray = [NSMutableSet set];
}
return _giftVisibleArray;
}
- (NSMutableArray *)candyTreegiftQueue {
if (!_candyTreegiftQueue) {
_candyTreegiftQueue = [NSMutableArray array];
}
return _candyTreegiftQueue;
}
- (NSMutableArray *)nobleLevelUpQueue {
if (!_nobleLevelUpQueue) {
_nobleLevelUpQueue = [NSMutableArray array];
}
return _nobleLevelUpQueue;
}
2021-12-16 20:22:01 +08:00
- (NSMutableArray<NSString *> *)carEffectQueue {
if (_carEffectQueue == nil) {
_carEffectQueue = [NSMutableArray array];
}
return _carEffectQueue;
}
- (SVGAImageView *)carEffectView {
if (_carEffectView == nil) {
_carEffectView = [[SVGAImageView alloc]init];
_carEffectView.delegate = self;
_carEffectView.contentMode = UIViewContentModeScaleAspectFit;
_carEffectView.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
_carEffectView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.3];
_carEffectView.alpha = 0;
_carEffectView.userInteractionEnabled = NO;
}
return _carEffectView;
}
2021-12-17 15:18:34 +08:00
- (NSMutableArray<NSDictionary *> *)enterEffectQueue {
if (_enterEffectQueue == nil) {
_enterEffectQueue = [NSMutableArray array];
}
return _enterEffectQueue;
}
- (SVGAImageView *)enterEffectView {
if (_enterEffectView == nil) {
_enterEffectView = [[SVGAImageView alloc]init];
_enterEffectView.delegate = self;
_enterEffectView.contentMode = UIViewContentModeScaleAspectFit;
_enterEffectView.frame = CGRectMake(0, 0, KScreenWidth, 40);
_enterEffectView.backgroundColor = [UIColor clearColor];
_enterEffectView.alpha = 0;
_enterEffectView.userInteractionEnabled = NO;
}
return _enterEffectView;
}
2022-01-05 21:48:21 +08:00
- (SVGAImageView *)datingEffectView {
if (_datingEffectView == nil) {
_datingEffectView = [[SVGAImageView alloc]init];
_datingEffectView.delegate = self;
_datingEffectView.contentMode = UIViewContentModeScaleAspectFit;
_datingEffectView.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
_datingEffectView.backgroundColor = [UIColor clearColor];
_datingEffectView.alpha = 0;
_datingEffectView.userInteractionEnabled = NO;
}
return _datingEffectView;
}
@end