切割类游戏中的切割线类Version1

来源:互联网 发布:淮南阿里云大数据 编辑:程序博客网 时间:2024/04/28 07:56

第一种方案,不是很满意,因为虚线中的每个小节都是一个精灵,所以效率上有点儿偏低~

另外就是,移动的过程中,小节精灵有跳动,影响整体效果的呈现,抛弃之~

BYCutLine.h

////  BYCutLine.h//  HungryBear////  Created by Bruce Yang on 12-8-26.//  Copyright (c) 2012年 EricGameStudio. All rights reserved.//#import <Foundation/Foundation.h>#import "cocos2d.h"#import "SynthesizeSingleton.h"#import <vector>using namespace std;/** Added by Bruce Yang on 2012.08.26.12.12~ */@interface BYCutLine : NSObject {        // 纹理对象,用于之后的销毁~    CCTexture2D* _texBar;    CCTexture2D* _texSegment;            // 端点精灵~    CCSprite* _spBarA;    CCSprite* _spBarB;            // 虚线批节点~    CCSpriteBatchNode* _batchSegment;}+(BYCutLine*) getInstance;-(BYCutLine*) addToParent:(CCNode*)nodeParent;-(void) setPointA:(CGPoint)pointA pointB:(CGPoint)pointB;-(void) disappear;@end

BYCutLine.mm

////  BYCutLine.m//  HungryBear////  Created by Bruce Yang on 12-8-26.//  Copyright (c) 2012年 EricGameStudio. All rights reserved.//#import "BYCutLine.h"// increase value to have less segments per rope, decrease to have more segments#define SEGMENT_LENGTH          8#define SEGMENT_GAP_LENGTH      4@implementation BYCutLineSYNTHESIZE_SINGLETON_FOR_CLASS(BYCutLine)-(id) init {    if((self = [super init])) {        // 1。加载纹理~        CCTextureCache* texCache = [CCTextureCache sharedTextureCache];                _texBar = [texCache addImage:@"img_cut_line_bar.png"];        _texSegment = [texCache addImage:@"img_cut_line_segment.png"];                // 2。切割虚线的精灵批节点~        int iArrSize = 32;        _batchSegment = [[CCSpriteBatchNode alloc] initWithTexture:_texSegment capacity:iArrSize];                CCSprite* spSegment = nil;        for(int i = 0; i < iArrSize; ++ i) {            spSegment = [[CCSprite alloc] initWithTexture:_texSegment];            [spSegment setVisible:NO];            [_batchSegment addChild:spSegment];        }                        // 3。切割端点的精灵~        _spBarA = [[CCSprite alloc] initWithTexture:_texBar];        _spBarB = [[CCSprite alloc] initWithTexture:_texBar];                [_spBarA setVisible:NO];        [_spBarB setVisible:NO];    }    return self;}-(void) removeFromParent {    [_batchSegment removeFromParentAndCleanup:NO];        [_spBarA removeFromParentAndCleanup:NO];    [_spBarB removeFromParentAndCleanup:NO];}-(BYCutLine*) addToParent:(CCNode*)nodeParent {    // 首先将单例对象从上一个场景移除~    [self removeFromParent];        [nodeParent addChild:_spBarA z:10];    [nodeParent addChild:_spBarB z:10];    [nodeParent addChild:_batchSegment z:10];    return self;}-(void) setPointA:(CGPoint)pointA pointB:(CGPoint)pointB {    float fDistance = ccpDistance(pointA, pointB);    int iPointCount = (int)(fDistance / (SEGMENT_LENGTH + SEGMENT_GAP_LENGTH) + 0.5f);CGPoint diffVector = ccpSub(pointB, pointA);float fMultiplier = fDistance / iPointCount;        for(CCSprite* spSegment in [_batchSegment children]) {        [spSegment setVisible:NO];    }        // 第一个点和最后一个点不用安上节点精灵,因为会被端点精灵覆盖住,纯粹浪费性能~for(int i = 1; i < iPointCount - 1; i ++) {CGPoint pntTmp = ccpAdd(pointA, ccpMult(ccpNormalize(diffVector), fMultiplier*i));CCSprite* spSegment = [[_batchSegment children] objectAtIndex:i];        [spSegment setVisible:YES];[spSegment setPosition:pntTmp];}        [_spBarA setVisible:YES];    [_spBarB setVisible:YES];        [_spBarA setPosition:pointA];    [_spBarB setPosition:pointB];}-(void) disappear {    for(CCSprite* spSegment in [_batchSegment children]) {        [spSegment setVisible:NO];    }        [_spBarA setVisible:NO];    [_spBarB setVisible:NO];}-(void) dealloc {        // 移除端点、虚线的精灵~    [_spBarA release];    [_spBarB release];        [_batchSegment removeAllChildrenWithCleanup:YES];    [_batchSegment release];            // 移除无用的纹理~    CCTextureCache* texCache = [CCTextureCache sharedTextureCache];        [texCache removeTexture:_texBar];    [texCache removeTexture:_texSegment];        [super dealloc];}@end


原创粉丝点击