捕鱼达人千炮版绑定手机号怎么解除爱思下载得

对不起,把您找的内容弄丢了!您可以选择以下操作
全国服务热线我的QQ游戏里面的捕鱼达人3d,被别人用微信绑定了,设置了赠送密码,。我的QQ能上的去,也有密保手_百度知道您的位置:
→ 捕鱼达人千炮版忘记密码怎么办 找回密码方法详解
捕鱼达人千炮版忘记密码怎么办 找回密码方法详解[图]
字体大小:【 |
9:41:45&&&本站原创
类型:益智休闲大小:39.78MB评分:10平台:标签:
忘记密码怎么办?密码作为账号的一道屏障,玩家需要将其安全的保管好。下面小编为你提供了捕鱼达人千炮版忘记密码解决方法:
捕鱼达人千炮版忘记密码解决方法:
1、通过找客服,拨打官方的客服热线(400-),并提供个人账号的相关信息。
2、使用账号绑定的手机号,进行“找回密码”申诉,利用短信验证码来修改当前账号的密码信息。
3、如果玩家绑定了账号,还可通过微信公众号进行申诉找回。
以上就是小编为大家提供的捕鱼达人千炮版忘记密码解决方法,想了解更多的信息,请关注【清风手游网】微信公众号(vipcn_com)!
更多捕鱼达人千炮版内容,请进入专题:
时间: 14:35:17
捕鱼达人千炮版已经对捕鱼达人游戏进行了深入的制作挖掘,给玩家带来更加刺激的射击赚金币体验,同时,这次还提供了更多的捕鱼达人千炮版破解版、无限金币版、无限钻石版,...
猜你喜欢射击3D横版游戏捕鱼
射击游戏(STG),游戏类型的一种,也是动作游戏的一种。射击游戏带有很明显的动作游戏特点,也没有纯然的射击游戏,因为射击必须要经过一种动作方式来呈现它的“射击”...
V2.12.7.120
游戏礼包推荐礼包
捕鱼达人千炮版游戏资讯
捕鱼达人千炮版攻略心得19
捕鱼达人千炮版游戏问答27当前位置:
疯狂捕鱼天天赢话费手机号怎么绑定 教你从头换话费
来源: & & &
作者:丁字号& & &时间: 访问量:9507
语言:中文
  中,玩家们需要通过在游戏中将自己的和游戏账号进行绑定才能够兑换话费。今天为大家带来的就是疯狂捕鱼天天赢话费手机号怎么绑定的内容,教大家怎么绑定手机号。
  疯狂捕鱼天天赢话费最新版下载:
  疯狂捕鱼天天赢话费手机号怎么绑定?
  在疯狂捕鱼天天赢话费中,玩家们需要将自己的手机号码与游戏绑定起来才能够兑换话费。下面我们就一起来看看在游戏中我们应该怎么做才能够兑换话费吧。
  其实要在游戏中将自己的手机号于游戏进行绑定很简单的,在玩家们点击了兑换话费的界面的时候,如果这个时候玩家们还未绑定话费的话,系统会提示玩家们需要将手机号与游戏账号进行绑定了之后才能够兑换话费。玩家们点击确定了之后,系统就会自动的将界面跳转到绑定手机号码的页面中去了。当然了,如果玩家们想要直接一点的话,点击自己的头像,就能够直接看到绑定手机号码的界面了。
  以上就是关于疯狂捕鱼天天赢话费手机号怎么绑定的全部内容了,如果大家还有什么疑问的话可以登录专区查看。
  别急,以下都是能够捕鱼赢话费的应用。
  啪啪捕鱼千炮赢话费——
  疯狂捕鱼天天赢话费——
  捕鱼达人千炮版——
  街机千炮捕鱼2赢话费——
下载即玩话费送翻倍! 最火捕鱼赚话费手游【】
疯狂捕鱼天天赢话费手机号相关文章推荐
微信扫一扫-礼包攻略通通到手
微信扫一扫关注琵琶网公众号:
1.扫描二维码或搜索微信号,关注“琵琶网手游”;
2.回复“疯狂捕鱼天天赢话费”,即可查看疯狂捕鱼天天赢话费最新礼包和资讯;
还没关注的小伙伴,赶紧扫一扫吧~
手机浏览器扫描-免费领取礼包
扫描二维码下载二狐游戏APP:
1.搜索“疯狂捕鱼天天赢话费”,免费领取疯狂捕鱼天天赢话费最新礼包;
2.订阅“疯狂捕鱼天天赢话费”,随时掌握礼包动向;
3.许愿“疯狂捕鱼天天赢话费”礼包,我们帮您实现;
4.二狐游戏下载:
4285271人下载
扫描安装到手机
3970282人下载
扫描安装到手机
1208818人下载
扫描安装到手机
1871155人下载
扫描安装到手机
997674人下载
扫描安装到手机
1413896人下载
扫描安装到手机
1540222人下载
扫描安装到手机
1778526人下载
扫描安装到手机
669818人下载
扫描安装到手机
1153537人下载
扫描安装到手机
672777人下载
扫描安装到手机
728173人下载
扫描安装到手机
287515人下载
扫描安装到手机
126425人下载
扫描安装到手机
295681人下载
扫描安装到手机
1750332人下载
扫描安装到手机
944868人下载
扫描安装到手机
1338人下载
扫描安装到手机
(已有0条评论)
你还可以输入200字
Copyright ?
Copyright @
琵琶网 All Rights Reserved厦门市舜邦网络科技有限公司
闽网文【-031号& 闽ICP备号-2&ICP许可证:闽B2-
疯狂捕鱼天天赢话费 - 游戏下载
二维码下载
二维码下载
温馨提示:如果苹果正版点击没反应,请用手机扫描下载~查看:2591|回复: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学院讲师
多谢楼主分享,如此齐全的代码
资深技术经理}

我要回帖

更多关于 吴奇隆变捕鱼达人 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信