现在的位置: 首页 > 综合 > 正文

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

2013年03月19日 ⁄ 综合 ⁄ 共 3127字 ⁄ 字号 评论关闭

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

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

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 BYCutLine

SYNTHESIZE_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

抱歉!评论已关闭.