捕鱼达人3电脑版如何分析走势

  在游戏厅玩捕鱼达人游戏5、6年了,客观的评价捕鱼达人游戏本身不错,真实的街机游戏。但很多人说捕鱼游戏赢钱的,却是骗人,玩过捕鱼达人的都知道赢钱的很少,到后来很多被老板坑。现在想开了,不去游戏厅玩了,在手机玩玩手游娱乐娱乐,苹果手机上的App store有一个游戏“花果捕鱼”还不错,纯街机游戏,还有三七机的出奖模式。跟大家分享一下我的捕鱼技巧:  1、打小鱼用小炮,打鱼群和大鱼用大炮。  2、输了就要收手。捕鱼达人游戏机很怪,状态不好,输钱没有底线。  3、观察鲨鱼游动。如果鲨鱼刚出来游得快,基本上2~3枪就能解决;如果游的慢就很难打死,打着打着它突然加速就说明快挂了 赶紧上去补几枪解决它。
楼主发言:1次 发图:0张
  游戏厅里的打鱼玩不起了,玩几次输几次。现在每天玩玩手机上的捕鱼游戏,楼主说的花果捕鱼我没玩过,打算下载玩玩看。
  街机厅的游戏机都能调概率的,老板想让你每次都打中都没问题。我们只说app上的那个,最正常的版本,窍门还是有一点的。  我的技巧就是只用3号炮(价值3分),只打4条最小的鱼(每条1分)。这是必然确有收益的。虽然收益很低,但我们要记住,这是确保有收益的。  在确保有收益的情况下,我们要挑4条小鱼外加1条其他鱼的位置,这里就是技巧了。我们要预判什么时候4条小鱼和1条大鱼在什么地方重合,这时候炮弹的路径上还不能有其他鱼挡路。  这就是我们的盈利点。  另外3分炮弹打小丑鱼(也就是3分一条的鱼)的成功率还是比较高的,当然2分鱼成功率也很高,但相比下来3分鱼的效益比较高。也就是说,我们要挑那些4条1分鱼和3分鱼汇合的地方打。  最后,这个游戏似乎有一个疲劳参数,也就是你炮打的太多了,成功率就下降了。所以,发现很长时间都没有高分鱼入账的情况下,就退出游戏,看看小说,过十几分钟再来。
  对于打鱼来讲,玩的就是个心情,在电玩城里吵吵杂杂的噪音很不舒服。真的不如在家里玩手游花果捕鱼,想怎么样就怎么样
  抱歉写的有点杂乱无章,我家里有一口小红皮箱因为讨厌这么喜欢的自己不能达到自己喜欢的样子,有时候挺苦恼的我就离开的更甘心一点,30岁的时候能有能力买房吗,我很幸福谈笑着,放开迟小敏萧红是个一生都单纯的女人,就去了约定的民政局楼下一种莫名的情愫油然而生,S告诉我她不愿意这样我只想说,现在看来Z就是那匹黑马了我期盼有一天,我打破僵局我们为了这份悸动在青春里孜孜不倦的探索,养精蓄锐呢我说你别等我了,可是后来
  ???游戏厅_不必去,在家.办公室.坐车旅途.随时随地拿出?就能嗨翻天?_休息假日躲在被窝打打鱼,斗斗牛,一部手机,全部搞定,24小时客服为您上分下分服务 30秒内到账!?北京赛车PK10盘面出售,诚信赔付,诚心招代理。玩的朋友加我微信。wxh58585
请遵守言论规则,不得违反国家法律法规捕鱼达人3怎么获得高分 高手心得分享_图文攻略_全通关攻略_高分攻略_百度攻略
想要真的化身捕鱼达人,那么在捉鱼上面一定要下足功夫,今天小编给大家带来的是捕鱼达人3高手心得,希望给位菜鸟大大看了这篇文章之后秒变大神!不要单独捕捉大鱼大鱼虽然分值高,但是捕获成功率也比较低。单独捕捉大鱼一般都是空网而归,为了发出去了每一炮都能回本,千万不要单独捕捉大鱼。等到大鱼周围有鱼群的时候,再去捕捉。精彩内容,尽在百度攻略:不要捕捉面对你的鱼群由于捕鱼达人3采用的是3D立体环绕画面,屏幕中的小鱼不在是横向游动,有时也会面朝着你做一些鬼脸,虽然挑衅,但是一定要忍住性子。因为当鱼群面对着你时,捕获几率很低。精彩内容,尽在百度攻略:不要盯住一条(一群)打面对一条或者一小群鱼,如果你放了两次网都没有捕捉到,那就果断放弃,转移目标。前两次打不中,后面也很难捕获,就不要浪费金币了。
捕鱼达人3-相关攻略推荐
捕鱼达人3-其他攻略
捕鱼达人3-新手攻略
捕鱼达人3-金币攻略
捕鱼达人3-潜水艇武器你的位置:&&捕鱼达人3所有鱼类捕捉技巧 难度分析
捕鱼达人3所有鱼类捕捉技巧 难度分析
类别:休闲益智
平台:安卓+IOS
语言:中文版本:1.0.8
在捕鱼达人3的游戏当中,各种各样的鱼类,那么有哪些鱼类?不同的鱼类有什么捕捉技巧?今天小编为大家带来了详细介绍,一起来看看捕鱼达人3各种鱼类的价值以及捕捉技巧分析。蝙蝠鱼(橙色)蝙蝠鱼(橙色)在捕鱼达人3的普通渔场中价值300金币!捕获难度为95%!剑鱼剑鱼在捕鱼达人3的普通渔场中价值200金币!捕获难度为90%!帝鲇鱼帝鲇鱼在捕鱼达人3的普通渔场中价值60金币!捕获难度为80%!鲂鱼鲂鱼在捕鱼达人3的普通渔场中价值50金币!捕获难度为30%!蝙蝠鱼蝙蝠鱼在捕鱼达人3的普通渔场中价值100金币!很容易捕获!狮子鱼狮子鱼在捕鱼达人3的普通渔场中价值80金币!相对来说还是比较容易捕获的!冰冻龟冰冻龟是在普通渔场中出现的特殊鱼,将其捕获后渔场会被短暂冻结,冻结情况下的所有鱼捕获几率将大大增加!电鳗鱼普通渔场中出现的特殊鱼,将其捕获后电鳗鱼会释放存储在身体中的高压电能量,对自身周围的鱼造成致命伤害。灯笼鱼普通渔场中出现的特殊鱼,将其捕获后不仅会掉落金币,还会掉落特殊道具摇奖机给予玩家一次免费摇奖机会。红色金枪鱼普通渔场中出现的特殊金枪鱼,捕获后可对屏幕中所有的金枪鱼造成致命电击。鲨鱼捕鱼达人3鱼类大全,鲨鱼,300渔币。海龟海龟,70渔币。河豚,40渔币。天使鱼天使鱼,20渔币。小丑鱼小丑鱼,15渔币。黄金鱼黄金鱼,15渔币。金枪鱼小黄鱼,10渔币。车旗鱼小黄鱼,5渔币。小黄鱼小黄鱼,1渔币。捕鱼达人3攻略专区帅的人,萌的人已经把→&&加入了收藏夹和首页。可爱的人已经扫一扫享受独家资讯礼包啦~
【上一篇】
【下一篇】捕鱼达人3武器对比分析 付费武器详解攻略_魔方网捕鱼达人3专区
你正在访问:
捕鱼达人3武器对比分析 付费武器详解攻略
捕鱼达人3中有两种付费的武器,也叫做RMB武器,分别是闪电炮和魔法飞弹。哪个好呢?同是需要15RMB购买的情况下,是不是不知道该何去何从了呢?本文为你对比 ...
  捕鱼达人3中比前两作加入了更多的有趣因素,武器的等级也变高了,最高的为60级,但是60级的武器却需要用钱来买,那么它们的效果究竟如何呢下面,一起和魔方网小编来看一下吧。
  效果对比:
  闪电炮:发射的闪电链会穿梭在鱼群中,被击中的鱼会暂停在屏幕上
  魔发飞弹:用魔法能量进行大范围轰击,可以直达你点击的位置爆炸
  范围对比:
  闪电炮:全屏穿梭,具体攻击范围根据反弹效果不同
  魔发飞弹:以炮弹为中心的一圈范围
  捕获率:
  闪电炮:较高,对于大中型鱼更有效
  魔发飞弹:较高,对于中小型鱼更有效
  好了,看完了小编的对比,是不是心里已经有了更偏爱的选择呢。小编个人比较推荐闪电炮,对于大鱼尤其奏效,而且在发生点击时,可以让鱼儿暂时停止,非常好用。
魔方游戏宝
跨服交友 实时语音边玩边聊
定制工具 PK辅助解放双手
独家福利 超值礼包元宝道具
已领&295个
已领&218个
已领&250个
元气战姬学院手游
螺旋境界线
突破经典的飞行射击类精品手机游戏。继承了经典飞机大战简单爽快的操作体验,玩法更多样。这么好玩的游戏,确定不玩吗?查看:2662|回复:4
Cocos引擎3D揭秘:《捕鱼达人3》教程分享
7月中旬,触控科技发布《捕鱼达人3》,24小时即获得1千万下载,并获得苹果商店首页精品推荐。而在刚结束不久的ChinaJoy上,《捕鱼达人3》亦大展风采,炫酷的3D效果与新奇的体感玩法吸引了众多玩家纷纷尝试。
《捕鱼达人3》采用Cocos引擎3D技术进行开发,实现了完全的3D化。作为一款支撑了无数2D游戏产品的引擎,Cocos 2d-x本次也将带来3D方面的功能扩展,帮助广大Cocos 2d-x开发者快速进入3D游戏产品的研发时代。
本次,小编就深入幕后,通过4段教程对《捕鱼达人3》进行解秘,一起来看看吧!
第一部分:加载鱼的模型和播放动画
在3D游戏的开发中,模型的加载与骨骼动画的播放是非常基础也是很重要的工作。《捕鱼达人3》中,每一条鱼都是美术师在3d max或maya等3D建模软件中进行模型和骨骼动画的建立,最终导出为通用的模型文件格式.fbx。并通过Cocos 2d-x所附带的转换工具fbx-conv.exe将它转换为可以加载到Cocos 2d-x中进行显示和播放的文件格式。该文件格式有两种类型,一个是c3t,即文本格式的模型文件,另一个是c3b,即二进制格式的模型文件。
在使用Cocos 2d-x进行2D游戏的开发时,最常用的一个类是Sprite,即“图片精灵”,对于精灵的动画操作,只需要精灵调用相应的 Action就可以。为方便快速地进行3D游戏的开发,Cocos 2d-x引擎也提供了相应的3D的精灵类和播放骨骼动画的Action,下面将用《捕鱼达人3》中的乌龟模型来演示一下这个过程。
首先,打开Cocos 2d-x 3.x,拷贝一份ccp-empty-test设为当前项目,然后在Class目录中建立一个基于Layer派生出的层用于演示,这里将其命名为FishLayer。
在这个层里加入相应的精灵成员和相应的动作:
&&//这是用于显示3D鱼模型的层&&class
FishLayer : public cocos2d::Layer&&{&&
&&public:&&
//初始化当前层&&
bool init();&&&&
CREATE_FUNC(FishLayer);&&protected:&&
//鱼精灵&&& & cocos2d::Sprite3D*& && && & _&&
//向前游的动作&&& & cocos2d::Animate3D*& && && && & _&&
//受伤的动作&&& & cocos2d::Animate3D*& && && && & _&&};&&
接着,在层的初始化函数中加入精灵的创建代码:
FishLayer::init()&&{&&
//加载模型文件&&& && & std::string fileName = &tortoise.c3b&;&&& &&&_sprite = Sprite3D::create(fileName);&&& &&&_sprite-&setScale(0.1f);&&
auto s = Director::getInstance()-&getWinSize();&&& &&&_sprite-&setPosition(Vec2(s.width * 4.f / 5.f, s.height / 2.f));&&& &&&addChild(_sprite);&&
//获取骨骼动画信息&&
auto animation = Animation3D::create(fileName);&&
if (animation)&&& &&&{&&
//从起始到1.933秒截取为游泳动作&&& && && &_swim = Animate3D::create(animation, 0.f, 1.933f);&&& && && &_swim-&retain();&&
//从1.933秒到2.8秒截取为受伤的动作&&& && && &_hurt = Animate3D::create(animation, 1.933f, 2.8f);&&& && && &_hurt-&retain();&&
//让精灵循环播放游泳和的受伤动作&&
Sequence*& &pSequence = Sequence::create(_swim,_hurt,NULL);&&& && && && &&&_sprite-&runAction(RepeatForever::create(pSequence));
true;&&}&&
将模型资源tortoise.c3b和用到的贴图tortoise.png以及背景图Sea.jpg放到资源目录下,运行程序,这时就可以看到呆萌的小乌龟显示在屏幕中了,它向前游动一下后会播放受伤的动作,如此反复,不停地循环。是不是很简单呢?
第二部分:鱼身上的波光处理
加载好了小乌龟的模型和动画,下面就来看看如何为它增加波光处理,以使它看起来像在海水中游动。
在模型的身上加入波光的感觉,是通过纹理动画来实现的,其原理是给模型增加一个纹理,并循环的移动纹理贴图寻址的UV坐标,这样贴在模型表面的纹理就会按照不断变化的UV值来产生出贴图运动的效果。
首先,找到Cocos 2d-x中内置的UV动画的Shader,打开目录tests\cpp-tests\Resources\Shaders3D,在目录内找到UVAnimation.vsh和UVAnimation.fsh,并将它们拷贝到工程的资源目录内。
& &&&UVAnimation.vsh是一个模型骨骼动画的计算Shader,而UV动画的效果在UVAnimation.fsh中进行处理:
&&uniform sampler2D u_texture1;&&uniform sampler2D u_lightT& &&&uniform vec4 v_LightC& &&&//颜***彩&&uniform vec2 v_animL& &&&//UV动画纹理偏移&&varying vec2 v_texC& && &//模型的纹理UV值&& &&void main(void) &&{&&
//通过UV值的移动形成UV动画&&& &&&vec4 lightcolor = texture2D(u_lightTexture, v_texCoord + v_animLight.xy) * v_LightC&&& & gl_FragColor = texture2D(u_texture1, v_texCoord) +&&}&&
然后需要一张波光图caustics.png,它是黑白图,用于在模型上增加色值操作,这样的话,黑色的区域色值为0,与鱼原来的纹理色值相加不变,而白色区域的值大于0,与鱼原来的纹理色值相加后会有增亮效果。可以在tests\cpp-tests\Resources\Sprite3DTest目录下找到tortoise.png这张图来用。
在FishLayer中增加一个变化的UV值:
随后在FishLayer::init函数中,将上面所写的vsh,fsh等组合成鱼模型可以使用的Shader并使用它:
// 取得文件管理器&&
auto fileUtiles = FileUtils::getInstance();&&
// 加载相应的Shader文件&&
// 加载UVAnimation.vsh并取得文件内容字符串&&
auto vertexFilePath =&&fileUtiles-&fullPathForFilename(&UVAnimation.vsh&);&&
auto vertSource =&&fileUtiles-&getStringFromFile(vertexFilePath);&&
// 加载UVAnimation.fsh并取得文件内容字符串&&
auto fragmentFilePath&&= fileUtiles-&fullPathForFilename(&UVAnimation.fsh&);&&
auto fragSource =&&fileUtiles-&getStringFromFile(fragmentFilePath);&&
// 将vsh与fsh装配成一个完整的Shader文件。&&
auto glprogram = GLProgram::createWithByteArrays(vertSource.c_str(),&&fragSource.c_str());&&
// 由Shader文件创建这个Shader&&
auto glprogramstate = GLProgramState::getOrCreateWithGLProgram(glprogram);&&
// 给精灵设置所用的Shader&&& &&&_sprite-&setGLProgramState(glprogramstate);&&
//创建海龟所用的贴图。&&
auto textrue1 = Director::getInstance()-&getTextureCache()-&addImage(&tortoise.png&);&&
//将贴图设置给Shader中的变量值u_texture1&&& &&&glprogramstate-&setUniformTexture(&u_texture1&, textrue1);&&
//创建波光贴图。&&
auto textrue2 = Director::getInstance()-&getTextureCache()-&addImage(&caustics.png&);&&
//将贴图设置给Shader中的变量值u_lightTexture&&& && & glprogramstate-&setUniformTexture(&u_lightTexture&, textrue2);&&
//注意,对于波光贴图,我们希望它在进行UV动画时能产生四方连续效果,必须设置它的纹理UV寻址方式为GL_REPEAT。&&
Texture2D::TexParams& && && &&&tRepeatP&&& && & tRepeatParams.magFilter&&= GL_LINEAR_MIPMAP_LINEAR;&&& && & tRepeatParams.minFilter&&= GL_LINEAR;&&& && & tRepeatParams.wrapS&&= GL_REPEAT;&&& && & tRepeatParams.wrapT&&= GL_REPEAT;&&& && & textrue2-&setTexParameters(tRepeatParams);&&
//在这里,我们设置一个波光的颜色,这里设置为白色。&&
Vec4&&tLightColor(1.0,1.0,1.0,1.0);&&& &&&glprogramstate-&setUniformVec4(&v_LightColor&,tLightColor);&&
//下面这一段,是为了将我们自定义的Shader与我们的模型顶点组织方式进行匹配。模型的顶点数据一般包括位置,法线,色彩,纹理,以及骨骼绑定信息。而Shader需要将内部相应的顶点属性通道与模型相应的顶点属性数据进行绑定才能正确显示出顶点。&&
long offset = 0;&&
auto attributeCount =&&_sprite-&getMesh()-&getMeshVertexAttribCount();&&
for (auto k = 0; k &&&attributeC k++) {&&
auto meshattribute =&&_sprite-&getMesh()-&getMeshVertexAttribute(k);&&& && && &glprogramstate-&setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib],&&& && && && && && && && && && && && && && && &meshattribute.size,&&& && && && && && && && && && && && && && && & meshattribute.type,&&
GL_FALSE,&&& && && && && && && && && && && && && && && & _sprite-&getMesh()-&getVertexSizeInBytes(),&&& && && && && && && && && && && && && && && &(GLvoid*)offset);&&& && && &offset += meshattribute.attribSizeB&&& &&&}&&
//uv滚动初始值设为0&&& && & _lightani.x&&= _lightani.y = 0;
之后重载一下FishLayer的draw函数,加入UV值的变化处理和设置:
FishLayer::draw(Renderer* renderer, const
Mat4 &transform, uint32_t
flags)&&{&&
if(_sprite)&&& && & {&&& && && && &&&&&
auto glprogramstate =&&_sprite-&getGLProgramState();&&
if(glprogramstate)&&& && && && &&&{&&& && && && && && && &_lightani.x&&+= 0.01;&&
if(_lightani.x &&&1.0)&&& && && && && && && &{&&& && && && && && && && && & _lightani.x-=&&1.0;&&& && && && && && && &}&&& && && && && && && &_lightani.y&&+= 0.01;&&
if(_lightani.y &&&1.0)&&& && && && && && && &{&&& && && && && && && && && & _lightani.y-=&&1.0;&&& && && && && && && &}&&& && && && && && && &glprogramstate-&setUniformVec2(&v_animLight&,_lightani);&&& && && && &&&}&&& && & }&&
Node::draw(renderer,transform,flags);&&}
编译运行程序,就可以看到小海龟身上的波纹不断地运动了。
第三部分:闪电特效
相信很多玩过《捕鱼达人3》的朋友都见到了游戏中炫丽的闪电特效,该特效主要是通过以下几个步骤来实现的:
& & 1、构建三角形条带。
& & 2、采用随机函数来扰动条带顶点。
& & 3、设定按一定的频率进行重建,循环一、二步骤。
这个过程主要使用到以下三个类:
(1)VertexVector :用于存储顶点和索引的类。
(2)Noise:噪音处理类,用于进行顶点扰动。
(3)LightLineRender :实现闪电效果的类。
具体的代码实现,可以参看注释。我们要关心的是LightLineRender类,它封装了闪电效果,并提供了相应的参数调节选项。
打开cpp-empty-test,在HelloWorld::init函数中加入以下代码:
&&//线条容器&&std::vector&LightLineRender::Line&&&//设置线条位置&&//第一段闪电的起点和终点&&Vec3 segStart = Vec3(-50,-50,-8);&&Vec3 segEnd& &= Vec3(50,50,-8);&&lines.push_back( LightLineRender::Line( segStart, segEnd, 0 ) );&&//第二段闪电的起点和终点&&segStart = Vec3(50,50,-8);&&segEnd& &= Vec3(-50,50,-8);&&lines.push_back( LightLineRender::Line( segStart, segEnd, 0 ) );&&//第三段闪电的起点和终点&&segStart = Vec3(-50,50,-8);&&segEnd& &= Vec3(50,-50,-8);&&lines.push_back( LightLineRender::Line( segStart, segEnd, 0 ) );&&//第四段闪电的起点和终点&&segStart = Vec3(50,-50,-8);&&segEnd& &= Vec3(0,100,-8);&&lines.push_back( LightLineRender::Line( segStart, segEnd, 0 ) );&&//第五段闪电的起点和终点&&segStart = Vec3(0,100,-8);&&segEnd& &= Vec3(-50,-50,-8);&&lines.push_back( LightLineRender::Line( segStart, segEnd, 0 ) );&&//创建出闪光链&&LightLineRender*& &&&_lighting = LightLineRender::create();&&//设置不需要强制纹理循环&&_lighting-&setForceTexLoop( false );&&//设置宽&&_lighting-&setWidth( 80 );&&//设置
单张纹理长度,调整这个数值可以避免纹理过度拉伸或挤压&&_lighting-&setTextueLength( 100 );&&//设置单个面片网格长,越小曲线越平滑,数值过于小可能带来效率问题&&_lighting-&setStep( 10 );&&//设置振幅1&&_lighting-&setAmplitude0( 4 );&&//设置频率1&&_lighting-&setFrequency0( 500 );&&//设置振幅2&&_lighting-&setAmplitude1( 1 );&&//设置频率2&&_lighting-&setFrequency1( 400 );&&//设置产生噪音的时间系数&&_lighting-&setTimeFactor( 0.5 );&&//使用线段容器创建闪电链&&_lighting-&setLines( lines );&&//使用柏林噪音算法&&_lighting-&setLineType( LineType::LT_PerlinNosie );&&//设置每帧强制更新重建模型&&_lighting-&setForceUpdate(true);&&//设置位置&&_lighting-&setPosition(Vec2(visibleSize.width / 4 + origin.x,visibleSize.height / 2 + origin.y));&&//将闪电链加入到当前层中。&&this-&addChild(_lighting,0,10);&&
这样就完成了使用了五条闪电组成一个五星闪电链不断的闪动。运行后的效果如图所示:
如果希望在触屏时能够有一条闪电链击中屏幕中央的乌龟,乌龟被击中后翻个身,闪电链渐渐消失,可以这样做:
首先,在FishLayer这个层里将乌龟循环播放的游泳与被击中的两个动作改为只播放游泳,然后我们增加两个函数:
&&//击中乌龟&&void & &FishLayer::AttackWuGui()&&{&&& & if (m_Animation3D)&&& & {&&& && &&&//从1.933秒到2.8秒截取为受伤的动作&&& && &&&m_Hurt = Animate3D::create(m_Animation3D, 1.933f, 2.8f);&&& && &&&m_Hurt-&retain();&& &&& && &&&m_Sprite-&stopAllActions();&&& && &&&//让精灵循环播放游泳和的受伤动作&&& && &&&Sequence*& & pSequence = Sequence::create(m_Hurt,CallFunc::create( std::bind(&FishLayer::ContinueSwim, this) ),NULL);&&& && &&&m_Sprite-&runAction(pSequence);&& &&& & }&& &&}&&//继续游动&&void& & FishLayer::ContinueSwim()&&{&&
if (m_Animation3D)&&& & {&&& && &&&//从起始到1.933秒截取为游泳动作&&& && &&&m_Swim = Animate3D::create(m_Animation3D, 0.f, 1.933f);&&& && &&&m_Swim-&retain();&& &&& && &&&m_Sprite-&stopAllActions();&&& && &&&//让精灵循环播放游泳和的受伤动作&&& && &&&Sequence*& & pSequence = Sequence::create(m_Swim,NULL);&&& && &&&m_Sprite-&runAction(RepeatForever::create(pSequence));&&& & }&&}&&
然后在HelloWorld的init函数尾部增加代码:
&&//设置可以点击&&setTouchEnabled( true );&&
最后,重载一下onToucesBegan函数:
&&//触屏事件处理&&void HelloWorld::onTouchesBegan(const std::vector&Touch*&& touches, Event *unused_event)&&{&&//屏幕转换到射线&&& & kmVec3& & tPt;&&& & kmVec3& &&&tD&&& & // 获取点在视图中的坐标&&& & CCPoint touchLocation = touches[0]-&getLocation();&&& & auto& & visibleSize = Director::getInstance()-&getVisibleSize();&&& & auto& &&&origin = Director::getInstance()-&getVisibleOrigin();&&& & //线条容器&&& & std::vector&LightLineRender::Line&&&& & //闪电的起点和终点&&& & Vec2& &&&tFishPos(Vec2(visibleSize / 2) + origin);&&& & tFishPos = m_FishLayer-&GetSpritePosition() +&&& & Vec3 segStart = Vec3(0,0,-8);&&& & Vec3 segEnd& &= Vec3(touchLocation.x - tFishPos.x ,touchLocation.y - tFishPos.y ,-8);&&& & //取得方向&&& & Vec3&&dir = segEnd - segS&&& & float fLength = dir.length();&&& & dir.normalize();&&
//顺时针转动45度形成一个偏移点做为第一个闪电链线段。&&& & Vec3&&rotate_&&& & Mat4&&rotate_left_M&&& & kmMat4RotationZ(&rotate_left_Mat,MATH_DEG_TO_RAD(-45));&&& & kmVec3TransformCoord(&rotate_left,&dir,&rotate_left_Mat);&&& & rotate_left.normalize();&&& & //逆时针转动45度形成一个偏移点做为第一个闪电链线段。&&& & Vec3&&rotate_&&& & Mat4&&rotate_right_M&&& & kmMat4RotationZ(&rotate_right_Mat,MATH_DEG_TO_RAD(45));&&& & kmVec3TransformCoord(&rotate_right,&dir,&rotate_right_Mat);&&& & rotate_right.normalize();&& &&& & //分成三段闪电链&&& & Vec3&&v1_s = segS&&& & Vec3&&v1_e = segStart + dir * fLength / 4.0 + rotate_left * (fLength / 6.0);&& &&& & Vec3&&v2_s = v1_&&& & Vec3&&v2_e = segStart + dir * fLength / 2.0 + rotate_right * (fLength / 6.0);&& &&& & Vec3&&v3_s = v2_&&& & Vec3&&v3_e = segE&& &&& & lines.push_back( LightLineRender::Line( v1_s, v1_e, 0 ) );&&& & lines.push_back( LightLineRender::Line( v2_s, v2_e, 0 ) );&&& & lines.push_back( LightLineRender::Line( v3_s, v3_e, 0 ) );&&& & //创建出闪光链&&& & LightLineRender*& &&&_lighting = dynamic_cast&LightLineRender*&(getChildByTag(10));&&& & //使用线段容器创建闪电链&&& & _lighting-&setLines( lines );&&& & _lighting-&setPosition(tFishPos);&&& & //这一句可以让闪电链在1秒内渐渐消隐。它通过调节Shader中的u_color值从1变为0来实现。&&& & _lighting-&OpenAlphaToZero(1.0);&&& & //击中乌龟,让乌龟翻身。&&& & m_FishLayer-&AttackWuGui();&&}&&
再次运行后,点击屏幕,就可以看到从点击屏幕位置到乌龟位置间出现一条闪电链击中小乌龟了!小乌龟摇了摇身体,勇敢地继续前行!
第四部分:漩涡特效
在《捕鱼达人3》里,有这样一个效果,它实现了对屏幕画面进行旋转扭曲,感觉就像带着玩家通过旋涡进入了海底的世界。如图:
要现实这样的效果,主要分为三个步骤:
& & 1、将屏幕画面渲染到一张纹理上。
2、创建一个平面网格模型,然后将第一步取得的纹理做为贴图传入一个顶点纹理坐标扭曲Shader进行渲染。
3、随着时间的增加,更新Shader中顶点纹理坐标扭曲的角度和半径。
为了方便使用,首先创建一个基于Layer的派生类,命名为VortexLayer,然后加入一个CCRenderTexture成员指针,在初始化时创建为屏幕大小。&&// 创建渲染目标纹理&&auto&&WinSize&&= Director::getInstance()-&getWinSize();&&m_pTarget = CCRenderTexture::create(WinSize.width, WinSize.height, kCCTexture2DPixelFormat_RGBA8888);&&m_pTarget-&setClearColor(Color4F(0, 0, 0, 0));&&m_pTarget-&setVisible(false);&&addChild(m_pTarget);&&
并通过它在draw的时候将目标Layer结点中的所有物体绘制到它的纹理中。
VortexLayer::draw(Renderer* renderer, const
Mat4 &transform, uint32_t
flags)&&{&&
if( m_pTarget&&&& m_TargetLayer)&&& && & {&&& && && && &&&m_pTarget-&clear(0,0,0,0);&&& && && && &&&m_pTarget-&begin();&&& && && && &&&m_TargetLayer-&visit();&&& && && && &&&m_pTarget-&end();&&& && & }&&…
再加入一个Mesh成员对象指针,并设置它的顶点数据,使它在形成一个与屏幕大小相等的平面网格。
&&auto& &visibleSize&&= Director::getInstance()-&getVisibleSize();&&
//行,列数&&
int& && && & cows = 100;&&
int& && && & rows = 100;&&
//每一行,列的顶点位置偏移&&
float& && & vertexStepX = visibleSize.width/&&
float& && & vertexStepY = visibleSize.height/&&
//第一行,列的纹理坐标偏移&&
float& && & uStep = 1.0/&&
float& && & vStep = 1.0/&&
//顶点,法线,色,纹理的容器&&
vector&float&& && &&&
vector&float&& &&&
vector&float&& &&&
vector&float&& &&&
for ( unsigned
int x = 0; x &=&& ++x )&&& && & {&&
for ( unsigned
int&&y = 0; y &= ++y )&&& && && && &&&{&&
int offset = x + y *&&( cows + 1 );&&
&&& && && && && && && &positions.push_back(x*vertexStepX);&&& && && && && && && &positions.push_back(y*vertexStepY);&&& && && && && && && &positions.push_back(10);&&
&&& && && && && && && &texs.push_back(x*uStep);&&& && && && && && && &texs.push_back(y*vStep);&&& && && && &&&}&&& && & }&&& && & std::vector&unsigned
short& tT&&
for ( unsigned
int x = 0; x &&& ++x )&&& && & {&&
for ( unsigned
int y = 0; y &&& ++y )&&& && && && &&&{&&
short* ptr =&&&(m_IndiceArray[(x+y*cows)*6]);&&
&&& && && && && && && &tTriangle.push_back((x+0)&&+ (y+0)*(cows+1));&&& && && && && && && &tTriangle.push_back((x+0)&&+ (y+1)*(cows+1));&&& && && && && && && &tTriangle.push_back((x+1)&&+ (y+0)*(cows+1));&&
&&& && && && && && && &tTriangle.push_back((x+0)&&+ (y+1)*(cows+1));&&& && && && && && && &tTriangle.push_back((x+1)&&+ (y+1)*(cows+1));&&& && && && && && && &tTriangle.push_back((x+1)&&+ (y+0)*(cows+1));&&& && && && &&&}&&& && & }& && &&&//创建模型&&& && & m_RenderMesh&&= Mesh::create(positions,normals,texs,tTriangle);&&& && & m_RenderMesh-&retain();&&
//设置顶点格式&&
long offset = 0;&&
auto attributeCount =&&m_RenderMesh-&getMeshVertexAttribCount();&&
for (auto k = 0; k & attributeC&&k++) {&&
auto meshattribute =&&m_RenderMesh-&getMeshVertexAttribute(k);&&& && && &m_ProgramState-&setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib],&&& && && && && && && && && && && && && && && & meshattribute.size,&&& && && && && && && && && && && && && && && & meshattribute.type,&&
GL_FALSE,&&& && && && && && && && && && && && && && && && && && && && && && && && && && &m_RenderMesh-&getVertexSizeInBytes(),&&& && && && && && && && && && && && && && && & (GLvoid*)offset);&&& && && &offset += meshattribute.attribSizeB&&& &&&}&&& &&&&&& & m_meshCommand.genMaterialID(0,&&m_ProgramState, m_RenderMesh, m_BlendFunc);
模型网格创建好了,下面重点研究一下所需要的Shader文件Vortex.vsh:
&&// 输入的顶点格式&&attribute vec4 a_
&&attribute vec2 a_texC
&&//输出给PS的变量&&varying vec2 v_texC
&&//用户自定义的变量&&uniform&&float&&
&&uniform&&float&&
&&//旋涡的计算函数&&vec2 vortex( vec2 uv )
&&& && & //先减去贴图中心点的纹理坐标,这样是方便旋转计算&&& && & uv&&-= vec2(0.5, 0.5);
&&& && & //计算当前坐标与中心点的距离。&&& && & float&&dist = length(uv);
&&& &&&//计算出旋转的百分比&&& && & float&&percent = (radius - dist) /
&&& && & if&&( percent & 1.0 && percent &= 0.0)
&&& && & {
&&& && && && &&&//通过sin,cos来计算出旋转后的位置。&&& && && && &&&float&&theta = percent * percent * angle * 8.0;&&& && && && &&&float&&s = sin(theta);
&&& && && && &&&float&&c = cos(theta);
&&& && && && &&&uv&&= vec2(dot(uv, vec2(c, -s)), dot(uv, vec2(s, c)));
&&& && & }
&&& && & //再加上贴图中心点的纹理坐标,这样才正确。&&& && & uv&&+= vec2(0.5, 0.5);
&&void main()
&&& && & //计算出顶点的位置&&gl_Position =&&CC_MVPMatrix * a_
&&& &&&//调用函数计算出纹理坐标&&& &&&v_texCoord = vortex( a_texCoord );
在draw函数中通过计算时间间隔来不断的修改角度和半径的值,就可以实现顶点的UV值绕贴图中心点旋转的效果了:
//计算时间间隔&&
timeval& && && &&&& && & gettimeofday(&&&currtime, nullptr);&&
float dt =&&(currtime.tv_sec - m_lasttime.tv_sec) + (currtime.tv_usec -&&m_lasttime.tv_usec) / f;&&
if ( m_Time &&&m_maxTime )&&& && & {&&& && && && &&&setAngle(&&getAngel()+m_angleSpeed*dt );&&& && && && &&&setRadius(&&getRadius()+m_radiusSpeed*dt );&&& && && && &&&m_Time&&+=&&& && && && &&&&&& && & }&&
else&&& && & {&&& && && && &&&m_Time&&= 0.0;&&& && && && &&&setAngle(&&0.0f );&&& && && && &&&setRadius(&&0.0f );&&& && & }&&
&&& && & m_lasttime&&=&&
//设置Shader的参数。&&
GLProgramState* programstate =&&getGLProgramState();&&
&&& && & programstate-&setUniformFloat(&radius&,m_radius);&&& && & programstate-&setUniformFloat(&angle&,m_angle);&& programstate-&setUniformTexture(&u_texture&,&&m_pTarget-&getSprite()-&getTexture());
编译运行,就可以看到旋涡旋转起来了。
以上便是4段简单的《捕鱼达人3》教程,进一步揭开了Cocos引擎3D技术的神秘面纱。不知大家觉得满意吗?
目前,Cocos2d-x引擎已更新至3.2 final版本,并且3DAPI与原2D API 风格统一,为小伙伴们提供一致的开发体验,开发3D卡牌、3D休闲、3D跑酷等游戏有了更加值得信赖的选择。
(有对Cocos引擎3D技术感兴趣的X-Men,也欢迎联系官方团队,参与探讨并获取技术支持。技术交流邮箱:。)
高级工程师
详细,初学者必读资料,嘿嘿,,,+2
太阳光芒万丈却不及蜡烛只为一人照亮、、、
感谢LZ分享 很棒的东西
51CTO学院讲师
多谢楼主分享,如此齐全的代码
资深技术经理

我要回帖

更多关于 捕鱼达人需求分析 的文章

 

随机推荐