zoukankan      html  css  js  c++  java
  • 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
    


  • 相关阅读:
    淘宝技术架构演进之路
    单点登录
    [c++11] ——条件变量(Condition Variable)
    std::lock_guard unique_lock
    C++中push_back和emplace_back的区别
    C++11 CAS无锁函数compare_exchange_weak的使用
    C++11新特性之 rvalue Reference(右值引用)
    C++ auto和decltype的区别
    ovs contrack
    周总结03
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212047.html
Copyright © 2011-2022 走看看