最终效果如图:

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
原文地址:http://blog.csdn.net/pre_eminent/article/details/39123861