- 博客(114)
- 资源 (8)
- 收藏
- 关注
原创 SpriteBuilder改变布局后App运行出错代码排查
原来整个关卡场景放在GameScene.ccb中,后来觉得移到专门的Level.ccb比较好.移动过后编译运行,只要移动Player的胳膊发射子弹时,Xcode报错:g due to Chipmunk error: Body's angular velocity is invalid. Failed condition: body->w == body->w && cpfabs(body->
2015-10-29 11:00:43 775
原创 SpriteBuilder复杂CCB在App场景加载时报错排查
Player.CCB由body和arm两部分组成,它们都开启物理使能.在GameScene.ccb中新建一个物理对象,将Player.ccb拖入该对象.此时编译运行App均正常.然后继续添加其他物理对象Wall.ccb组成屏幕边界,这时App运行发生错误,log为:Collection <__NSArrayM: 0x78f97730> was mutated while being enumerat
2015-10-29 10:09:29 732
原创 SpriteBuilder中节点位置类型为百分比时不能定位的解决
Ball.ccb类型是Node,其中有个子节点为Color Node,其中物理使能.MainScene.ccb中加入一个物理节点,将Ball.ccb拖入其中,成为该物理节点的孩子,这时出现了一个”怪”现象:如果Ball的位置类型为point时,设置其位置坐标(x,y)可以正确反应位置变化.但是只要x或y任一坐标轴位置类型设置为百分比,则Ball在该轴上无法移动.在这个问题上耽搁了好久,后来发现原因很
2015-10-29 07:06:53 754
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(三十):增加排行榜功能3
在这个例子中,我们的显示代码只需要选手的名字以及对应的成绩.根据选手名字取对应的成绩可以用前面实现的playerRecord:方法,我们只需要将按照成绩排序后的选手名字返回就可以了.我只需要再实现一个函数,就是返回已经排好序选手的姓名数组,在GameState.h接口文件中添加allSortedPlayers方法:-(NSArray*)allSortedPlayers;接下来在GameState.m
2015-10-28 12:35:06 732
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十九):增加排行榜功能2
接下来回到Xcode中,首先在PopupLayer.m中添加justClose方法:-(void)justClose{ [self.gameScene removePopup];}然后在GameInterface.m中添加showRecords方法:-(void)showRecords{ [_gameScene showPopupNamed:@"Layers/RecordsLaye
2015-10-28 12:16:45 737
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十八):增加排行榜功能
游戏大体上基本也就完成了,还差一个排行榜.否则如何激励各位选手创造新纪录呢?排行榜功能也没什么难的,不过需要一点点排序的算法上的考虑.这里我们把排行榜记录数据和排序都放在GameState类中,在GameScene类中只要完成2件事:1.每次选手到达终点时更新记录 2.玩家点击Record后弹出排行榜菜单窗口,里面按成绩将选手排序.首先我们打开SpriteBuilder,新建一个菜单窗口: 在L
2015-10-28 11:58:52 1106
翻译 Chipmunk碰撞形状:cpShape
目前有3种碰撞类型:圆(Circles):最快并且最简单的碰撞形状线段(Line segment):主要用于静态形状.可以表示斜线(Can be beveled in order to give them a thickness)凸多边形(Convex polygons):最慢,但最灵活的碰撞形状.你可以给物体添加任何多个形状.这就是为什么2种类型是分开的?当创建不同类型的形状,你总是得到一
2015-10-28 08:30:20 1069
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十七)
切换回Xcode,在GameScene.m中添加新的实例变量:_winLayer. 接下来在第一个选手到达终点时,我们可以完成选手胜利的动画特效了.首先,在GameScene.m中添加一个新方法playerWin:-(void)playerWin:(CCSprite*)player{}我们需要将冠军玩家传递给该方法.注意参数的类型是CCSprite而不是Player,虽然Player直接继承自CCS
2015-10-26 16:34:50 701
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十六)
到目前为止,选手跑到终点时仿佛没什么激动人心的事情发生呢?貌似需要添加一些胜利的特效啊!前面说好的不添加特效,只完成游戏功能的诺言呢? ;)我们主要想实现这样一个特效效果:1.胜利的玩家突出显示在屏幕中心位置 2.玩家激动的jump中 3.玩家背后放射出万丈胜利的光芒前2个可以用动作来搞定,最后一个需要用粒子效果完成.好在有SpriteBuilder,我们不用写一行代码 ;)直接打开Sprite
2015-10-26 16:18:41 751
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十五)
每次压赌要打开弹出菜单还是让人略觉不爽,下面我们再添加一个随机押注的按钮:自动随机选择选手和下赌金额.打开spriteBuilder,修改GameInterface.ccb的界面,在Run按钮旁边添加一个新Rnd按钮,设置其回调方法为randomPick:回到Xcode中,写别忙着写代码.简单考虑下,randomPick最终应该在哪里实现?因为修改betPlayer要在GameScene类里,所以我
2015-10-26 16:01:47 732
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十四)
我们回到Xcode,打开GameScene.m,首先要添加实例变量:CCNode *_trackLine;为了根据选中的赛道更新_trackLine的位置,我们添加一个显示方法:-(void)selectTrack:(NSInteger)betPlayerIndex{ NSInteger i = PlayerCount - betPlayerIndex; NSValue *value
2015-10-26 15:49:58 794
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十三)
现在还有一个视觉上的问题:玩家每次在游戏开始前选择某一赛道时,无法直观的看到所选的是哪条赛道.只能通过界面上方的gambleLabel中的文字非直观的看到.我们现在来完善它!为了能让玩家清楚地看到,可以尝试增加选中的视觉效果.这里我们打算给选中赛道增加一个选择框表示当前选中.要实现该功能有多种方法:1.在draw回调方法中添加OpenGL的绘图代码,在对应位置画选择边框. 2.使用cocos2D的
2015-10-26 15:42:07 931
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十二)
自己的游戏自己更需要多玩,这样才能首先发现不足的地方。所以本猫到现在已经忍一个地方很久了,就是弹出moneyLayer后每次都要输入数字才能关闭,这多少让人不爽。于是本篇我们就修正这个小小的不便。首先在第一次弹出该窗口时我们随机设置一个合适的数字,如果是第二次弹出该窗口我们只是保持原先的值不便即可。我们打开PopupLayer.m修改didLoadFromCCB方法:-(void)didLoadFr
2015-10-26 15:22:14 728
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十一)
现在游戏中如果钱用光了赌场也是不管的,所以我们要加上Game Over的逻辑。出现游戏结束条件很简单,就是GameState的totalMoney <= 0.而在游戏结束时我们要做些什么呢?有很多种展现的形式,我们这里就弹出一个菜单,然后让玩家选择重新开始或是回到游戏主菜单。打开SpriteBuilder,新建一个GameOverLayer.ccb文件,类似于PopupMoneyLayer.ccb的
2015-10-26 15:07:18 698
原创 SpriteBuilder中应用智能精灵集之后提示找不到文件的解决
SpriteBuilder中有一个将方便的功能,可以用文件夹中的若干图片生成1张图片;这称之为智能精灵集合(smart sprite sheet).好处是可以一次性的加载图片到显存中去,提升了性能.但是开启该特性之后,原来一些通过文件名访问的方法和函数会出现提示找不到文件的错误.这时2种办法解决:1.不使用Smart Sprite Sheet机制,所有找寻文件的方法都可以恢复工作了。player.s
2015-10-25 15:43:04 719
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二十)
下面修改最为关键的matchRun方法里的代码:CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{ _finishedCount++; [player endMatch]; [player stopAction:repeatJump];
2015-10-24 20:27:33 614
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十九)
最后就是要完成前面设定的第3件事:如果玩家赌对了则赢钱,反之输钱.前面的框架搭的差不多了,所以这里实现起来也就不难了 ;)首先我们怎么知道用户输入完毕,然后关闭窗口了?只有在这个点上GameScene才能做下一步操作,比如将实例变量_isBeted置为YES.一个可能的方法是创建一个回调协议,在GameScene实现该协议.一旦菜单窗口关闭就调用协议中的方法.因为这个例子中的菜单窗口不多,回调也不复
2015-10-24 20:17:42 712
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十八)
现在需要实现具体的游戏逻辑大致如下:玩家点击某条赛道选择一个选手,然后会弹出菜单窗口让玩家输入压赌的金额,如果输入的金额值非法,则在GameInterface下部的状态栏中显示提示,要求玩家重新输入;如金额合法,则玩家可以关闭窗口,点击Run按钮运行游戏.下面逐步实现,每一次都是功能上的小修小补.首先在GameScene.m里添加实例变量,用来确定用户是否压过注了:BOOL _isBeted;在ma
2015-10-24 20:03:23 647
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十七)
因为现在游戏内容原来越多了,里面需要存储的数据也多了起来,所以一个较好的办法是将所有的比赛数据存到同一个地方便于存取.我们需要新建一个游戏数据类,该类贯穿所有需要的场景,存放一切比赛需要的数据.从这里看,这个类应该是一个单例类.(不太清楚单例模式的童鞋可以去度娘恶补一下).而且该类和Cocos2D图形没什么关系,所以它可以继承自NSObject类,我们下面来试下它.切换至Xcode,新建Cocoa类
2015-10-24 19:45:29 644
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十六)
接上篇,我们实现菜单窗口的弹出和关闭功能,首先在打开GameScene.m,添加必要的实例变量: __weak PopupLayer *_popupLayer;再添加2个新方法:-(void)removePopup{ if (_popupLayer) { NSString *popupName = _popupLayer.name; [_popupLay
2015-10-24 19:29:46 646
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十五)
现在啃第2个问题:如何让玩家输入赌注金额.实现的方法有很多种,比如可以限制玩家只能从特定的金额中选择,把每个选择做成一个按钮即可.以下是一个假想选择窗口的示意图:这样没有玩家的输入问题了.缺点是不太自由.我们希望实现一个用户可以输入任意金额的功能.因为要实现为一个弹出窗口的模式,所以下面我们首先在SpriteBuilder中把基本的窗口画出来.打开SpriteBuilder,在Layers文件夹中新
2015-10-24 19:16:54 655
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十四)
下面要启用场景的触摸功能,在GameScene.m的didLoadFromCCB方法里添加下面一行: self.userInteractionEnabled = YES;然后还需要给GameScene添加一个实例变量,用来存放玩家选择选手的编号: NSInteger _betPlayer;下面添加触摸回调方法.因为这里只需要处理用户按下去的动作,所以很简单,不用管用户移动手指和触摸完成和
2015-10-24 18:44:01 618
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十三)
游戏特效部分就先这样了,因为毕竟是Lite版本,而且是第一个App,所以咱们把主要精力放在游戏可玩逻辑上吧(虽然已经厚颜无耻的加了不少特效了).说句题外话:游戏美工是独立开发者不可逾越的鸿沟,是无法治愈之痛.本猫三脚猫的美工素养暂时也只能实现这样了.这个不仅仅要恶补制图工具的使用技术,而且还需要一点点美学上的天赋吧.我看过网上有位国外的很热爱独立开发App游戏的仁兄,也在自己的blog上写开发的心路
2015-10-24 18:31:57 636
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十二)
如果选手能在加速的时候屁股产生推进器效果就跟好了,仿佛选手腾云驾雾的感觉.我们可以用Cocos2D中的CCMotionStreak类来轻松实现.下面在Player.h接口文件添加以下代码:@property (nonatomic,strong) CCMotionStreak *streak;然后在matchRun方法添加代码:CCSpriteFrame *frame = [[CCSpriteFram
2015-10-24 18:08:50 792
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十一)
之前的10篇内容主要实现了选手从起点移动至终点的动作,比较随机的模拟了选手的速度变化,另外完成了选手到达终点时该做的事情.接下来的几篇中我们进一步完善SpeedBoy Lite项目,使它真正成为一个可玩的小游戏.首先添加几个新的人物大头像,好歹也是8条赛道,别老是8胞胎似得一起跑,起码人物要区分开.于是祭出Ai,在新加6个人物头像,如下:全部本猫手绘出来的,手确实蛮累的 ;)下面依次将新画的6副大头
2015-10-24 18:06:12 705
原创 SpriteBuilder中CCMotionStreak坐标类型不匹配
在SpriteBuilder需要被跟随的(或是说被拖尾的)节点坐标类型是父百分比,先是将CCMotionStreak本身位置设置为百分比类型,但是无效.将节点坐标改为正常点类型后,MotionStreak可以正常显示.于是要做一个百分比坐标到点坐标的类型转换: _viewSize = [CCDirector sharedDirector].viewSize;注意这里必须是屏幕点的大小,而不是像
2015-10-21 12:19:27 698
原创 SpriteBuilder中CCMotionStreak提示图片文件找不到
今天写代码时遇到上述问题,代码如下:player.streak = [CCMotionStreak streakWithFade:3.f minSeg:1 width:30 color:[CCColor whiteColor] textureFilename:@"ccbResources/ccbParticleSnow.png"];运行出错,console中显示png路径不存在.路径肯定是正确的.而
2015-10-21 10:36:53 713
转载 OS X 10.11 中的安全删除文件
在 OS X 10.11 中安全倾倒垃圾桶这个功能已经被取消了.是因为 SSD 闪存硬盘的原因 . 安全删除操作并不能安全清除. 所以就直接取消了. 但是其实其实还是可以在系统内使用安全删除功能的. 保证删除的文件安全,减少被数据恢复的风险. 需要使用 srm 这个命令. srm -v 是安全删除文件 srm -rv 是安全删除目录然后打开终端然后输入命令后 空格, 将要安全删除的文件或者目录拖拽
2015-10-20 21:02:51 1331
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(十)
上篇最后遇到是神马问题呢?原来由于现在seq动作的时间变得不确定了,jump的持续时间不能对应发生变化,导致可能选手在比赛后边就没有跳跃动作了!这虽不影响整个代码逻辑,却多少有些让玩家不爽.一种解决办法就是,将jump动作设置为永久重复动作,然后在回调block中将其关闭即可.因为Obj-C中的block是闭包(不太清楚闭包的童鞋请自行度娘),所以在block中引用外面的jump都不是个事儿.下面是
2015-10-20 18:50:24 793
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(九)
我们回到matchRun方法中去尝试第一次修改,部分代码如下:CCActionMoveBy *moveBy = [CCActionMoveBy actionWithDuration:duration position:ccp(0.9f, 0)]; CCActionJumpBy *jump = [CCActionJumpBy actionWithDuration:duration pos
2015-10-20 18:42:49 749
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(八)
前一篇提到,如果要想动态修改选手的速度需要在update方法中添加代码.因为update方法在游戏每一帧都会调用,所以我们不可能修改的太频繁.否则一来对性能有影响,而来玩家表现的极不自然,像抽风一样.所以我决定,在一场比赛中每位选手的速度最多只能修改5次,先在GameScene中添加如下静态变量与常量:static const NSInteger MaxChanged = 5;static NSI
2015-10-20 18:23:54 720
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(七)
因为我们之前在GameScene中建立的2个数组,分别为player和label的数组.大家可以注意到其中每个元素是一一对应的.知道了这层关系,我们尝试来更新matchRun方法:CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{ _finishedCount++; [playe
2015-10-20 18:03:00 743
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(六)
为了能让玩家可以在比赛结束时清楚看到每位选手的成绩,我们需要在GameScene场景的track对象中添加一些新的元素.在SpriteBuilder中打开GameScene.ccb,创建1个标签对象,使其成为track的子对象.注意不是GameScene根节点的子对象哦.修改该标签的位置使其差不多位于第1赛道的后半场跑道中,比如我将其放在相对于父对象的(60%,3%)位置上.按照个人喜好修改字体和文
2015-10-20 17:27:37 724
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(五)
在GameScene.m中添加matchRun的实现:-(void)matchRun{ CCLOG(@"%@ invoke!",NSStringFromSelector(_cmd)); //如果比赛还未结束,啥都不做直接退出. if (_matching) { return; } //重置比赛设置 [self matchReset];
2015-10-20 17:07:22 631
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(四)
下面我们来实现选手从起点开始移动到终点的代码.首先在GameScene.h接口中添加matchRun方法:#import "CCNode.h"@interface GameScene : CCNode-(void)matchRun;@end因为GameScene中覆盖了GameInterface交互层,里面有一个run按钮.这个按钮的功能肯定不是由GameInterface类来完成,最终需要调用Ga
2015-10-20 16:43:12 648
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(三)
在Xcode中建立新类Player,继承自CCSprite.因为我们之后需要方便的更换玩家的大头贴,所以需要能够以不同的大头贴参数初始化Player对象.不过别急,想想我们还需要在Player对象初始化中传入神马参数?一种可能是玩家的名字和编号.所以首先在Player接口中声明2个属性:@property (nonatomic,strong) NSString *playerName;@prope
2015-10-20 16:23:15 703
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(二)
打开SpriteBuilder生成的Xcode项目文件,首先在MainScene添加play回调函数:-(void)play{ CCScene *gameScene = [CCBReader loadAsScene:@"GameScene"]; [[CCDirector sharedDirector]replaceScene:gameScene];}这样玩家从游戏主界面点击play
2015-10-20 16:07:06 619
原创 (NO.00001)iOS游戏SpeedBoy Lite成形记(一)
这是本猫第一个原创iOS游戏,留此为证!看编号貌似要写9万多个,千锤百炼还是太少吧!? ;)这是一个赛跑游戏,几位选手从起点跑到终点看谁用的时间最少.现在需要实现的功能是:1.8位选手从起点移动至终点 2.到终点后记录每位选手所用的时间第一步不是写代码,而是画素材,因为是原创,所以游戏人物和比赛跑道也需要自己打造.首先用Ai画一个简单的跑道,共有两场图分辨率分别为1036x640(iphone 5
2015-10-20 15:53:30 775
翻译 Cocos2d中update与fixedUpdate的区别(六)
它如何工作呢?update:和fixedUpdate:方法实际这样工作.Cocos2D将从iOS接口中取得时间间隔(delta)在你的游戏代码执行期间,并且检查fixedUpdate:方法在间隔期间应该被调用多少次.然后Cocos2D调用fixedUpdate:方法需要的次数.换句话说,它只是将时间间隔分割成均匀的小块,然后再在每个小块中调用fixedUpdate方法.这就是为什么传递给fixed
2015-10-16 10:28:42 1120
翻译 Cocos2d中update与fixedUpdate的区别(五)
在真实情况中update:和fixedUpdate方法如何去调用?由上所述,所以update方法在每帧被调用1次,从而给你一个机会去更新你的游戏对象的状态在其绘制之前.而fixedUpdate:方法在一个恒定的速率中被调用,同样给你一个机会去反映出各个帧之间的状态,甚至丢掉的那些帧里.下面是当帧率高而稳定的情况示意图:在Cocos2D中包括update:和fixedUpdate:的间隔默认被设置为
2015-10-16 10:13:49 894
SwiftUI 超酷炫动画示例大合集
2024-01-08
MacOS 和 iOS 内核 xnu 可编译源代码
2024-01-08
SwiftUI 示例 iFonts 应用完整项目源代码
2024-01-08
SwiftUI 各种界面、自定义视图、动画以及设计哲学示例合集
2024-01-08
SwiftUI 英雄动画(HeroAnimations)演示代码
2024-01-08
iOS 15.4 真机调试支持包(可支持最新的iOS 15.4.1系统)
2022-04-03
SwiftUI编程实现不同TabView标签页中任意导航层级视图之间相互跳转的演示代码
2022-04-03
unlocker_new
2008-11-10
UnlockerEx
2008-04-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人