首页 > 代码库 > iOS_31_cocos2d_消息调度

iOS_31_cocos2d_消息调度

最终效果如图:



cocos2d V3 只要实现了- (void)update:(CCTime)delta方法,

就会自动调用它,无需手动调用

foreach   或者说for in遍历的时侯,不能增删成员










封装的 子弹类,继承自CCSprite

//
//  Bullet.h
//  31_cocos2D入门
//
//  Created by beyond on 14-9-7.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  子弹 成员属性:速度  每秒移动多少

#import "CCSprite.h"

@interface Bullet : CCSprite

// 速度(每秒挪动这个速度)
@property (nonatomic, assign) CGPoint velocity;

@end



//
//  Bullet.m
//  31_cocos2D入门
//
//  Created by beyond on 14-9-7.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "Bullet.h"

@implementation Bullet

// do nothing in cocos2d v3
- (id)initWithTexture:(CCTexture *)texture rect:(CGRect)rect
{<span style="white-space:pre">	</span>
    if (self = [super initWithTexture:texture rect:rect]) {
        // 默认会调用update:
        // [self schedule:@selector(update:) interval:0];
        
        
        // 取消消息调度
        // [self unschedule:<#(SEL)#>];
    }
    return self;
}

// 路程 = 速度 * 时间
// delta 两次刷帧的时间间距
- (void)update:(CCTime)delta
{
    // 每次增加5的x值
    // self.position = ccpAdd(self.position, ccp(5, 0));
    
    // s = 速度 * 时间
    CGPoint deltaS = ccpMult(_velocity, delta);
    
    // 更改位置
    self.position = ccpAdd(self.position, deltaS);
}

@end


主场景



//
//  HelloWorldScene.h
//  31_cocos2D入门
//
//  Created by beyond on 14-9-5.
//  Copyright com.beyond 2014年. All rights reserved.
//

// Importing cocos2d.h and cocos2d-ui.h, will import anything you need to start using Cocos2D v3
#import "cocos2d.h"
#import "cocos2d-ui.h"

/**
 *  主场景
 */
@interface HelloWorldScene : CCScene

+ (HelloWorldScene *)scene;
- (id)init;

@end





//
//  HelloWorldScene.m
//  31_cocos2D入门
//
//  Created by beyond on 14-9-5.
//  Copyright com.beyond 2014年. All rights reserved.
//

#import "HelloWorldScene.h"
#import "IntroScene.h"
#import "CCAnimation.h"

// 子弹
#import "Bullet.h"

@implementation HelloWorldScene
{
    CCSprite *_sprite;
}

#pragma mark - 生命周期
+ (HelloWorldScene *)scene
{
    return [[self alloc] init];
}

// 在HelloWorldScene中
- (id)init
{
    if (!(self = [super init]) ) return(nil);
    
    // 1、场景Node 允许交互
    self.userInteractionEnabled = YES;
    
    // 2、创建背景颜色为深灰色
    CCNodeColor *background = [CCNodeColor nodeWithColor:[CCColor colorWithRed:0.2f green:0.2f blue:0.2f alpha:1.0f]];
    [self addChild:background];
    
    // 3、添加一个精灵,并居中
    [self addSpriteInCenter];
    
    // 4、右上方,创建一个返回按钮,点击后,返回至上一个场景
    [self addBtnOnTopRight];
    
    // 5、重要,开启消息调用
    // [self schedule:@selector(update:) interval:0];
    
    // 返回创建好的场景对象
	return self;
}



#pragma mark - Enter & Exit
//
- (void)onEnter
{
    // 必须总是先调用父类的onEnter方法
    [super onEnter];
    
    // In pre-v3, touch enable and scheduleUpdate was called here
    // In v3, touch is enabled by setting userInteractionEnabled for the individual nodes
    // Per frame update is automatically enabled, if update is overridden
    
}

- (void)onExit
{
    // 必须总是 最后才调用父类的onExit方法
    [super onExit];
}

#pragma mark - 触摸事件
// 用户触摸屏幕,精灵跟随手指移动
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint touchLoc = [touch locationInNode:self];
    
    // 输出触摸点的坐标
    CCLOG(@"Move sprite to @ %@",NSStringFromCGPoint(touchLoc));
    
    // 移动精灵到触摸点处 To表示绝对  By表示相对
    //CCActionMoveTo *actionMove = [CCActionMoveTo actionWithDuration:1.0f position:touchLoc];
    // 调用精灵的runAction方法执行动作
    //[_sprite runAction:actionMove];
}
// 手抬起处就放一颗bullet,并且让子弹 射出去,并且进行碰撞检测
- (void)touchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    // 得到触摸点
    CGPoint touchLoc = [touch locationInNode:self];
    

    
    Bullet *bullet = [Bullet spriteWithImageNamed:@"bullet.png"];
    bullet.name = @"bullet";
    // 设置 子弹出现的位置
    bullet.position = touchLoc;
    // 设置 子弹的速度
    bullet.velocity = ccp(500, CCRANDOM_MINUS1_1() * 300);
    [self addChild:bullet];
}

// 在场景的消息调度里面,进行碰撞检测
- (void)update:(CCTime)delta
{
    [self boundaryCheck];
}
- (void)boundaryCheck
{

    
    for (int i = 0; i<self.children.count;i++) {
        CCSprite *child = [self.children objectAtIndex:i];
        // 子弹
        if ([child.name isEqualToString:@"bullet"]) {
            
            // 1.往右边飞
            //            CGPoint pos = child.position;
            //            pos.x += 5;
            //            child.position = pos;
            
            // 2.跟人的碰撞检测
            // CCSprite *person = (CCSprite *)[self getChildByName:@"nana" recursively:YES];
            if ( CGRectIntersectsRect(child.boundingBox, _sprite.boundingBox) )
            {
                // 移除子弹
                [child removeFromParentAndCleanup:YES];
                CCLOG(@"碰到了人");
                _sprite.opacity = _sprite.opacity*0.8;
                if (_sprite.opacity < 0.05) {
                    _sprite.position = ccp(-10,-10);
                }
            } else if ( !CGRectContainsRect(self.boundingBox, child.boundingBox) ) {
                // 移除子弹
                [child removeFromParentAndCleanup:YES];
                CCLOG(@"离开了屏幕");
            }
        }
    }
    
}
#pragma mark - 按钮点击事件

- (void)onBackClicked:(id)sender
{
    // 使用转场动画,切换场景至 IntroScene
    [[CCDirector sharedDirector] replaceScene:[IntroScene scene]
                               withTransition:[CCTransition transitionPushWithDirection:CCTransitionDirectionRight duration:1.0f]];
}
#pragma mark - 私有方法
// 右上方,创建一个返回按钮,点击后,返回至上一个场景
- (void)addBtnOnTopRight
{
    // 5、右上方,创建一个返回按钮,点击后,返回至上一个场景
    CCButton *backButton = [CCButton buttonWithTitle:@"[ Back ]" fontName:@"Verdana-Bold" fontSize:18.0f];
    backButton.positionType = CCPositionTypeNormalized;
    // 屏幕的右上方 注意这里是笛卡尔坐标系,原点在左下方
    backButton.position = ccp(0.85f, 0.95f);
    // 监听点击事件
    [backButton setTarget:self selector:@selector(onBackClicked:)];
    [self addChild:backButton];
}
// 添加一个精灵,并设置位置居中
- (void)addSpriteInCenter
{
    // 3、添加一个精灵,并设置位置居中  ColorCircle
    _sprite = [CCSprite spriteWithImageNamed:@"nana_logo.png"];
    _sprite.name = @"nana";
    
    //NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"nana_logo.png" ofType:nil];
    
    //_sprite = [CCSprite spriteWithTexture:[CCTexture textureWithFile:fullPath ] rect:CGRectMake(0, 0, 112, 112) ];
    
    //_sprite.position  = ccp(self.contentSize.width/2,self.contentSize.height/2);
    _sprite.position  = ccp(self.contentSize.width*0.85,self.contentSize.height/2);
    
    [self addChild:_sprite];
}
// 为精灵创建一个旋转动作
- (void)addRotateAction
{
    // 4、为精灵创建一个旋转动作,并且调用精灵的runAction方法,重复执行动作
    CCActionRotateBy* actionSpin = [CCActionRotateBy actionWithDuration:1.5f angle:360];
    [_sprite runAction:[CCActionRepeatForever actionWithAction:actionSpin]];

}
// 测试sprite属性
- (void)testCCSprite
{
    _sprite.opacity = 125;
    //_sprite.color = [UIColor redColor];//ccc3(255, 0, 0);
    _sprite.color = [CCColor colorWithRed:1.0f green:0.2f blue:0.2f alpha:1.0f];
    _sprite.flipX = YES;
    _sprite.flipY = YES;
    
    
    CCAction *action = [CCActionCallFunc actionWithTarget:self selector:@selector(go:)];
    [_sprite runAction:action];

}
// 播放帧动画【赵云】
- (void)playFrameAnimatiton
{
    // 创建精灵,并居中【千万要记得addChild】
    _sprite = [CCSprite spriteWithImageNamed:@"1.png"];
    _sprite.position  = ccp(self.contentSize.width/2,self.contentSize.height/2);
    // 用来存放所有的帧
    NSMutableArray *frames = [NSMutableArray array];
    // 加载所有的图片
    for (int i = 1; i<= 10; i++) {
        // 1、拼接图片名
        NSString *name = [NSString stringWithFormat:@"%i.png", i];
        // 2、根据图片名(或全路径)生成纹理,一个图片对应一个纹理对象
        CCTexture *texture = [CCTexture textureWithFile:name];
        CGRect retct = CGRectMake(0, 0, texture.contentSize.width, texture.contentSize.height);
        // 3、根据纹理创建一个精灵帧
        CCSpriteFrame *frame = [[CCSpriteFrame alloc]initWithTexture:texture rectInPixels:retct rotated:NO offset:ccp(0, 0) originalSize:retct.size];
        // 4、添加精灵帧 到 精灵帧数组中
        [frames addObject:frame];
    }
    // 根据【精灵帧数组】创建CCAnimation,参数:每隔0.1秒播放下一张图片
    CCAnimation *animation = [CCAnimation animationWithSpriteFrames:frames delay:0.1];
    
    // 根据CCAnimation对象 创建 动作
    CCActionAnimate *animate = [CCActionAnimate actionWithAnimation:animation];
    CCActionRepeatForever *forever = [CCActionRepeatForever actionWithAction:animate];
    [_sprite runAction:forever];
    // 重要~~~必须成为场景的子Node
    [self addChild:_sprite];
}
@end












iOS_31_cocos2d_消息调度