建设网站 (公司)学做网站要代码

news/2025/9/22 20:04:57/文章来源:
建设网站 (公司),学做网站要代码,wordpress 主题增加筛选,聊城网站制作工作室苹果的应用讲究用户体验 有的时候仔细想想 的确#xff0c;很多细节决定了用户体验 比如说惯性拖动 可以说之前没有任何一家厂商能把触摸惯性拖动做的像苹果的UI那么流畅 Cocos2D中实现能够惯性拖动的选择界面 完成的效果#xff1a; 制作一个简单的图层#xff0c;通过传入…苹果的应用讲究用户体验 有的时候仔细想想 的确很多细节决定了用户体验 比如说惯性拖动 可以说之前没有任何一家厂商能把触摸惯性拖动做的像苹果的UI那么流畅   Cocos2D中实现能够惯性拖动的选择界面 完成的效果 制作一个简单的图层通过传入许多的节点图层自动将节点排版并能够通过物理拖拽来选择其中的某一个节点并通知节点的代理来处理   首先新建一个cocos2d项目我用的版本是2.0,命名为SimplePhysicsDragSelectorTest 新建一个objective-c class我这里命名为SZSimplePhysicsDragSelector 在SimplePhysicsDragSelector.h文件里添加以下代码   #import cocos2d.hclass SZSimplePhysicsDragSelector; protocol SZSimplePhysicsDragSelectorDelegate NSObject optional // call when the selected icon changes -(void)onSelectedIconChanged:(SZSimplePhysicsDragSelector*)selector; endinterface SZSimplePhysicsDragSelector : CCLayer {CCNode *s_content;//所有节点图标的父节点NSMutableArray *s_icons;//节点图标清单CCNode *s_selectedIcon;//选定的节点BOOL isDragging;//是否在拖拽状态CGPoint lastTouchPoint;//上一个触摸点float lastx;//上一个图层内容x坐标float xvel;//内容在x轴上的速度int maxX;//内容可以自然移动到的最大极限x坐标int minX;//内容可以自然移动到的最小极限x坐标float acceleration;//加速度float f;//合外力idSZSimplePhysicsDragSelectorDelegate s_delegate;//代理 }property (nonatomic, readonly) NSMutableArray *Icons; property (nonatomic, readonly) CCNode *SelectedIcon; property (nonatomic, assign) idSZSimplePhysicsDragSelectorDelegate Delegate;- (id)initWithIcons:(NSArray*)icons;end       这里声明了SZSimplePhysicsDragSelector需要使用到的变量和方法同时声明了SZSimplePhysicsDragSelector代理的方法 变量的作用如注释里描述的后面将会详细说到 解释下代理方法 -(void)onSelectedIconChanged:(SZSimplePhysicsDragSelector*)selector;  在图层选择的节点发生改变时将会发送此消息给代理如果改变为没有选择节点也会发送此消息   初始化 在SZSimplePhysicsDragSelector.m文件中添加以下代码 implementation SZSimplePhysicsDragSelectorsynthesize Delegate s_delegate; synthesize Icons s_icons; synthesize SelectedIcon s_selectedIcon;- (id)initWithIcons:(NSArray *)icons {self [super init];if (self) {s_icons [[NSMutableArray alloc] initWithArray:icons];s_content nil;s_selectedIcon nil;isDragging NO;lastTouchPoint CGPointZero;lastx 0.0f;xvel 0.0f;minX 0;maxX 0;acceleration 0.0f;f 0.0f;self.isTouchEnabled true;// 启用接收触摸事件s_delegate nil;}return self; }- (void)dealloc {[s_icons release];[super dealloc]; }#pragma mark Override methods-(void) onEnter {[super onEnter];s_content [[CCSprite alloc]init];[self addChild:s_content];[self scheduleUpdate];//开启计时器 }-(void) onExit {[self unscheduleUpdate];//关闭计时器[self removeChild:s_content cleanup:YES];[s_content release];s_content nil;s_selectedIcon nil;[super onExit]; }end   以上代码实现了初始化内存释放以及onEnter和onExist方法 在选择器被添加到某一个节点中时将会自动创建一个内容节点s_content用来存放所有的节点并一起移动   布局节点 在onEnter方法中布局视图,并实现layout方法-(void) onEnter -(void) onEnter {[super onEnter];s_content [[CCSprite alloc]init];[self addChild:s_content];[self layout];[self scheduleUpdate]; }-(void) layout {int i 1;for (CCNode *icon in s_icons) {CGPoint position ccp((i-1) * 180, 0);float distance fabsf(icon.position.x)/100;icon.position position;if (![s_content.children containsObject:icon]) {[s_content addChild:icon];}i;}s_selectedIcon [s_icons lastObject];if ([s_delegate respondsToSelector:selector(onSelectedIconChanged:)]) {[s_delegate onSelectedIconChanged:self];}minX - (i-1) * 180 - 100;maxX 100; }   解释下layout方法 将180pt作为每两个节点之间的间距同时第一个节点在s_content中的位置应该是(0,0)所以计算得出位置的公式间距和初始位置可以根据需要更改 position ccp((i-1) * 180, 0) 之后添加节点到s_content并且设置最后一个为初始选定的节点最后通知代理选定节点发生更改 关于极限位置(minX,maxX)是这样设定的前面说到180作为间距(0,0)为初始节点位置所以最后一个节点的x坐标为(i-1) * 180i为节点个数当需要选择右边的节点时实际上是将s_content的位置向左移动所以选择到最后一个节点时s_content的位置应该是(i-1) * 180同理第一个选择到第一个节点时s_content的位置应该是(0,0)此外我希望极限位置能够比头尾节点位置的范围稍大所以最终我设定 minX - (i-1) * 180 - 100; maxX 100;   触摸记录  布局完成接下来我们需要实现触摸事件消息来记录数据供模拟物理使用 在SZSimplePhysicsDragSelector.m文件中添加以下代码 - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; {s_selectedIcon nil;if ([s_delegate respondsToSelector:selector(onSelectedIconChanged:)]) {[s_delegate onSelectedIconChanged:self];}UITouch *touch [touches anyObject];CGPoint position [self convertTouchToNodeSpace:touch];lastTouchPoint position;isDragging true; }- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; {UITouch *touch [touches anyObject];CGPoint position [self convertTouchToNodeSpace:touch];CGPoint translate ccpSub(position, lastTouchPoint);translate.y 0;s_content.position ccpAdd(s_content.position, translate);lastTouchPoint position; }- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; {isDragging false; }- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; {isDragging false; } 这里分开说下4个触摸事件 - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;在方法中我们清空了选择的节点并通知代理选择的节点改变标记自身状态为拖拽中 - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;在方法中根据此刻触摸点与上一次触摸点的位置差来移动s_content的位置从而使内容跟随触摸移动最后在记录下此刻的位置为上一次触摸位置供下一次计算使用 - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 标记自身状态为未拖拽 - (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 标记自身状态为未拖拽 这样我们已经能够辨别自身是否在拖拽状态以及正确拖拽内容   模拟物理计算 首先说明一下思路 我们在udpate方法中我们需要检测图层的状态 若图层在被拖拽状态则不需要模拟物理只需要计算出用户触摸拖拽内容在x轴上的速度 若图层在未拖拽状态则根据已经记录下的x轴移动速度和通过受力计算出的加速度改变x轴移动速度最后在根据计算出的移动速度来计算实际位移   在SZSimplePhysicsDragSelector.m文件中添加以下代码 -(void) update:(ccTime)dt; {[self updateMove:dt]; }- (void) updateMove:(ccTime)dt {if ( !isDragging ){// *** CHANGE BEHAVIOR HERE *** //float F1 0.0f;float F2 0.0f;float F3 0.0f;CGPoint pos s_content.position;//F1// frictionF1 - xvel * 0.1;//F2// prevent icons out of rangeif ( pos.x minX ){F2 (minX - pos.x);}else if ( pos.x maxX ){F2 (maxX - pos.x);}//F3// suck planetif (fabsf(xvel) 100 !s_selectedIcon) {CCNode *nearestIcon nil;for (CCNode *icon in s_icons) {if (nearestIcon) {CGPoint pt1 [icon.parent convertToWorldSpace:icon.position];float distance1 fabsf(pt1.x - [CCDirector sharedDirector].winSize.width/2);CGPoint pt2 [nearestIcon.parent convertToWorldSpace:nearestIcon.position];float distance2 fabsf(pt2.x - [CCDirector sharedDirector].winSize.width/2);if (distance1 distance2) {nearestIcon icon;}}else {nearestIcon icon;}}if (nearestIcon) {s_selectedIcon nearestIcon;if ([s_delegate respondsToSelector:selector(onSelectedIconChanged:)]) {[s_delegate onSelectedIconChanged:self];}}}if (s_selectedIcon) {CGPoint pt [s_selectedIcon.parent convertToWorldSpace:s_selectedIcon.position];;float distance pt.x - [CCDirector sharedDirector].winSize.width/2;F3 - distance;}//CALCULATEf F1 F2 F3;acceleration f/1;xvel acceleration;pos.x xvel*dt;s_content.position pos;}else{xvel ( s_content.position.x - lastx ) / dt;lastx s_content.position.x;} } 在onEnter方法中我们已经启用了计时器所以udpate方法将会在每个最小时间间隔被调用  其他就如同刚才整理的那样没什么问题主要使这个受力问题这个受力是我经过了好多数值的尝试后得出的比较能符合要求的效果 内容受到的力分为 F1阻力方向与内容移动速度方向相反大小与移动速度快慢呈正比 F1 - xvel * 0.1; F2超出边界的额外受力方向与超出边界的方向相反大小与超出边界的距离呈正比 F2 (minX - pos.x);或者F2 (maxX - pos.x); F3将选定节点吸至屏幕中央的吸力方向从选定节点指向屏幕中央大小与选定节点到屏幕中央的距离呈正比 F3 - distance; 此外有个细节如果我们不断的施加吸力会出现一种情况很难将选定的节点拖拽出去因为吸力太大了所以在代码中添加了一个条件 fabsf(xvel) 100当移动速度小于100时才产生吸力这样你会发现拖拽顺畅多了并且也能够在选定了节点后短时间内变为静止   还有什么 最后在添加一个随着移动而变化节点大小的效果让拖拽看起来更加舒服 在原有代码内添加以下内容 -(void) layout {int i 1;for (CCNode *icon in s_icons) {CGPoint position ccp((i-1) * 180, 0);float distance fabsf(icon.position.x)/100;float scale 1/(1distance);icon.position position;icon.scale scale;//初始化缩放比例if (![s_content.children containsObject:icon]) {[s_content addChild:icon];}i;}s_selectedIcon [s_icons lastObject];if ([s_delegate respondsToSelector:selector(onSelectedIconChanged:)]) {[s_delegate onSelectedIconChanged:self];}minX - (i-1) * 180 - 100;maxX 100; }-(void) update:(ccTime)dt; {[self updateMove:dt];[self updateScale:dt];//更新缩放比例}-(void) updateScale:(ccTime)dt; {for (CCNode *icon in s_icons) {CGPoint pt [self convertToNodeSpace:[icon.parent convertToWorldSpace:icon.position]];float distance fabsf(pt.x)/100;icon.scale 1/(1distance);} }   测试 好了代码完成了接下来测试一下效果 把HelloWorldLayer的初始化方法替换为以下代码 // create and initialize a LabelCCLabelTTF *label [CCLabelTTF labelWithString:Sawyers Test fontName:Marker Felt fontSize:64];// ask director for the window sizeCGSize size [[CCDirector sharedDirector] winSize];// position the label on the center of the screenlabel.position ccp( size.width /2 , size.height/2 );// add the label as a child to this Layer[self addChild: label];// add the test selector to the layerNSMutableArray *icons [NSMutableArray array];int i 10;while (i) {[icons addObject:[CCSprite spriteWithFile:Icon2x.png]];i--;}SZSimplePhysicsDragSelector *selector [[[SZSimplePhysicsDragSelector alloc] initWithIcons:icons] autorelease];selector.position self.anchorPointInPoints; selector.Delegate self;[self addChild:selector]; 运行ios模拟器你应该看到以下效果   还算满意希望大家能够用到各位的游戏中   测试代码 测试代码可以在以下链接下载 SimplePhysicsDragSelectorTest.zip  转载于:https://www.cnblogs.com/sawyerzhu/archive/2012/08/13/2636275.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服装网站模板游戏开发模拟器

简介: 优酷视频内容数据天然呈现巨大的网络结构,各类数据实体连接形成了数十亿顶点和百亿条边的数据量,面对巨大的数据量,传统关系型数据库往往难以处理和管理,图数据结构更加贴合优酷的业务场景,图组织使用…

特殊句式

与词汇相比,文言语法变化不大,只是几种特殊句式的表示方法与现代汉语不同,下面分别加以说明: 判断句式 被动句式 倒装句式 省略句式 疑问句式 否定句式一、 判断句式文言文判断句最显著的特点就是基本上不用…

9月22日

CMD:利用命令行的方式操作计算机 打开CMD:win+R 输入CMD:cmd 常用CMD:1.盘符名称+冒号;盘符切换 2.dir:查看当前路径下的内容 3.cd目录:进入单极目录(按下Tabe) 4.cd..:回退到上一级 5.cd目录1\目录2\....:进入目录…

企业网站搭建 网络活动策划农业建设公司网站

摘要:在物流和制造业中,开发一套高效的条形码与二维码识别系统显得尤为关键。本博文深入探讨了如何利用深度学习技术打造出一套先进的条形码及二维码检测系统,并且提供了一套完整的实施方案。该系统搭载了性能卓越的YOLOv8算法,并…

全flash网站制作网站要求

前面章节中,对 set 容器做了详细的讲解。回忆一下,set 容器具有以下几个特性: 不再以键值对的方式存储数据,因为 set 容器专门用于存储键和值相等的键值对,因此该容器中真正存储的是各个键值对的值(value);set 容器在存储数据时,会根据各元素值的大小对存储的元素进行…

张家口企业网站建设优秀策划设计网站

outline在一个声明中设置所有的轮廓属性。outline:颜色(outline-line)样式(outline-style)宽度(outline-width) outline-offset 属性对轮廓进行偏移,并在边框边缘进行绘制。 轮廓在两方面与边框…

北京医疗网站建设公司排名浙江网站seo

今天我们将要谈论一个非常重要的话题:Python 编程中的安全问题。作为一门广受欢迎的编程语言,Python 已经成为了许多开发者、计算机专业学生以及打工人的必备技能。 原文链接食用更佳 危险边缘:揭示 Python 编程中易被忽视的四个安全问题 然…

民治网站设计圳网站建设公司海安环评在哪个网站做

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

网站建设内部优化南昌网站优化公司

点击上方蓝字关注我,了解更多咨询c语言中是代表两个变量相加,并将答案记录在左边的变量里。比如xy实际代表的表达式为:xxy。这是c语言为了语言的简洁性推出的组合运算。常见的运算符都可以这样组合运算。一、源码演示:二、输出结果…

夺宝网站还可以做吗网站建设氺首选金手指13

Nginx反向代理加载速度慢可能由多种原因引起,以下是一些可能的解决方法: 1,网络延迟: 检查目标服务器的网络状况,确保其网络连接正常。如果目标服务器位于不同的地理位置,可能会有较大的网络延迟。考虑使用…

找人做网站注意什么问题网站怎样运营

(一)创建 找到components文件夹下面创建新的文件夹 然后再文件夹内创建component格式的文件 创建后这样 我创建的是my-info的文件夹以及my-info的components文件,跟着普通的页面一样 (二) 注册组件 找到你需要使用组…

常见的营销型网站龙岩食品有限公司

0 本节主要内容 问题描述 解决思路 1 问题描述 不同的网络服务: DNS:用来把人们使用的机器名字(域名)转换为 IP 地址;DHCP:允许一台计算机加入网络和获取 IP 地址,而不用手工配置&#xff1…

20250922

今天上了一整天的课,非常有压力,通过早上的统一建模语言和算法与数据结构让我拥有更强大的思想,今天下午的Java课也十分深刻影响了我,我知道了0.05和0.05不能直接划= 通过一整天的课,我知道了软件开发者的素养,需…

官网网站建设研究域名暂无法进行网站备案

文章标题 一、WITH语法-定义变量1.1 定义变量1.2 调用函数1.3 子查询 二、GROUP BY子句(结合WITH ROLLUP、CUBE、TOTALS)三、FORM语法3.1表函数3.1.1 file3.1.2 numbers3.1.3 mysql3.1.4 hdfs 四、ARRAY JOIN语法(区别于arrayJoin(arr)函数&a…

学做网站的视频教学深圳的设计网站公司

晚上我看到了JeffXie 写了一篇关于内存屏障的文章,后面又看到Linus对一次内存屏障修改的建议,所以就有了这篇文章。https://mp.weixin.qq.com/s/H7Pw8xCKcNu41UGaYB648w在我看来,内存屏障谁为了让计算机做更加正确的事情,不希望计…

wordpress首页默认文件夹如何刷seo关键词排名

Sora 使用教程,新手小白可用 参考文章:Sora 使用教程,OpenAI 的文生视频模型 为了在激烈的行业竞争中保持领先地位,OpenAI 在 2024 年 2 月 15 日发布了其革命性的文本至视频转换模型——Sora。这个先进的工具能够将文本描述转化…

乌海网站建设公司怎么管理网站数据库

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 参考内容 (1)文档《ARM汇编指令集汇总》 (2)文档《ARM汇编手册》 (3)文档《ARM Software Development Toolkit User Guide》 内容总结…

先网站开发后软件开发精准引流的网络推广

想着自己学习Javascript,以及Ajax、jQuery等已经有一段时间了,不过貌似还没有写过一个插件,看到jQuery官网上那么多令人眼前一亮的插件,自己今天也动心说是不是能够写一个类似的插件来瞧瞧,了解了jQuery插件的基本格式…