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
时间: 2024-10-26 19:11:29

iOS_31_cocos2d_消息调度的相关文章

skynet源码分析3:消息调度

消息调度在框架中分为两个层次,一个c层的分配,一个是lua层的分发.本文阐述的是c层,从两个方面来说: 工作线程的控制 信箱的调度 与调度相关的代码实现在/skynet-src/skynet_mq.c,/skynet-src/skynet_start.c,/skynet-src/skynet_server.c三个文件中,整体上是一个m:n的调度器. 工作线程的控制 框架运行后,会启动固定的线程来轮流调度sc(skynet_context),线程数由配置文件中的thread字段定义,默认是4个.那

消息调度中心的学习资料汇总

调度中心的资料收集 大众点评网 摘要:大众点评网从2011年中開始使用Hadoop,并专门建立团队. Hadoop主分析集群共同拥有60多个节点.700TB的容量.月执行30多万个HadoopJob.还有2个HBase线上集群.作者将讲述这各个阶段的技术选择及改进之路. 2011年小规模试水 这一阶段的主要工作是建立了一个小的集群.并导入了少量用户进行測试.为了满足用户的需求,我们还调研了任务调度系统和数据交换系统. 集群搭建好,用户便開始使用,面临的第一个问题是须要任务级别的调度.报警和工作流

关于C#消息调度(作业日志)

在Windows定时作业中,其实有多种关于作业调度形式,比如Windows Services 和 Windows Form 都可以做到,各有各的好处.现在来介绍下使用插件的形式进行定时作业. 1.用quartz.net插件,Quartz是源自于JAVA的一个很好用的插件,移植到.NET平台后表现很不错,但是有一定的缺陷就是配置比较繁琐,但网上的教程其实是最多的, 官网:http://quartznet.sourceforge.net/ 相关教程 http://www.cnblogs.com/lz

YARN中MRAppMaster的事件驱动模型与状态机处理消息过程的分析

在MRv1中,对象之间的作用关系是基于函数调用实现的,当一个对象向另外一个对象传递消息时,会直接采用函数调用的方式,并且这个过程是串行的.比如,当TaskTracker需要执行一个Task的时候,将首先下载Task依赖的文件(JAR包,二进制文件等,字典文件等),然后执行Task.在整个过程中,下载依赖文件是阻塞式的,也就是说,前一个任务未完成文件下载之前,后一个新任务将一直处于等待状态,只有在下载完成之后,才会启动一个独立进程运行该任务.基于函数调用式的编程模型是低效的,它隐含着整个过程是串行

iOS_31_cocos2d_微信飞机

最终效果图: 纹理素材 场景 // // GameScene.m // 31_cocos2D入门 // // Created by beyond on 14-9-27. // Copyright (c) 2014年 com.beyond. All rights reserved. // 雷电,游戏场景 #import "GameScene.h" #import "Hero.h" // 背景音乐 //#import "SimpleAudioEngine.h&

Android中消息系统模型和Handler Looper

作为Android中大量使用的Handler,结合Thread使其具有众多的使用形式和方法, 让我一时感觉这个东西有些玄乎,不明所以然,这到底是一个什么样的存在呢?通过网上 资料和源码的学习,这个Handler也差不多弄清楚了,现在总结下这个学习结果. 一 Handler作用和概念 通过官方文档了解到Handler的大致概念是: Handler能够让你发送和处理消息,以及Runnable对象:每个Handler对象对应一个Thread和 Thread的消息队列.当你创建一个Handler时,它就

消息mqtt服务运用

### 摘要>Apollo是apache旗下的基金项目,它是以Apache ActiveMQ5.x为基础,采用全新的线程和消息调度架构重新实现的消息中间件,针对多核处理器进行了优化处理,它的速度更快.更可靠.更易于维护.apollo与ActiveQQ一样支持多协议:STOMP.AMQP.MQTT.Openwire. SSL.WebSockets,本文只介绍MQTT协议的使用. 关于ActiveMQ5请参考:http://activemq.apache.org,本文只介绍Apollo在window

通过内存盘提高MSMQ的消息吞吐能力

转载:http://www.ikende.com/blog/00f2634be4704b79a3e22439edeb1343 由于MSMQ的消息交互都需要对磁盘进行读写操作,所以提高MSMQ的消息吞吐能力相对比较有效的方法就是提高磁盘读写能力.可以简单地把MSMQ的消息,日志等文件存储到不同的磁盘来降低MSMQ对一个磁盘IO依赖从而达到更高的读写效能.由于MSMQ一般都是存储流水数据,如果消息结构比较少和消费积累量不高的情况把MSMQ存储放到内存则是一个非常不错的选择,这样能够大大提高MSMQ的

【译】RabbitMQ:工作队列(Work Queue)

在第一篇我们写了两个程序通过一个命名的队列分别发送和接收消息.在这一篇,我们将创建一个工作队列在多个工作线程间分发耗时的工作任务. 工作队列的核心思想是避免立刻处理资源密集型任务导致必须等待其执行完成.相反的,我们安排这些任务在稍晚的时间完成.我们将一个任务封装为一个消息并把它发送到队列中.一个后台的工作线程将从队列中取出任务并最终执行.当你运行多个工作线程,这些任务将在这些工作线程间共享. 这个概念对于在一个HTTP请求中处理复杂任务的Web应用尤其有用. 准备工作 在前一篇中,我们发送了一条