iOS 游戏 Oh my fish! 切割痕迹实现

出于某些原因该游戏已经从 AppStore 下架了,

不过 91手机助手上面依然是可以下载到1.1内购版本的,

有设备的童鞋可以下载来玩一玩~

1.0 版本的视频链接(本文所介绍的是 1.1 版本的切割动画实现):

http://v.youku.com/v_show/id_XNDMyMTA4NzU2.html

使用很简单,通过 ccTouchesBegan 和 ccTouchesEnd 收集起始点和结束点,

作为两个参数初始化 CutLineLayer。。。

我的设计是这样的:当玩家的手指离开触摸屏的时候调用该效果,

CutLineLayer 初始化以后会启动一个定时器,

整个割痕效果的持续时间 = 每帧耗费的时间 * (duration + delay)。

duration 的涵义是割痕动画效果在多少帧后完成,

delay 的涵义是割痕动画定格到最后一个形态后保持再多少帧。

当割痕效果的持续时间超过限定时间以后,CutLineLayer 这个割痕效果所在的层将会自销毁掉,完成内存的自动回收。

最后提一下,不要忘记将 CutLineLayer 添加到游戏场景的父层了,很简单, addChild 加一下就行了~

期待是什么样的效果?自己动手写个小小的 demo 试一下吧,有什么不明白的地方欢迎向我留言~

所用到的图片(下面带 -hd 后缀的是 iphone-retina 所使用的素材,iphone 3gs 缩放为其 1/2  并去掉 -hd 后缀):

cutLine-hd.png


下面是相关的代码:

CutLineLayer.h

//
//  CutLineLayer.h
//  Oh my fish!
//
//  Created by Bruce Yang on 12-10-9.
//  Copyright (c) 2012年 iyodoo. All rights reserved.
//

#import "cocos2d.h"

@interface CutLineLayer : CCLayer {
    CCSprite* _spCut;
    CGPoint _start;
    CGPoint _end;
    int _duration;
    
    int _index;
    CGPoint _unit;
    
    int _delay;
}

+(CutLineLayer*) layerWithStart:(CGPoint)start 
                            end:(CGPoint)end 
                       duration:(int)duration 
                          valid:(bool)valid;

-(id) initWithStart:(CGPoint)start 
                end:(CGPoint)end 
           duration:(int)duration 
              valid:(bool)valid;

@end

CutLineLayer.mm

//
//  CutLineLayer.mm
//  Oh my fish!
//
//  Created by Bruce Yang on 12-10-9.
//  Copyright (c) 2012年 iyodoo. All rights reserved.
//

#import "CutLineLayer.h"

@implementation CutLineLayer

+(CutLineLayer*) layerWithStart:(CGPoint)start 
                            end:(CGPoint)end 
                       duration:(int)duration 
                          valid:(bool)valid {
    return [[[self alloc] initWithStart:start 
                                    end:end 
                               duration:duration 
                                  valid:valid] autorelease];
}

-(id) initWithStart:(CGPoint)start 
                end:(CGPoint)end 
           duration:(int)duration 
              valid:(bool)valid {
    if ((self = [super init])) {
        _start = start;
        _end = end;
        _duration = duration;
        
        _unit = ccpMult(ccp(_end.x - _start.x, _end.y - _start.y), 1.0f / duration);
        
        _index = 1;
        
        _spCut = [CCSprite spriteWithFile:@"cutLine.png"];
        float fRotation = -1 * CC_RADIANS_TO_DEGREES(ccpToAngle(ccpSub(end, start)));
        [_spCut setRotation:fRotation];
        
        if(!valid) {
            [_spCut setColor:(ccColor3B){255, 0, 0}];
        }
        
        [self addChild:_spCut];
        
        // 延长到达最大长度以后的停留时间~
        _delay = 3;
        
        [self schedule:@selector(tick:)];
    }
    return self;
}

-(void) tick:(id)sender {
    if (_index > _duration) {
        _delay --;
        if(_delay <= 0) {
            [self removeFromParentAndCleanup:YES];
        }
        return;
    }
    
    CGPoint offset = ccp(_unit.x * _index, _unit.y * _index);
    [_spCut setPosition:ccpAdd(_start, ccpMult(offset, 0.5f))];
    
    float fDistance = ccpDistance(CGPointZero, offset);
    float fScale = fDistance / _spCut.contentSize.width;
    [_spCut setScaleX:fScale];
    
    _index ++;
}

-(void) dealloc {
    [super dealloc];
}

@end


原文地址:https://www.cnblogs.com/java20130723/p/3212047.html