当前位置: 首页 > news >正文

标准网站建设多少钱seo网站代码优化

标准网站建设多少钱,seo网站代码优化,将wordpress做成淘宝客,贵阳网站建设kuhugz#xfeff;#xfeff; 红哥里面使用的ccTouchesMoved#xff0c;回忆下我之前的教程#xff0c;使用的是ccTouchesBegan#xff0c;大家可以体验一下这两种方式的不同。 当我们的手指触碰到屏幕的一瞬间#xff0c;调用的是ccTouchesBegan#xff0c;之后手指如果在屏… 红哥里面使用的ccTouchesMoved回忆下我之前的教程使用的是ccTouchesBegan大家可以体验一下这两种方式的不同。 当我们的手指触碰到屏幕的一瞬间调用的是ccTouchesBegan之后手指如果在屏幕上滑动手指会一直调用ccTouchesMoved所以大家可以想象一下这两种方式不同。我的方式会无视之后手指的位置精灵只会向第一个点击的地方移动。而红哥的方式则是无视第一点触碰的坐标一直会跟着之后的手指位置移动这就是 began起始和moved滑动的区别。 但实际上我们在正常实现触碰移动的时候很少使用ccMove家族的成员最重要的原因是他们非常死板很不灵活,除了贝塞尔(CCBezier)同学比较受欢迎其他的同学基本不能和ccTouch家族结合使用。所以接下来我们会模拟两种比较实用的方式来实现飞机的移动。 1. 精灵以匀速向当前触摸点行动当触摸取消时精灵停止。 这种方式相对而言比较常见让我们一起实现之。 第一步让我们在ccTouchesMoved函数中添加一下代码 CCSetIteratoritpTouches-begin(); CCTouch* touch(CCTouch*)(*it);    CCPointm_tBeginPostouch-locationInView(); m_tBeginPosCCDirector::sharedDirector()-convertToGL(m_tBeginPos); 等 这里插播个话题这段代码反复出现ccTouch家族都用他功能完全一样如果大家发现这种倒霉代码最好考虑把他变成一个更可爱的子函数。 我们在helloworld头文件中加入函数声明 // 触摸相关 CCPoint convertToGL(CCSet *pTouches); 并且一定要保证这位同学跟ccTouches那三兄弟在一起这才是良好的编程习惯不然等代码量上去了有你哭的那天。 之后的实现如下 CCPoint HelloWorld::convertToGL(cocos2d::CCSet *pTouches) { if (!pTouches) { CCSetIteratoritpTouches-begin(); CCTouch* touch(CCTouch*)(*it); CCPointm_tBeginPostouch-locationInView(); m_tBeginPosCCDirector::sharedDirector()-convertToGL(m_tBeginPos); return m_tBeginPos; } assert(!pTouches is Null!!!!!); } 部分同学对这里面的if (!pTouches)和assert(!pTouches is Null!!!!!)这是本人编写子函数的一个习惯这样如果传进来的pTouches参数为空编译时会直接捕捉到这个错误而不会继续下传。当然以我们现在这个规模的程序来说确实是有点杀鸡牛刀了但我还是推荐大家以后编写子函数的时候使用这种方式 这样这段代码就封装好了以后我们编写哪个ccTouch的时候可以直接使用我们convertToGL了这个函数的中文意思是“转换成GL” 于是我们的ccTouchesMoved函数变成了这样 void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) { CCPoint m_CurrentPosconvertToGL(pTouches); } 我们现在获取了当前坐标该让player向目标移动了 第一先定义飞机向那儿移动的速度。 在头文件中增加 private: float playerSpd1; 定义playerSpd为速度初始值为1。 第二找出当前帧移动的单位向量 这里普及一下基础的几何知识一个从点A和点B的向量AB它是B点的坐标对应减掉A点的坐标。例如A点坐标是a1a2B点坐标是b1b2那么AB向量为b1-a1,b2-a2. 但是我们单求“向量”是不对的我们应该求的是“单位向量”。这个单位向量非常神奇A点坐标加上单位向量乘以两点间距离之后得出的结果是B点坐标。而速度则是每帧移动的距离则单位向量*速度就可以计算出每帧的点坐标值啦大家可以理解这个“单位向量”为“方向”。 为了实现这一步我们可以定义一个子函数来实现上述过程问题就在于这个子函数应该定义在什么地方。 其实可以思考一下我们什么时候会用到这个子函数所有存在CCPoint的情况下 所以这个子函数最好定义在CCPoint类的类内。 另外一方面为了能够让过程和数学过程更像我们需要重载CCPoint的减号“-”让这个函数支持两个CCPoint类做减法。 So在CCPoint类的实现中中添加如下两个函数体声明我就不写了懒大家自己加到头文件里吧 CCPoint CCPoint::operator- (const CCPoint other) { this-x this-x-other.x; this-y this-y-other.y; return *this; } 另外增加计算单位向量的函数 CCPoint CCPoint::computeUnitVector() { CCPoint p1*this; assert(sqrt((p1.x)*(p1.x)(p1.y)*(p1.y))); p1.xp1.x/sqrt((p1.x)*(p1.x)(p1.y)*(p1.y)); p1.yp1.y/sqrt((p1.x)*(p1.x)(p1.y)*(p1.y)); return p1; }上面这个函数直接计算出某向量的单位向量了. 现在CCPoint类已经不单纯是一个“点”了它现在还可以表示一个“向量”和“单位向量”所以我们还需要用到让CCPoint类能够乘以一个speed。 在CCPoint头文件中加入定义并在在CCPoint实现文件中加入如下代码 CCPoint CCPoint::operator*(const float speed) { this-xthis-x*speed; this-ythis-y*speed; return *this;    } 另一方面还需要重载CCPoint的号函数能让两个CCPoint相加得出一个新坐标具体实现如下 CCPoint CCPoint::operator(const CCPoint other) { this-x this-xother.x; this-y this-yother.y; return *this; } OK让我们回到CCTouchesMoved中加入如下代码 void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) { CCPoint m_CurrentPosconvertToGL(pTouches); //获得当前坐标 CCPoint playerCurPosplayer-getPosition(); //如果距离不为0则向那个方位移动一个速度 if (ccpDistance(playerCurPos,m_CurrentPos)!0) { CCPointm_vectorm_CurrentPos-playerCurPos; //将m_vector转换为单位向量 m_vectorm_vector.computeUnitVector(); //每次调用ccTouchesMoved的时候都向单位方向移动一个速度值 player-setPosition(playerCurPosm_vector*playerSpd); } } 现在当玩家在屏幕上滑动时飞机就会向触摸的地方移动了。但有一个非常残酷的事实… 现在只有滑动的时候才会调用CCTouchesMoved - -CCTouchesMoved对对触摸进行了判断所以现在这架飞机变成了非常奇异的家伙你滑动手指才会向你移动你不滑动手指他坚决不动. 很遗憾~苹果在底层做了判断毕竟如果手一直按住都响应的话那设备将及其费电- -所以我们只能换另外一种方式了~ 可以仔细思考一下我们需求的流程如下 点击屏幕则屏幕向该点以一定速度移动。 如果中途发生滑动则修改该点坐标 如果触摸停止则此动作停止 所以我们可以采用另外一种方式来实现此功能 ccTouchesBegan用来初始化点坐标并激活飞机的一个动作此动作不停得向触摸点移动 ccTouchesMoved用来改变此点的坐标 ccTouchesEnded终结此动作。 我们如果需要实现此功能则需要以上三个函数协同工作才能共同达成目标下一讲将会讲述如何实现此功能。 OK,承接上讲我们先插播个上节遗漏的问题。 我们上节重载了CCPoint的*号使之能乘以一个float型后计算每次调用的偏移量。后来想了下如果这个*号后来和int相乘要肿么办呢我稍微骚了一下把这个重载函数改装成了一个模板重载函数代码如下 // //定义模板因为未来的speed有可能是不同类型的~ templatetypename item CCPoint operator* (const item speed) { this-xthis-x*speed; this-ythis-y*speed; return *this; } 一般来说这里是用不着这么高级的功能的这里用模板来实现泛型是有点骚气横流的感觉但下面这个例子就稍微实用一些了。 现在我想实现个函数通过调用这个函数我可以把任何作为参数输入进去的CCNode家族成员设置到原点this-setPositonCCPointZero; 好吧…不要吐槽这个功能是多么的不实用还是稍微考虑下实现吧 void setZero(CCSprite* sp) { sp-setPosition(CCPointZero); } 如果我们的对象是CCSprite*这么做是相当没问题的。可如果是个CCLayer呢CCNode呢甚至是一个组合了CCSprite的自定义对象呢我们假设该对象重写了setPosition函数。 所有我们可以采用如下的方式。 templatetypename T void setZero(T* sp) { sp-setPosition(CCPointZero); } 嗯这样就不担心将来的不合理要求啦。 //实话上面这个例子也不咋地没有达到必然要实用模板的程度但是掌握这门技术还是有好处的我曾经看见过某位勤奋的群友整整写了四个除了参数一模一样的函数我当时想假以时日等代码量起来以后这位同学就再也没有时间打dota泡妹子了为了妹子大家至少应该学会点偷懒的技术啊~ 好吧题外话说的够多了接下来我们继续开我们的小飞机。 上节的最后我们介绍了最可行的一种方案如下 ccTouchesBegan用来初始化点坐标并激活飞机的一个动作此动作不停得向触摸点移动 ccTouchesMoved用来改变此点的坐标 ccTouchesEnded终结此动作。 OK来思考我们需要什么东。 第一个一个记录当前状态的布尔值按下时设为真抬起时重置为假 bool isPointActivefalse; 第二个用来记录当前目标点的CCPoint CCPoint tagetPoint; 第三个一个每帧向当前目标点移动函数 额…… 前两个都很简单直接加到HelloWorld类里就行重点是第三个呀呀呀我们这里隆重介绍CCNode家族的重量级成员 scheduleUpdate(); 当你在任意的CCNode家族成员CCLayer啊CCSprite啊..的init()函数中添加这么一句时它就会每帧调用当前类的updatefloat dt函数。 update函数也算是系出名门了所有继承自CCObject类的成员都有个这么玩意。 当被启用时此函数内部就成为一个状态机所有被动的游戏逻辑都可以在这里面写。 大家需要很严格的写update函数不然不予调用。 //非常操蛋之前版本的update的参数是CCTime型现在改成了float型大家一定要注意参数的改动啊。 让我们来编写自己函数改函数每次被调用时会向tagetPoint移动一个速度的单位向量。 void HelloWorld::movePlayer() { CCPoint playerCurPosplayer-getPosition(); //如果两点不重合则向那个单位移动一速度单位 if (ccpDistance(playerCurPos, target_Point)!0) { CCPoint m_vectortarget_Point-playerCurPos; //将m_vector转换为单位向量 m_vectorm_vector.computeUnitVector(); //CCLog(%f and%f,m_vector.x,m_vector.y); //每次调用ccTouchesMoved的时候都向单位方向移动一个速度值 player-setPosition(playerCurPosm_vector*playerSpd); } } //----------------------------------------------- -   - 这里面我发现了一个之前教程的bug..特此声明千万别造成大家困扰。这个bug是我在重载CCPoint里的 “”号造成的之前的方式是直接对this指针进行变换这样的话则下列的语句 Point1Point2; 会造成Point1的变化所以下面是修复后的符号重载函数 CCPoint CCPoint::operator- (const CCPoint other)//11.16 try tooverload the minus synax { CCPoint temp; temp.x this-x-other.x; temp.y this-y-other.y; return temp; } CCPoint CCPoint::operator(const CCPoint other) { CCPoint temp; temp.x this-xother.x; temp.y this-yother.y; return temp; } //------------------------------------------- 之后我们在ccTouches各函数里里添加如下代码 void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) { isPointActivetrue; target_PointconvertToGL(pTouches); } void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) { target_PointconvertToGL(pTouches); } void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) { isPointActivefalse; } 在update中加入如下代码 void HelloWorld::update(float dt) { if (isPointActive) { movePlayer(); } } 看懂了么 在Began中将旗标isPointActive设置为true同时将首次点击的位置坐标赋值给target_PointMoved中负责更新此坐标Ended中则将旗标设为false。 而update则负责检查旗标如果旗标为真则目标向target_Point位置移动一个速度值。 现在运行我们的游戏就可以让飞机向点中的位置移动了 大家很可能发现飞机在接近目标值的时候会发生颤抖那是因为飞机要反复修正当前坐标与目标坐标的差值。而这个差值小于飞机的速度…所以就会反复修正我们更改一下movePlayer里的判断条件就好了。 void HelloWorld::movePlayer() { CCPoint playerCurPosplayer-getPosition(); //之前是“如果两点不重合则向那个单位移动一速度单位” //现在是“如果两点间距离大于一个速度单位则移动~ if (ccpDistance(playerCurPos, target_Point)playerSpd) { CCPoint m_vectortarget_Point-playerCurPos; //将m_vector转换为单位向量 m_vectorm_vector.computeUnitVector(); //CCLog(%f and%f,m_vector.x,m_vector.y); //每次调用ccTouchesMoved的时候都向单位方向移动一个速度值 player-setPosition(playerCurPosm_vector*playerSpd); } }
http://www.w-s-a.com/news/551616/

相关文章:

  • 肇庆市有限公司网站建设手机直接看的网站有哪些
  • 织梦修改网站后备份英语作文模板高中
  • 个人网站域名用什么好上海公司拍沪牌需要什么条件
  • 网站建设 保密做网站赚钱交税
  • 食品建设网站前的市场分析进出口网站贸易平台有哪些
  • php商城网站建设个人网站用什么服务器
  • 如何做好品牌网站建设方案网站开发的学习
  • 网站开发 管理方案wordpress怎么搭建微博
  • 有哪些ui的设计网站网上商城网站建设设计方案
  • iis中怎样配置网站绑定运城可以做网站的公司
  • 品牌网站建设开发价格dedecms电影网站模板
  • 网站设计外包合同帝国网站后台认证码错误
  • 网站设计公司深圳怎么免费做公司网站
  • 90设计网站几次是什么意思swipe类网站
  • 安康微网站建设网站域名使用费用
  • 网站建设执招标评分表微信代理网站模板
  • ps做网站分辨率自适应地方网站盈利
  • 免费自助小型网站专业网站建设组织
  • 猎聘网网站建设目标查看别人wordpress主题
  • 免费建设网站入驻网站备案不能更新吗
  • 个人网站制作代码西安建筑类公司
  • 网站备案要营业执照吗网站建设如何记账
  • 新手学做网站难吗外包服务商
  • 公司网站建设的项目工作分解结构wordpress插件后端页面
  • 四川省建设人才网站2018南京专业建站
  • ppt制作网站推荐seo教程百度网盘
  • 网站建设多少钱一平米网上商城网站开发报告
  • 福州网站建设招聘信息哈尔滨中企动力科技股份有限公司
  • 军事新闻最新seo关键词查询排名软件
  • 免费网站建设官网项目建设表态发言