ios 利用粒子動(dòng)畫實(shí)現(xiàn)今天頭像點(diǎn)贊效果

image.png

CAEmitterLayer 是一個(gè)高性能的粒子引擎始赎,被用來(lái)創(chuàng)建復(fù)雜的粒子動(dòng)畫如:煙霧,火,雨等效果钓试,并且很好地控制了性能。

蘋果給出的解釋是:

CAEmitterLayer 看上去像是許多 CAEmitterCell 的容器副瀑,這些 CAEmitterCell 定義了一個(gè)例子效果弓熏。你將會(huì)為不同的例子效果定義一個(gè)或多個(gè) CAEmitterCell 作為模版,同時(shí) CAEmitterLayer 負(fù)責(zé)基于這些模版實(shí)例化一個(gè)粒子流糠睡。一個(gè) CAEmitterCell 類似于一個(gè) CALayer :它有一個(gè) contents 屬性可以定義為一個(gè) CGImage 挽鞠,另外還有一些可設(shè)置屬性控制著表現(xiàn)和行為。

以上解釋來(lái)源于網(wǎng)絡(luò)

首先提醒CAEmitterLayer本身沒(méi)有什么難度,主要在于兩點(diǎn):

  • 屬性較多(一會(huì)會(huì)把屬性都列舉出來(lái)信认,不知道了隨時(shí)查閱就是)
  • 調(diào)參數(shù)比較費(fèi)時(shí)(想要有好的動(dòng)畫效果還得慢慢的去調(diào)整各項(xiàng)參數(shù)材义,不過(guò)沒(méi)有難度就是有點(diǎn)費(fèi)時(shí)間)
下面先認(rèn)識(shí)一下CAEmitterLayer的屬性
/* The center of the emission shape. Defaults to (0, 0, 0). Animatable. */
發(fā)射源位置。注意嫁赏,是一個(gè)空間坐標(biāo)其掂。并且標(biāo)記為 Animatable. 也就是說(shuō)可以用 CoreAnimation 移動(dòng)發(fā)射源位置
@property CGPoint emitterPosition;
@property CGFloat emitterZPosition;

“/* The size of the emission shape. Defaults to (0, 0, 0). Animatable.
 * Depending on the `emitterShape' property some of the values may be
 * ignored. */
發(fā)射源大小。注意除了寬和高之外潦蝇,還有縱向深度款熬。
文檔中還提到,這兩個(gè)屬性有時(shí)候可能會(huì)因?yàn)樵O(shè)置了 emitterShape 而被忽略攘乒,具體情況實(shí)際嘗試一下就可以了贤牛。
@property CGSize emitterSize;
@property CGFloat emitterDepth;

“/* A string defining the type of emission shape used. Current options are:
 * `point' (the default), `line', `rectangle', `circle', `cuboid' and
 * `sphere'. */
  
CA_EXTERN NSString * const kCAEmitterLayerPoint
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerLine
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerRectangle
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerCuboid
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerCircle
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerSphere
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);

 emitterShape 決定了發(fā)射源的形狀。
@property(copy) NSString *emitterShape;
 
/* A string defining how particles are created relative to the emission
 * shape. Current options are `points', `outline', `surface' and
 * `volume' (the default). */
 

   
CA_EXTERN NSString * const kCAEmitterLayerPoints
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerOutline
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerSurface
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);
CA_EXTERN NSString * const kCAEmitterLayerVolume
    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_5_0);

 emitterMode 決定了發(fā)射源的發(fā)射模式持灰。
@property(copy) NSString *emitterMode;

平常用的多的比如 emitterShape 的 kCAEmitterLayerLine 和 kCAEmitterLayerPoint盔夜。這兩個(gè)從視覺(jué)上還是比較好區(qū)分的,這決定了你的粒子是從一個(gè)點(diǎn)「噴」出來(lái)的堤魁,還是從一條線上每個(gè)點(diǎn)「噴」下來(lái)喂链,前者像焰火,后者像瀑布妥泉。顯然椭微,下雪的效果更像后者。

emitterMode 的 kCAEmitterLayerOutline 表示向外圍擴(kuò)散盲链,如果你的發(fā)射源形狀是 circle蝇率,那么 kCAEmitterLayerOutline 就會(huì)以一個(gè)圓的方式向外擴(kuò)散開(kāi)。

又比如你想表達(dá)一股蒸汽向上噴的效果刽沾,就可以設(shè)置 emitterShape 為 kCAEmitterLayerLine 本慕, emitterMode 為 kCAEmitterLayerOutline。

CAEmitterCell的屬性

其實(shí)CAEmitterCell真是的名字叫粒子侧漓,下面詳細(xì)的介紹了CAEmitterCell的屬性锅尘,只要求大家屬性一下,以后用到了可以再來(lái)查閱布蔗。

@property float birthRate; //每秒生成多少個(gè)粒子
 
@property float lifetime; //粒子存活的時(shí)間,以秒為單位
@property float lifetimeRange; // 可以為這個(gè)粒子存活的時(shí)間再指定一個(gè)范圍藤违。
上面兩個(gè)屬性如果只用了lifetime那么粒子的存活時(shí)間就是固定的,比如lifetime=10,那么粒子10s秒后就消失了纵揍。
如果使用了lifetimeRange顿乒,比如lifetimeRange=5,那么粒子的存活時(shí)間就是在5s~15s這個(gè)范圍內(nèi)消失泽谨。
 
@property CGFloat velocity;//粒子平均初始速度璧榄。正數(shù)表示豎直向上特漩,負(fù)數(shù)豎直向下。
@property CGFloat velocityRange; //可以再指定一個(gè)范圍犹菱。
上面兩個(gè)屬性同lifetime和lifetimeRange
 
@property CGFloat xAcceleration;
@property CGFloat yAcceleration;
@property CGFloat zAcceleration; //三者構(gòu)成了一個(gè)空間矢量拾稳。決定了每個(gè)方向上粒子的加速度吮炕。
 
@property CGFloat emissionRange; //以錐形分布開(kāi)的發(fā)射角度腊脱。角度用弧度制。粒子均勻分布在這個(gè)錐形范圍內(nèi)龙亲。
 
@property CGFloat spin;//粒子的平均旋轉(zhuǎn)速度
@property CGFloat spinRange; //可指定一個(gè)范圍陕凹。弧度制鳄炉。
 
@property(strong) id contents; //cell的內(nèi)容杜耙。通常是一個(gè)指針CGImageRef。
 
@property CGColorRef color; //可以把圖片「染」成你想要的顏色拂盯。

@property(copy) NSString *name; //The name of the cell佑女,用于構(gòu)建key paths。這也是后面手動(dòng)控制動(dòng)畫開(kāi)始和結(jié)束的關(guān)鍵谈竿。

好团驱,上面簡(jiǎn)單介紹了一下CAEmitterLayer和CAEmitterCell的一些基本屬性,下面來(lái)利用粒子動(dòng)畫實(shí)現(xiàn)一個(gè)類似今日頭條點(diǎn)贊效果空凸。

#import <UIKit/UIKit.h>

@interface GXUpvoteButton : UIButton

@end
#import "GXUpvoteButton.h"

@interface GXUpvoteButton()

/**
 展示的layer
 */
@property (strong, nonatomic) CAEmitterLayer *streamerLayer;

/**
 圖片數(shù)組
 */
@property (nonatomic, strong) NSMutableArray *imagesArr;

/**
 cell的數(shù)組
 */
@property (nonatomic, strong) NSMutableArray *CAEmitterCellArr;

/**
 展示多少個(gè)贊的label
 */
@property (nonatomic, strong) UILabel *zanLabel;

@end



@implementation GXUpvoteButton

{
    NSTimer *_timer; //定時(shí)器
    NSInteger countNum;//贊的個(gè)數(shù)
}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        [self setup];
    }
    return self;
}

/**
 *  配置WclEmitterButton
 */
- (void)setup {
    //初始化 贊的個(gè)數(shù)
    countNum = 1;
    
    //展示多少個(gè)贊的label
    self.zanLabel = [[UILabel alloc]init];
    [self addSubview:self.zanLabel];
    self.zanLabel.frame = CGRectMake(-50 ,- 100, 200, 40);
    self.zanLabel.hidden = YES;
    
    //添加點(diǎn)擊事件
    //點(diǎn)一下
    [self addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(pressOnece:)]];
    //長(zhǎng)按
    [self addGestureRecognizer:[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)]];
    
    [self setImage:[UIImage imageNamed:@"feed_like"] forState:UIControlStateNormal];
    [self setImage:[UIImage imageNamed:@"feed_like_press"] forState:UIControlStateSelected];
    
    //設(shè)置暫時(shí)的layer
    _streamerLayer               = [CAEmitterLayer layer];
    _streamerLayer.emitterSize   = CGSizeMake(30, 30);
    _streamerLayer.masksToBounds = NO;
    _streamerLayer.renderMode = kCAEmitterLayerAdditive;
    [self.layer addSublayer:_streamerLayer];
}


/**
 點(diǎn)了一下

 @param ges 手勢(shì)
 */
- (void)pressOnece:(UIGestureRecognizer *)ges
{
    UIButton * sender = (UIButton *)ges.view;
    sender.selected = !sender.selected;
    [self animation];
    [self performSelector:@selector(explode) withObject:nil afterDelay:0.1];
    if (sender.selected == NO) {
        //重置label文字
        countNum = 0;
        [self changeText];
        //清空數(shù)組
        [self.imagesArr removeAllObjects];
        [self.CAEmitterCellArr removeAllObjects];
    }
}


/**
 長(zhǎng)按

 @param ges 手勢(shì)
 */
- (void)longPress:(UIGestureRecognizer *)ges
{
    UIButton * sender = (UIButton *)ges.view;
    sender.selected = YES;
    if (ges.state == UIGestureRecognizerStateBegan) {
        [self animation];
    }else if (ges.state == UIGestureRecognizerStateEnded)
    {
        [self explode];
    }
}

/**
 *  開(kāi)始動(dòng)畫
 */
- (void)animation {
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    if (self.selected) {
        animation.values = @[@1.5 ,@0.8, @1.0,@1.2,@1.0];
        animation.duration = 0.5;
        [self startAnimate];
    }else
    {
        animation.values = @[@0.8, @1.0];
        animation.duration = 0.4;
    }
    animation.calculationMode = kCAAnimationCubic;
    [self.layer addAnimation:animation forKey:@"transform.scale"];
}

/**
 *  開(kāi)始噴射
 */
- (void)startAnimate {
    
    for (int i = 1; i < 10; i++)
    {
        //78張圖片 隨機(jī)選9張
        int x = arc4random() % 77 + 1;
        NSString * imageStr = [NSString stringWithFormat:@"emoji_%d",x];
        [self.imagesArr addObject:imageStr];
    }
    
    //設(shè)置展示的cell
    for (NSString * imageStr in self.imagesArr) {
        CAEmitterCell * cell = [self emitterCell:[UIImage imageNamed:imageStr] Name:imageStr];
        [self.CAEmitterCellArr addObject:cell];
    }
    _streamerLayer.emitterCells  = self.CAEmitterCellArr;
    
    
    // 開(kāi)啟計(jì)時(shí)器 設(shè)置點(diǎn)贊次數(shù)的label
    self.zanLabel.hidden = NO;
    _timer = [NSTimer scheduledTimerWithTimeInterval:0.15 target:self selector:@selector(changeText) userInfo:nil repeats:YES];
    
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    animation.values = @[@0.8, @1.0];
    animation.duration = 0.4;
    [self.zanLabel.layer addAnimation:animation forKey:@"transform.scale"];
    
    //_streamerLayer開(kāi)始時(shí)間
    _streamerLayer.beginTime = CACurrentMediaTime();
    for (NSString * imgStr in self.imagesArr) {
        NSString * keyPathStr = [NSString stringWithFormat:@"emitterCells.%@.birthRate",imgStr];
        [_streamerLayer setValue:@7 forKeyPath:keyPathStr];
    }
    
}


/**
 *  停止噴射
 */
- (void)explode {
    //讓chareLayer每秒噴射的個(gè)數(shù)為0個(gè)
    for (NSString * imgStr in self.imagesArr) {
        NSString * keyPathStr = [NSString stringWithFormat:@"emitterCells.%@.birthRate",imgStr];
        [self.streamerLayer setValue:@0 forKeyPath:keyPathStr];
    }
    _zanLabel.hidden = YES;
    [_timer invalidate];
    _timer = nil;
}



/**
 更改點(diǎn)贊個(gè)數(shù)label的文字
 */
- (void)changeText
{
    countNum ++;
    self.zanLabel.attributedText = [self getAttributedString:countNum];
    self.zanLabel.textAlignment = NSTextAlignmentCenter;
}


/**
 富文本設(shè)置label的圖片內(nèi)容
 
 @param num 當(dāng)前贊的個(gè)數(shù)
 @return 要顯示的富文本
 */
- (NSMutableAttributedString *)getAttributedString:(NSInteger)num
{
    //先把num 拆成個(gè)十百
    NSInteger ge = num % 10;
    NSInteger shi = num % 100 / 10;
    NSInteger bai = num % 1000 / 100;
    
    //大于1000則隱藏
    if (num >= 1000) {
        return nil;
    }
    
    
    NSMutableAttributedString * mutStr = [[NSMutableAttributedString alloc]init];
    
    //創(chuàng)建百位顯示的圖片
    if (bai != 0) {
        NSTextAttachment *b_attch = [[NSTextAttachment alloc] init];
        b_attch.image = [UIImage imageNamed:[NSString stringWithFormat:@"multi_digg_num_%ld",bai]];
        b_attch.bounds = CGRectMake(0, 0, b_attch.image.size.width, b_attch.image.size.height);
        NSAttributedString *b_string = [NSAttributedString attributedStringWithAttachment:b_attch];
        [mutStr appendAttributedString:b_string];
    }
    
    //創(chuàng)建十位顯示的圖片
    if (!(shi == 0 && bai == 0)) {
        NSTextAttachment *s_attch = [[NSTextAttachment alloc] init];
        s_attch.image = [UIImage imageNamed:[NSString stringWithFormat:@"multi_digg_num_%ld",shi ]];
        s_attch.bounds = CGRectMake(0, 0, s_attch.image.size.width, s_attch.image.size.height);
        NSAttributedString *s_string = [NSAttributedString attributedStringWithAttachment:s_attch];
        [mutStr appendAttributedString:s_string];
    }
    
    //創(chuàng)建個(gè)位顯示的圖片
    if (ge >= 0) {
        NSTextAttachment *g_attch = [[NSTextAttachment alloc] init];
        g_attch.image = [UIImage imageNamed:[NSString stringWithFormat:@"multi_digg_num_%ld",ge]];
        g_attch.bounds = CGRectMake(0, 0, g_attch.image.size.width, g_attch.image.size.height);
        NSAttributedString *g_string = [NSAttributedString attributedStringWithAttachment:g_attch];
        [mutStr appendAttributedString:g_string];
    }
    
    if (num <= 3) {
        //鼓勵(lì)
        NSTextAttachment *attch = [[NSTextAttachment alloc] init];
        attch.image = [UIImage imageNamed:@"multi_digg_word_level_1"];
        attch.bounds = CGRectMake(0, 0, attch.image.size.width, attch.image.size.height);
        NSAttributedString *z_string = [NSAttributedString attributedStringWithAttachment:attch];
        [mutStr appendAttributedString:z_string];
    }else if (num <= 6)
    {
        //加油
        NSTextAttachment *attch = [[NSTextAttachment alloc] init];
        attch.image = [UIImage imageNamed:@"multi_digg_word_level_2"];
        attch.bounds = CGRectMake(0, 0, attch.image.size.width, attch.image.size.height);
        NSAttributedString *z_string = [NSAttributedString attributedStringWithAttachment:attch];
        [mutStr appendAttributedString:z_string];
    }else
    {
        //太棒了
        NSTextAttachment *attch = [[NSTextAttachment alloc] init];
        attch.image = [UIImage imageNamed:@"multi_digg_word_level_3"];
        attch.bounds = CGRectMake(0, 0, attch.image.size.width, attch.image.size.height);
        NSAttributedString *z_string = [NSAttributedString attributedStringWithAttachment:attch];
        [mutStr appendAttributedString:z_string];
    }
    
    return mutStr;
    
}



/**
 創(chuàng)建發(fā)射的表情cell
 
 @param image 傳入隨機(jī)的圖片
 @param name 圖片的名字
 @return cell
 */
- (CAEmitterCell *)emitterCell:(UIImage *)image Name:(NSString *)name
{
    CAEmitterCell * smoke = [CAEmitterCell emitterCell];
    smoke.birthRate = 0;//每秒出現(xiàn)多少個(gè)粒子
    smoke.lifetime = 2;// 粒子的存活時(shí)間
    smoke.lifetimeRange = 2;
    smoke.scale = 0.35;
    
    smoke.alphaRange = 1;
    smoke.alphaSpeed = -1.0;//消失范圍
    smoke.yAcceleration = 450;//可以有下落的效果
    
    CGImageRef image2 = image.CGImage;
    smoke.contents= (__bridge id _Nullable)(image2);
    smoke.name = name; //設(shè)置這個(gè) 用來(lái)展示噴射動(dòng)畫 和隱藏
    
    smoke.velocity = 450;//速度
    smoke.velocityRange = 30;// 平均速度
    smoke.emissionLongitude = 3 * M_PI / 2 ;
    smoke.emissionRange = M_PI_2;//粒子的發(fā)散范圍
    smoke.spin = M_PI * 2; // 粒子的平均旋轉(zhuǎn)速度
    smoke.spinRange = M_PI * 2;// 粒子的旋轉(zhuǎn)速度調(diào)整范圍
    return smoke;
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    //設(shè)置發(fā)射點(diǎn)的位置
    _streamerLayer.position = CGPointMake(self.frame.size.width/2.0, self.frame.size.height/2.0);
}


- (NSMutableArray *)imagesArr
{
    if (_imagesArr == nil) {
        _imagesArr = [NSMutableArray array];
    }
    return _imagesArr;
}

- (NSMutableArray *)CAEmitterCellArr
{
    if (_CAEmitterCellArr == nil) {
        _CAEmitterCellArr = [NSMutableArray array];
    }
    return _CAEmitterCellArr;
}

調(diào)用方法:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.upvoteButton = [GXUpvoteButton buttonWithType:UIButtonTypeCustom];
    [self.view addSubview:self.upvoteButton];
    self.upvoteButton.frame = CGRectMake(0, 0, 50, 50);
    self.upvoteButton.center = self.view.center;
}

具體demo稍后提供...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚎花,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呀洲,更是在濱河造成了極大的恐慌紊选,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件道逗,死亡現(xiàn)場(chǎng)離奇詭異兵罢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)滓窍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門卖词,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贰您,你說(shuō)我怎么就攤上這事坏平。” “怎么了锦亦?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵舶替,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我杠园,道長(zhǎng)顾瞪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮陈醒,結(jié)果婚禮上惕橙,老公的妹妹穿的比我還像新娘。我一直安慰自己钉跷,他們只是感情好弥鹦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爷辙,像睡著了一般彬坏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膝晾,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天栓始,我揣著相機(jī)與錄音,去河邊找鬼血当。 笑死幻赚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的臊旭。 我是一名探鬼主播落恼,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巍扛!你這毒婦竟也來(lái)了领跛?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤撤奸,失蹤者是張志新(化名)和其女友劉穎吠昭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧瓜,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矢棚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了府喳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒲肋。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钝满,靈堂內(nèi)的尸體忽然破棺而出兜粘,到底是詐尸還是另有隱情,我是刑警寧澤弯蚜,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布孔轴,位于F島的核電站,受9級(jí)特大地震影響碎捺,放射性物質(zhì)發(fā)生泄漏路鹰。R本人自食惡果不足惜贷洲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晋柱。 院中可真熱鬧优构,春花似錦、人聲如沸雁竞。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浓领。三九已至玉凯,卻和暖如春势腮,著一層夾襖步出監(jiān)牢的瞬間联贩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工捎拯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泪幌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓署照,卻偏偏與公主長(zhǎng)得像祸泪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子建芙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容