(NO.00001)iOS游戏SpeedBoy Lite成形记(十二)

如果选手能在加速的时候屁股产生推进器效果就跟好了,仿佛选手腾云驾雾的感觉.我们可以用Cocos2D中的CCMotionStreak类来轻松实现.下面在Player.h接口文件添加以下代码:

@property (nonatomic,strong) CCMotionStreak *streak;

然后在matchRun方法添加代码:

CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"ccbResources/ccbParticleSnow.png"];
        player.streak = [CCMotionStreak streakWithFade:3.f minSeg:1 width:30 color:[CCColor whiteColor] texture:frame.texture];
        NSAssert(player.streak, @"streak is nil");
        [self addChild:player.streak];

CCMotionStreak是Cocos2D中的一个特效类,特别擅长实现移动对象的拖尾效果,比如射出子弹后面的弹道等东东.这里用ParticleSnow纹理填充拖尾的图像,其他参数可以到Cocos2D API中查询.

光是这样是不能实现拖尾效果的,我们还得在适当的时候不断更新streak的位置.在神马时候呢?一个合适的地方是GameScene的update回调方法中.找到该方法,在最下方添加新的代码:

if (_matching) {
        for (Player *player in _players) {
            //如果选手速度较快,显示出加速特效
            if (player.speed.speed >= 1.2) {
                player.streak.visible = YES;
                CGPoint pos = ccp(player.position.x * _viewSize.width, \
                                  player.position.y * _viewSize.height);
                player.streak.position = pos;
            }else{
                player.streak.visible = NO;
            }
        }
    }

代码注释写的很清楚,如果选手达到一定的速度,我们给他添加拖尾的加速效果.因为SpriteBuilder中元素的定位类型是百分比,这里必须将其转换为点类型.

如果不出意外的话,编译项目,运行效果如下:

时间: 2024-09-01 05:48:52

(NO.00001)iOS游戏SpeedBoy Lite成形记(十二)的相关文章

(NO.00001)iOS游戏SpeedBoy Lite成形记(十八)

现在需要实现具体的游戏逻辑大致如下: 玩家点击某条赛道选择一个选手,然后会弹出菜单窗口让玩家输入压赌的金额,如果输入的金额值非法,则在GameInterface下部的状态栏中显示提示,要求玩家重新输入;如金额合法,则玩家可以关闭窗口,点击Run按钮运行游戏. 下面逐步实现,每一次都是功能上的小修小补. 首先在GameScene.m里添加实例变量,用来确定用户是否压过注了: BOOL _isBeted; 在matchRun方法里要判断,如果没有押注则提示用户并直接退出方法: if (!_isBet

(NO.00001)iOS游戏SpeedBoy Lite成形记(十五)

现在啃第2个问题:如何让玩家输入赌注金额. 实现的方法有很多种,比如可以限制玩家只能从特定的金额中选择,把每个选择做成一个按钮即可.以下是一个假想选择窗口的示意图: 这样没有玩家的输入问题了.缺点是不太自由. 我们希望实现一个用户可以输入任意金额的功能.因为要实现为一个弹出窗口的模式,所以下面我们首先在SpriteBuilder中把基本的窗口画出来. 打开SpriteBuilder,在Layers文件夹中新建一个Node文件PopupMoneyLayer.ccb,然后将网上找到的窗口背景图片拖入

(NO.00001)iOS游戏SpeedBoy Lite成形记(十六)

接上篇,我们实现菜单窗口的弹出和关闭功能,首先在打开GameScene.m,添加必要的实例变量: __weak PopupLayer *_popupLayer; 再添加2个新方法: -(void)removePopup{ if (_popupLayer) { NSString *popupName = _popupLayer.name; [_popupLayer removeFromParent]; _popupLayer = nil; self.userInteractionEnabled =

(NO.00001)iOS游戏SpeedBoy Lite成形记(十)

上篇最后遇到是神马问题呢? 原来由于现在seq动作的时间变得不确定了,jump的持续时间不能对应发生变化,导致可能选手在比赛后边就没有跳跃动作了!这虽不影响整个代码逻辑,却多少有些让玩家不爽. 一种解决办法就是,将jump动作设置为永久重复动作,然后在回调block中将其关闭即可.因为Obj-C中的block是闭包(不太清楚闭包的童鞋请自行度娘),所以在block中引用外面的jump都不是个事儿. 下面是完整的matchRun方法的实现: -(void)matchRun{ CCLOG(@"%@

(NO.00001)iOS游戏SpeedBoy Lite成形记(十四)

下面要启用场景的触摸功能,在GameScene.m的didLoadFromCCB方法里添加下面一行: self.userInteractionEnabled = YES; 然后还需要给GameScene添加一个实例变量,用来存放玩家选择选手的编号: NSInteger _betPlayer; 下面添加触摸回调方法.因为这里只需要处理用户按下去的动作,所以很简单,不用管用户移动手指和触摸完成和取消的方法啦. -(void)touchBegan:(CCTouch *)touch withEvent:

(NO.00001)iOS游戏SpeedBoy Lite成形记(十九)

最后就是要完成前面设定的第3件事:如果玩家赌对了则赢钱,反之输钱. 前面的框架搭的差不多了,所以这里实现起来也就不难了 ;) 首先我们怎么知道用户输入完毕,然后关闭窗口了?只有在这个点上GameScene才能做下一步操作,比如将实例变量_isBeted置为YES. 一个可能的方法是创建一个回调协议,在GameScene实现该协议.一旦菜单窗口关闭就调用协议中的方法. 因为这个例子中的菜单窗口不多,回调也不复杂.所以我们用另一种方法,就是给每个弹出窗口赋予一个唯一的名字,然后在GameScene的

(NO.00001)iOS游戏SpeedBoy Lite成形记(一)

这是本猫第一个原创iOS游戏,留此为证!看编号貌似要写9万多个,千锤百炼还是太少吧!? ;) 这是一个赛跑游戏,几位选手从起点跑到终点看谁用的时间最少.现在需要实现的功能是: 1.8位选手从起点移动至终点 2.到终点后记录每位选手所用的时间 第一步不是写代码,而是画素材,因为是原创,所以游戏人物和比赛跑道也需要自己打造.首先用Ai画一个简单的跑道,共有两场图分辨率分别为1036x640(iphone 5+)和960x640(iphone 4s),没打算在ipad上跑,所以2张就够了: 接着是选手

(NO.00001)iOS游戏SpeedBoy Lite成形记(三十):增加排行榜功能3

在这个例子中,我们的显示代码只需要选手的名字以及对应的成绩.根据选手名字取对应的成绩可以用前面实现的playerRecord:方法,我们只需要将按照成绩排序后的选手名字返回就可以了. 我只需要再实现一个函数,就是返回已经排好序选手的姓名数组,在GameState.h接口文件中添加allSortedPlayers方法: -(NSArray*)allSortedPlayers; 接下来在GameState.m中实现它: -(NSArray*)allSortedPlayers{ NSArray *ke

(NO.00001)iOS游戏SpeedBoy Lite成形记(十一)

之前的10篇内容主要实现了选手从起点移动至终点的动作,比较随机的模拟了选手的速度变化,另外完成了选手到达终点时该做的事情. 接下来的几篇中我们进一步完善SpeedBoy Lite项目,使它真正成为一个可玩的小游戏. 首先添加几个新的人物大头像,好歹也是8条赛道,别老是8胞胎似得一起跑,起码人物要区分开.于是祭出Ai,在新加6个人物头像,如下: 全部本猫手绘出来的,手确实蛮累的 ;) 下面依次将新画的6副大头贴拖入SpriteBuilder,发布资源.然后修改player初始化的代码如下: Pla