OC实现有趣的过山车动画

在网上看到一个有趣的过山车动画,有大神用swift实现了。我参照着用OC实现了一遍,我们不生产代码,只是代码的搬运工。

动画如图所示:


过山车动画.gif
实现动画主要使用到的类:
  • CAShapeLayer
  • CAGradientLayer
  • CAKeyframeAnimation
实现思路:

渐变的背景用CAGradientLayer实现,山峰,草坪和轨道利用CAShapeLayer配合UIBezierPath实现,云,树和大地都是图片资源,直接通过设置CALayer的contents实现。动画实现使用的是CAKeyframeAnimation。代码如下:过山车动画OC

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) CALayer *groundLayer;

@property (nonatomic, strong) CAShapeLayer *yellowPath;

@property (nonatomic, strong) CAShapeLayer *greenPath;

@property (nonatomic, assign) NSInteger count;

@property (nonatomic, assign) NSInteger count1;

@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    _count = 0;
    _count1 = 0;
    
    CGSize size = self.view.frame.size;
    [self createGradientLayerWithSize:size];
    [self createMountainLayerWithSize:size];
    [self createGrasslandlayerWithSize:size];
    
    _groundLayer = [self createGroundLayerWithSize:size];
    _yellowPath = [self createYellowPathLayerWithSize:size];
    _greenPath = [self createGreenPathLayerWithSize:size];
    
    [self addTreeLayeWithSize:size];
    
    [NSTimer scheduledTimerWithTimeInterval:0.092 target:self selector:@selector(startAnimated:) userInfo:nil repeats:YES];
    [NSTimer scheduledTimerWithTimeInterval:0.095 target:self selector:@selector(startAnimated1:) userInfo:nil repeats:YES];
    
    [self addCloudAnimationWithSize:size];
}

- (void)startAnimated:(NSTimer *)timer
{
    if (_count == 5) {
        [timer invalidate];
        timer = nil;
    }
    [self addYellowCarPathAnimation];
    _count ++;
}

- (void)startAnimated1:(NSTimer *)timer
{
    if (_count1 == 5) {
        [timer invalidate];
        timer = nil;
    }
    [self addGreenCarPathAnimationWithSize:self.view.frame.size];
    _count1 ++;
}

- (CGFloat)getPoint:(CGPoint)pointOne pointTow:(CGPoint)pointTow referenceX:(CGFloat)referenceX
{
    CGFloat x1 = pointOne.x;
    CGFloat y1 = pointOne.y;
    CGFloat x2 = pointTow.x;
    CGFloat y2 = pointTow.y;
    
    CGFloat a,b;
    a = (y2 - y1) / (x2 - x1);
    b = y1 - a * x1;
    
    CGFloat y = a * referenceX + b;
    return y;
}

- (CAGradientLayer *)createGradientLayerWithSize:(CGSize)size
{
    CAGradientLayer *layer = [CAGradientLayer layer];
    layer.frame = CGRectMake(0, 0, size.width, size.height - 20);
    layer.colors = @[(__bridge id)[[UIColor alloc] initWithRed:178.0/255.0 green:226.0/255.0 blue:248.0/255.0 alpha:1].CGColor,(__bridge id)[[UIColor alloc] initWithRed:232.0/255.0 green:244.0/255.0 blue:193.0/255.0 alpha:1].CGColor];
    layer.startPoint = CGPointMake(0, 0);
    layer.endPoint = CGPointMake(1, 1);
    [self.view.layer addSublayer:layer];
    return layer;
}

- (void)createMountainLayerWithSize:(CGSize)size
{
    CAShapeLayer *mountainOne = [CAShapeLayer layer];
    UIBezierPath *pathOne = [[UIBezierPath alloc] init];
    [pathOne moveToPoint:CGPointMake(0, size.height - 100)];
    [pathOne addLineToPoint:CGPointMake(100, 100)];
    [pathOne addLineToPoint:CGPointMake(size.width / 3, size.height - 100)];
    [pathOne addLineToPoint:CGPointMake(size.width / 1.5, size.width - 50)];
    [pathOne addLineToPoint:CGPointMake(0, size.height)];
    mountainOne.path = pathOne.CGPath;
    mountainOne.fillColor = [UIColor whiteColor].CGColor;
    [self.view.layer addSublayer:mountainOne];
    
    CAShapeLayer *mountainOneLayer = [CAShapeLayer layer];
    UIBezierPath *pathLayerOne = [[UIBezierPath alloc] init];
    [pathLayerOne moveToPoint:CGPointMake(0, size.height - 120)];
    CGFloat pathOneHeight = [self getPoint:CGPointMake(0, size.height - 120) pointTow:CGPointMake(100, 100) referenceX:55];
    CGFloat pathTwoHeight = [self getPoint:CGPointMake(100, 100) pointTow:CGPointMake(size.width / 3, size.height - 100) referenceX:160];
    [pathLayerOne addLineToPoint:CGPointMake(55, pathOneHeight)];
    [pathLayerOne addLineToPoint:CGPointMake(70, pathOneHeight + 15)];
    [pathLayerOne addLineToPoint:CGPointMake(90, pathOneHeight)];
    [pathLayerOne addLineToPoint:CGPointMake(110, pathOneHeight + 25)];
    [pathLayerOne addLineToPoint:CGPointMake(130, pathOneHeight - 5)];
    [pathLayerOne addLineToPoint:CGPointMake(160, pathTwoHeight)];
    
    [pathLayerOne addLineToPoint:CGPointMake(size.width / 3, size.height - 100)];
    [pathLayerOne addLineToPoint:CGPointMake(size.width / 1.5, size.height - 50)];
    [pathLayerOne addLineToPoint:CGPointMake(0, size.height)];
    mountainOneLayer.path = pathLayerOne.CGPath;
    mountainOneLayer.fillColor = [[UIColor alloc] initWithRed:104.0/255.0 green:92.0/255.0 blue:157.0/255.0 alpha:1].CGColor;
    [self.view.layer addSublayer:mountainOneLayer];
    
    CAShapeLayer *mountainTwo = [CAShapeLayer layer];
    UIBezierPath *pathTwo = [[UIBezierPath alloc] init];
    [pathTwo moveToPoint:CGPointMake(size.width / 4, size.height - 90)];
    [pathTwo addLineToPoint:CGPointMake(size.width / 2.7, 200)];
    [pathTwo addLineToPoint:CGPointMake(size.width / 1.8, size.height - 85)];
    [pathTwo addLineToPoint:CGPointMake(size.width / 1.6, size.height - 125)];
    [pathTwo addLineToPoint:CGPointMake(size.width / 1.35, size.height - 70)];
    [pathTwo addLineToPoint:CGPointMake(0, size.height)];
    mountainTwo.path = pathTwo.CGPath;
    mountainTwo.fillColor = [UIColor whiteColor].CGColor;
    [self.view.layer insertSublayer:mountainTwo below:mountainOne];
    
    CAShapeLayer *mountainTwoLayer = [CAShapeLayer layer];
    UIBezierPath *pathLayerTwo = [[UIBezierPath alloc] init];
    [pathLayerTwo moveToPoint:CGPointMake(0, size.height)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 4, size.height - 90)];
    pathOneHeight = [self getPoint:CGPointMake(size.width / 4, size.height - 90) pointTow:CGPointMake(size.width / 2.7, 200) referenceX:size.width / 4 + 50];
    pathTwoHeight = [self getPoint:CGPointMake(size.width / 1.8, size.height - 85) pointTow:CGPointMake(size.width / 2.7, 200) referenceX:size.width / 2.2];
    CGFloat pathThreeHeight = [self getPoint:CGPointMake(size.width / 1.8, size.height - 85) pointTow:CGPointMake(size.width / 1.6, size.height - 125) referenceX:size.width / 1.67];
    CGFloat pathFourHeight = [self getPoint:CGPointMake(size.width / 1.35, size.height - 70) pointTow:CGPointMake(size.width / 1.6, size.height - 125) referenceX:size.width / 1.50];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 4 + 50, pathOneHeight)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 4 + 70, pathOneHeight + 15)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 4 + 90, pathOneHeight)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 4 + 110, pathOneHeight + 15)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 2.2, pathTwoHeight)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.8, size.height - 85)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.67, pathThreeHeight)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.65, pathThreeHeight + 5)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.60, pathThreeHeight - 2)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.58, pathFourHeight + 2)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.55, pathFourHeight - 5)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.50, pathFourHeight)];
    [pathLayerTwo addLineToPoint:CGPointMake(size.width / 1.35, size.height - 70)];
    [pathLayerTwo addLineToPoint:CGPointMake(0, size.height)];
    
    mountainTwoLayer.path = pathLayerTwo.CGPath;
    mountainTwoLayer.fillColor = [[UIColor alloc] initWithRed:75.0/255.0 green:65.0/255.0 blue:111.0/255.0 alpha:1.0].CGColor;
    [self.view.layer insertSublayer:mountainTwoLayer below:mountainOne];
}

- (NSArray<CAShapeLayer *> *)createGrasslandlayerWithSize:(CGSize)size
{
    CAShapeLayer *grasslandOne = [CAShapeLayer layer];
    UIBezierPath *patnOne = [[UIBezierPath alloc] init];
    [patnOne moveToPoint:CGPointMake(0, size.height - 20)];
    [patnOne addLineToPoint:CGPointMake(0, size.height - 100)];
    [patnOne addQuadCurveToPoint:CGPointMake(size.width / 3.0, size.height - 20) controlPoint:CGPointMake(size.width, size.height - 100)];
    grasslandOne.path = patnOne.CGPath;
    
    grasslandOne.fillColor = [[UIColor alloc] initWithRed:82.0/255.0 green:177.0/255.0 blue:44.0/255.0 alpha:1.0].CGColor;
    [self.view.layer addSublayer:grasslandOne];
    
    CAShapeLayer *grasslandTwo = [CAShapeLayer layer];
    UIBezierPath *pathTwo = [[UIBezierPath alloc] init];
    [pathTwo moveToPoint:CGPointMake(0, size.height - 20)];
    [pathTwo addQuadCurveToPoint:CGPointMake(size.width, size.height - 60) controlPoint:CGPointMake(size.width / 2.0, size.height - 100)];
    [pathTwo addLineToPoint:CGPointMake(size.width, size.height - 20)];
    grasslandTwo.path = pathTwo.CGPath;
    grasslandTwo.fillColor = [[UIColor alloc] initWithRed:92.0/255.0 green:195.0/255.0 blue:52.0/255.0 alpha:1.0].CGColor;
    [self.view.layer addSublayer:grasslandTwo];
    
    return @[grasslandOne, grasslandTwo];
}

- (CALayer *)createGroundLayerWithSize:(CGSize)size
{
    CALayer *ground = [CALayer layer];
    ground.frame = CGRectMake(0, size.height - 20, size.width, 20);
    ground.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"7"]].CGColor;
    [self.view.layer addSublayer:ground];
    return ground;
}

- (CAShapeLayer *)createYellowPathLayerWithSize:(CGSize)size
{
    CAShapeLayer *calayer = [CAShapeLayer layer];
    calayer.backgroundColor = [UIColor redColor].CGColor;
    calayer.lineWidth = 5;
    calayer.strokeColor = [[UIColor alloc] initWithRed:210.0/255.0 green:179.0/255.0 blue:54.0/255.0 alpha:1.0].CGColor;
    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(0, size.height - 70)];
    [path addCurveToPoint:CGPointMake(size.width / 1.5, 200) controlPoint1:CGPointMake(size.width / 6, size.height - 200) controlPoint2:CGPointMake(size.width / 2.5, size.height + 50)];
    [path addQuadCurveToPoint:CGPointMake(size.width + 10, size.height / 3) controlPoint:CGPointMake(size.width - 100, 50)];
    [path addLineToPoint:CGPointMake(size.width + 10, size.height + 10)];
    [path addLineToPoint:CGPointMake(0, size.height + 10)];
    calayer.fillColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"2"]].CGColor;
    calayer.path = path.CGPath;
    [self.view.layer insertSublayer:calayer below:_groundLayer];
    
    CAShapeLayer *lineLayer = [CAShapeLayer layer];
    lineLayer.lineCap = kCALineCapRound;
    lineLayer.strokeColor = [UIColor whiteColor].CGColor;
    lineLayer.lineDashPattern = @[@1,@5];
    lineLayer.lineWidth = 2;
    lineLayer.fillColor = [UIColor clearColor].CGColor;
    lineLayer.path = path.CGPath;
    
    [calayer addSublayer:lineLayer];
    return calayer;
}

- (CAShapeLayer *)createGreenPathLayerWithSize:(CGSize)size
{
    CAShapeLayer *calayer = [CAShapeLayer layer];
    calayer.backgroundColor = [UIColor redColor].CGColor;
    calayer.lineWidth = 5;
    calayer.fillRule = kCAFillRuleEvenOdd;
    calayer.strokeColor = [[UIColor alloc] initWithRed:0.0/255.0 green:147.0/255.0 blue:163.0/255.0 alpha:1.0].CGColor;
    UIBezierPath *path = [[UIBezierPath alloc] init];
    path.lineCapStyle = kCGLineCapRound;
    path.lineJoinStyle = kCGLineJoinRound;
    [path moveToPoint:CGPointMake(size.width + 10, size.height)];
    [path addLineToPoint:CGPointMake(size.width + 10, size.height - 70)];
    [path addQuadCurveToPoint:CGPointMake(size.width / 1.8, size.height - 70) controlPoint:CGPointMake(size.width - 120, 200)];
    [path addArcWithCenter:CGPointMake(size.width / 1.9, size.height - 140) radius:70 startAngle:0.5 * M_PI endAngle:2.5 * M_PI clockwise:YES];
    [path addCurveToPoint:CGPointMake(0, size.height - 100) controlPoint1:CGPointMake(size.width / 1.8 - 60, size.height - 60) controlPoint2:CGPointMake(150, size.height / 2.3)];
    [path addLineToPoint:CGPointMake(-100, size.height + 10)];
    calayer.fillColor = [UIColor clearColor].CGColor;
    calayer.path = path.CGPath;
    [self.view.layer insertSublayer:calayer below:_groundLayer];
    
    CAShapeLayer *greenLayer = [CAShapeLayer layer];
    greenLayer.fillRule = kCAFillRuleEvenOdd;
    greenLayer.strokeColor = [[UIColor alloc] initWithRed:0.0/255.0 green:147.0/255.0 blue:163.0/255.0 alpha:1.0].CGColor;
    UIBezierPath *greenPath = [[UIBezierPath alloc] init];
    [greenPath moveToPoint:CGPointMake(size.width + 10, size.height)];
    [greenPath addLineToPoint:CGPointMake(size.width + 10, size.height - 70)];
    [greenPath addQuadCurveToPoint:CGPointMake(size.width / 1.8, size.height - 70) controlPoint:CGPointMake(size.width - 120, 200)];
    [greenPath addCurveToPoint:CGPointMake(0, size.height - 100) controlPoint1:CGPointMake(size.width / 1.8 - 60, size.height - 60) controlPoint2:CGPointMake(150, size.height / 2.3)];
    [greenPath addLineToPoint:CGPointMake(-100, size.height + 10)];
    greenLayer.fillColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"3"]].CGColor;
    greenLayer.path = greenPath.CGPath;
    [self.view.layer insertSublayer:greenLayer below:calayer];
    
    CAShapeLayer *lineLayer = [CAShapeLayer layer];
    lineLayer.lineCap = kCALineCapRound;
    lineLayer.strokeColor = [UIColor whiteColor].CGColor;
    lineLayer.lineDashPattern = @[@1,@5];
    lineLayer.lineWidth = 2;
    lineLayer.fillColor = [UIColor clearColor].CGColor;
    lineLayer.path = path.CGPath;
    [calayer addSublayer:lineLayer];
    
    return calayer;
}

- (void)addYellowCarPathAnimation
{
    CALayer *carLayer = [CALayer layer];
    carLayer.frame = CGRectMake(0, 0, 17, 11);
    [carLayer setAffineTransform:CGAffineTransformTranslate(carLayer.affineTransform, 0, -7)];
    carLayer.contents = (__bridge id)[UIImage imageNamed:@"6"].CGImage;
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.path = [_yellowPath path];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animation.duration = 6;
    animation.repeatCount = MAXFLOAT;
    animation.autoreverses = NO;
    animation.calculationMode = kCAAnimationCubicPaced;
    animation.rotationMode = kCAAnimationRotateAuto;
    [_yellowPath addSublayer:carLayer];
    [carLayer addAnimation:animation forKey:nil];
}

- (void)addGreenCarPathAnimationWithSize:(CGSize)size
{
    CALayer *carLayer = [CALayer layer];
    carLayer.frame = CGRectMake(0, 0, 17, 11);
    carLayer.contents = (__bridge id)[UIImage imageNamed:@"1"].CGImage;
    UIBezierPath *path = [[UIBezierPath alloc] init];
    path.lineCapStyle = kCGLineCapRound;
    path.lineJoinStyle = kCGLineJoinRound;
    [path moveToPoint:CGPointMake(size.width + 10, size.height - 7)];
    [path addLineToPoint:CGPointMake(size.width + 10, size.height - 77)];
    [path addQuadCurveToPoint:CGPointMake(size.width / 1.8, size.height - 77) controlPoint:CGPointMake(size.width - 120, 193)];
    [path addArcWithCenter:CGPointMake(size.width / 1.9, size.height - 140) radius:63 startAngle:0.5 * M_PI endAngle:2.5 * M_PI clockwise:YES];
    [path addCurveToPoint:CGPointMake(0, size.height - 107) controlPoint1:CGPointMake(size.width / 1.8 - 60, size.height - 67) controlPoint2:CGPointMake(150, size.height / 2.3)];
    [path addLineToPoint:CGPointMake(-100, size.height + 7)];
    
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.path = path.CGPath;
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animation.duration = 6;
    animation.repeatCount = MAXFLOAT;
    animation.autoreverses = NO;
    animation.calculationMode = kCAAnimationCubicPaced;
    animation.rotationMode = kCAAnimationRotateAuto;
    [self.view.layer addSublayer:carLayer];
    
    [carLayer addAnimation:animation forKey:nil];
}

- (CALayer *)addCloudAnimationWithSize:(CGSize)size
{
    CALayer *cloudLayer = [CALayer layer];
    cloudLayer.contents = (__bridge id)[UIImage imageNamed:@"5"].CGImage;
    cloudLayer.frame = CGRectMake(0, 0, 63, 20);
    [self.view.layer addSublayer:cloudLayer];
    
    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(size.width + 63, 40)];
    [path addLineToPoint:CGPointMake(- 63, 40)];
    
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.path = path.CGPath;
    animation.duration = 40;
    animation.repeatCount = MAXFLOAT;
    animation.autoreverses = NO;
    animation.calculationMode = kCAAnimationCubicPaced;
    [cloudLayer addAnimation:animation forKey:nil];
    
    return cloudLayer;
}

- (void)addTreeLayeWithSize:(CGSize)size
{
    for (int i = 0; i < 7; i ++) {
        CALayer *treeOne = [CALayer layer];
        treeOne.contents = (__bridge id)[UIImage imageNamed:@"4"].CGImage;
        treeOne.frame = CGRectMake([@[@5,@55,@70,@(size.width / 3 + 15),@(size.width / 3 + 25), @(size.width - 130),@(size.width - 160)][i] floatValue], size.height - 43, 13, 23);
        [self.view.layer addSublayer:treeOne];
    }
    for (int i = 0; i < 4; i ++) {
        CALayer *treeOne = [CALayer layer];
        treeOne.contents = (__bridge id)[UIImage imageNamed:@"4"].CGImage;
        treeOne.frame = CGRectMake([@[@10,@60,@(size.width / 3),@(size.width - 150)][i] floatValue], size.height - 52, 18, 32);
        [self.view.layer addSublayer:treeOne];
    }
    for (int i = 0; i < 2; i ++) {
        CALayer *treeOne = [CALayer layer];
        treeOne.contents = (__bridge id)[UIImage imageNamed:@"4"].CGImage;
        treeOne.frame = CGRectMake([@[@(size.width - 210),@(size.width - 50)][i] floatValue], [@[@(size.height - 75),@(size.height - 80)][i] floatValue], 18, 32);
        [self.view.layer addSublayer:treeOne];
    }
    for (int i = 0; i < 3; i ++) {
        CALayer *treeOne = [CALayer layer];
        treeOne.contents = (__bridge id)[UIImage imageNamed:@"4"].CGImage;
        treeOne.frame = CGRectMake([@[@(size.width - 235),@(size.width - 220), @(size.width - 40)][i] floatValue], [@[@(size.height - 67),@(size.height - 67),@(size.height - 72)][i] floatValue], 13, 23);
        [self.view.layer addSublayer:treeOne];
    }
}

如果有人想要swift版本的,这里留下原作者的博客地址。需要详细了解的小伙伴可以看这里。

原作者博客点这里

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,095评论 4 62
  • 特别喜欢一部徐克的长篇动画电影《小倩》。本身是一片好评的好作品,尽管上映时票房不好。像很多电影一样,在时光里徜徉一...
    艾亚卡阅读 415评论 0 0
  • 王贺妈妈阅读 51评论 0 0
  • 周五晚上,和原来的领导同事一起吃饭,喝酒,聊到了快12点回家。这样的聚会其实我们每隔一两个月都会进行,而每次的人员...
    鹂黄阅读 700评论 3 1
  • 今天和一个素不相识的百强企业的业务经理聊了许久,突然感触颇深。我们的政府在做什么,我们的企业需要什么,我们老百姓渴...
    3c333c4371e8阅读 103评论 0 0