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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。