(NO.00002)iOS游戏精灵战争雏形(十一)

为了在子弹触碰到目标时做一些事情,我们必须要设置碰撞回调.

首先在MainScene.h的类接口中添加碰撞协议:

@interface MainScene : CCNode <CCPhysicsCollisionDelegate>

@end

接下来在类初始化中设置碰撞代理:

    _physics.collisionDelegate = self;

然后就可以设置碰撞回调函数了.至于其中的具体规则不是短短几句话能说清楚的,现在只要知道,我们可以根据不同的碰撞类来分别处理碰撞,即可以设置多个碰撞回调函数.

回到SpriteBuilder中分别设置Player和Bullet的碰撞类型为player和bullet:

切换回Xcode,在MainScene.m中添加如下碰撞回调方法:

-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair player:(CCNode *)player
                          bullet:(CCNode *)bullet{
    bullet.visible = NO;
    return YES;
}

代码很简单,在碰撞时将子弹不可见,返回YES表示发生碰撞,否则不发生碰撞行为.按道理说应该将子弹不可见的代码放到碰撞之后,应该放到ccPhysicsCollisionPreSolve回调中,不过这里也不影响实际效果.返回NO和物理对象为传感器的行为差不多,后面遇到传感器对象时再谈.

现在到了让精灵轰击子弹的时候了,我们简单的每隔2秒向地方精灵发射一颗子弹,在didLoadFromCCB方法中添加如下一句:

    [self schedule:@selector(autoShoot:) interval:2];

添加autoShoot方法:

-(void)autoShoot:(CCTime)delta{
    [self shoot:_sprite1 target:_sprite2.position];
}

其实有些童鞋可能会认为发射子弹方法应该成为Player的方法而不是MainScene的方法.这样说是有道理的,但是这必须解决子弹在哪里的问题.是放在MainScene中,还是放在每个player中?这个涉及到模式的问题,在这里不展开说了.

编译运行,效果如下:

请暂时无视爆炸的特效,那将是下一篇中的故事 ;)

时间: 2024-09-17 03:51:04

(NO.00002)iOS游戏精灵战争雏形(十一)的相关文章

(NO.00002)iOS游戏精灵战争雏形(一)

原本想做一个复杂点的平面动作游戏,可以觉得还是有点把握不了.还是先从简单的原型开始吧. 构思中的精灵战争(SpriteWar)是一个类似FC时代的小游戏,可以造兵,可以捕获敌兵.原本还想加上保卫老巢的.但是咱们还是先从最基本的元素开始实现吧. 本游戏雏形要实现的功能大致如下: 1.精灵在平面中自由移动到触摸位置,也可以手指按住精灵将其拖动到指定位置. 2.精灵在移动中遇到障碍物 3.精灵发射子弹 4.子弹如何击中目标,也就是敌方精灵 5.一些游戏效果的实现,比如子弹打中目标后的爆炸效果 我们从0

(NO.00002)iOS游戏精灵战争雏形(十二)

首先要声明的是,前几篇实现的shoot方法不是一定会命中目标,这取决于目标运行的速度,子弹的速度,子弹发射的时机以及弹道路径中是否有障碍物等等. 这也是符合实际情况的.如果你的要求是一旦发出子弹必定击中目标,那么代码逻辑就会完全不一样. 但这不是本章要说的事儿.本章进一步完善子弹击中目标后的爆炸效果. 首先打开SpriteBuilder,在Sprites文件夹中新增Explode.ccb文件,类型为粒子节点.按照下图设置好粒子系统属性: 其他属性皆为默认.可以按Start Particles按钮

(NO.00002)iOS游戏精灵战争雏形(二)

在SpriteBuilder中新建Images文件夹,将所需要的图片素材全部拖入其中: 别忘了将其转换为智能精灵图表文件夹. 因为我们不需要为ipad和安卓设计,所以在项目设置里将所有出iphone以外的选项都勾掉: 在SpriteBuilder中再新建Obstacle文件夹,在其中添加3种类型的墙,2种用来遮挡x轴和y轴,另一种作为游戏里的障碍物.其实这里可以有很多种做法,只要达到目的即可. 首先建立x轴遮拦墙,新建类型为Node的CCB文件,拖入一个CCNodeColor到其Root节点中去

(NO.00002)iOS游戏精灵战争雏形(五)

完成了精灵自己移动之后,我们开始着手实现按住精灵拖动的功能. 要想处理触摸事件,我们需要做2件事: 1.在类的初始化中打开触摸接收属性 2.实现触摸处理回调方法 我们依次来做这2件事. 首先要搞清楚在哪里打开触摸接收.是在MainScene场景中吗?也不是不可以,但是那样你必须要判断触摸位置是否在精灵节点上,然后再调整精灵的位置. 我们这里直接在精灵的Player类中开启触摸.首先在Player的初始化方法中开启触摸: -(void)didLoadFromCCB{ self.userIntera

(NO.00002)iOS游戏精灵战争雏形(六)

接下来我们给MainScene场景再添加一个精灵,作为敌人. 双击SpriteBuilder中的MainScene.ccb,从控件库拖入一个CCSprite到CCPhysicsNode中,设置精灵帧为一个不同的大头贴;设置自定义类为Player,代码连结名称为_sprite2;打开对应的物理对象,设置内容和_sprite1类似: 有了敌人就可以完成射击功能了. 我们还要在SpriteBuilder中添加一个Bullet.ccb文件,类型为CCSprite.需要做的主要工作就是打开物理对象,调整碰

(NO.00002)iOS游戏精灵战争雏形(三)

在Sprite中新建Sprites文件夹,在其中添加Player.cc文件,确保其类型为Sprite. 将其Root节点的CCSprite的精灵帧设置为Image/sprite-2.png,然后打开物理对象,调整Physics shape类型为Circle,同时调整圆半径以和节点图片大小相匹配,设置该物理对象的类型为动态. 设置Player根节点的自定义类为Player. 双击打开MainScene.ccb文件,将x和y遮蔽墙和障碍物墙拖入场景,并调整其至合适位置: 连接红色精灵到代码的名称为_

(NO.00002)iOS游戏精灵战争雏形(八)

子弹的初始化工作前2篇基本做好了,下面就是如何射出子弹. 通常来说,子弹射向目标对象,需要走一条直线.直线由2点定位,分别为发射点和目标点. 发射点就是开枪精灵自身的位置,目标点则为敌方精灵的位置,大致如下图所示: 由初中物理力学原理可知,要想子弹沿中间橙色路径飞行,需要在子弹上附加(x,y)的力矩.大概是这个意思,物理好的童鞋可以自行理解.物理不好的童鞋,我也救不了你们 ;) 现在就是要找到(x,y)的值?从上图中可以发现x恰好等于红精灵位置x值与绿精灵位置x值的差,y值与此相同,于是我们得到

(NO.00002)iOS游戏精灵战争雏形(四)

在Xcode打开MainScene,添加初始化代码如下: -(void)didLoadFromCCB{ NSAssert(_sprite1, @"_sprite1 must not nil"); _physics.debugDraw = YES; _sprite1.position = ccp(0.4,0.3); CCActionMoveTo *move = [CCActionMoveTo actionWithDuration:5 position:ccp(0.8, 0.8)]; [_

(NO.00002)iOS游戏精灵战争雏形(九)

打开MainScene.m,添加shoot方法: //子弹速度现在和目标距离相关,越近速度越慢,反之越快.应该修改为恒定速度. -(void)shoot:(CCNode*)player target:(CGPoint)point{ CGPoint velocity = ccpSub(point, player.position); velocity = ccpMult(velocity, 50); if (ABS(velocity.x) < 20 || ABS(velocity.y) < 20