ios8插件类似anywhere的插件

热门搜索:
绿色免费汉化软件之家,用户体验最好的软件下载基地!
您所在的位置: &
> ios8.1完美越狱兼容插件一览 ios8.1越狱插件汇总
ios8.1完美越狱兼容插件一览 ios8.1越狱插件汇总
  ios8.1完美越狱兼容插件一览来啦~用户对iOS8.1完美越狱的热度不断高涨,所以也就越来越多的兼容插件被研发出来,下文小编就为大家带来ios8.1越狱插件的汇总,下面就和小编一起去看下ios8.1完美越狱插件大全吧。
  小编提醒:越狱后安装插件会存在白苹果等风险,因此安装插件前,最好做好重要资料备份的工作;此外,以下的插件单独可用,但并不代表相互兼容,一旦产生冲突可能会导致安全模式或白苹果的等情况出现,这时候你需要重新刷机才可恢复!
  一、实用插件汇总
  必装推荐:
  1、FlipControlCenter(部分兼容,需谨慎安装)
  作用简介:控制中心插件。除了可以修改控制中心的图标,还可以自主对控制中心进行美化,相当好用。
  2、iCleaner/Pro
  作用简介:非常实用的一款iPhone手机垃圾清理插件。可以深度清理手机中的垃圾文件,为iPhone&瘦身&。
  3、iFile
  作用简介:强大的文件整理器。这个工具能让您管理设备原生结构下的文件,拥有移动、粘贴、复制、建立文件夹链接、解压、压缩、上传下载、搜索、编辑文件、播放影音文件等功能,基本可以媲美Mac上类似的文件管理功能。
  其他兼容推荐:
  CleverPin&&自动判断是否开启解锁密码
  CustomLS&&自定义锁屏界面
  Eclipse&&给设备增加夜间模式
  f.lux&&调整屏幕显示色温[具体介绍]
  Filza&&号称完爆iFile的一款强大的文件
  Flex2 Beta&&修改已安装软件,达到去广告、破解VIP等功能
  Mobius&&设置主屏与文件夹无限循环翻页
  Nitrous&& 帮助浏览器更快加载网页
  NoLockBounce&&取消锁屏界面的回弹效果
  Phantom for Snapchat&&Snapchat软件增强
  SwipeSelection&&系统键盘支持光标移动
  SwipeExpander&&增强系统键盘功能
  StatusHUD2&&将声音显示加入状态栏
  二、美化插件汇总
  必装推荐:
  1、Winterboard
  作用简介:系统美化主题工具必备。这是一款美化主题的软件,使用该插件可以对背景、主题、图标进行更改。
  2、Zeppelin
  作用简介:运营商显示图标修改神器。通过这款插件,可以将运营商那一成不变的图标换成别的自己喜欢的图标或者改成文字。
  3、Barrel3D
  作用简介:著名3D桌面插件。能通过不同的翻转、淡进淡出、大小变化等视觉效果让用户在滑动翻页时看到炫酷的3D效果。
  4、LockHTML3
  作用简介:锁屏美化神器。可以让你的设备用上此前iOS时代的锁屏,更牛的是它把锁屏内容变成类似安卓桌面上的小模块,长按就可以自由拖曳。
  其他兼容推荐:
  AlphaBadge&&调整应用角标的透明度。
  BatterSt BatteryStatusBar&&状态栏彩色进度条显示电量
  BlurryBadges&&调整应用角标颜色显示
  Cylinder&&与Barrel类似的桌面3D插件
  ClassicDock&&仿iOS6 Dock栏样式调整
  HideMe7&&隐藏你想隐藏的图标以及界面元素
  SubtleLock(iOS7)&&可自行调整锁屏元素的位置
  TabLess&&去除锁屏界面中&移动滑块解锁&板块
  TransparentVolume&&音量调节背景透明
  持续更新中...
小编推荐:
上一篇文章:
下一篇文章:
网友评论已有0条评论,
热门关键词> ios8/8.1完美越狱兼容插件一览 ios8/8.1越狱插件汇总
ios8/8.1完美越狱兼容插件一览 ios8/8.1越狱插件汇总
分享给小伙伴们看看:
关注我们:
ios8/8.1完美越狱兼容插件一览来啦~用户对iOS8/8.1完美越狱的热度不断高涨,所以也就越来越多的兼容插件被研发出来,下文小编就为大家带来ios8.1越狱插件的汇总,下面就和电脑百事网小编一起去看下ios8/8.1完美越狱插件大全吧。 ios8/8.
ios8/8.1完美越狱兼容插件一览来啦~用户对iOS8/8.1完美越狱的热度不断高涨,所以也就越来越多的兼容插件被研发出来,下文小编就为大家带来ios8.1越狱插件的汇总,下面就和电脑百事网小编一起去看下ios8/8.1完美越狱插件大全吧。
ios8/8.1完美越狱兼容插件一览 ios8/8.1越狱插件汇总
小编提醒:越狱后安装插件会存在白苹果等风险,因此安装插件前,最好做好重要资料备份的工作;此外,以下的插件单独可用,但并不代表相互兼容,一旦产生冲突可能会导致安全模式或白苹果的等情况出现,这时候你需要重新刷机才可恢复!
一、实用插件汇总
必装推荐:
1、FlipControlCenter(部分兼容,需谨慎安装)
作用简介:控制中心插件。除了可以修改控制中心的图标,还可以自主对控制中心进行美化,相当好用。
2、iCleaner/Pro
作用简介:非常实用的一款iPhone手机垃圾清理插件。可以深度清理手机中的垃圾文件,为iPhone&瘦身&。
作用简介:强大的文件整理器。这个工具能让您管理设备原生结构下的文件,拥有移动、粘贴、复制、建立文件夹链接、解压、压缩、上传下载、搜索、编辑文件、播放影音文件等功能,基本可以媲美Mac上类似的文件管理功能。
其他兼容推荐:
CleverPin&&自动判断是否开启解锁密码
CustomLS&&自定义锁屏界面
Eclipse&&给设备增加夜间模式
f.lux&&调整屏幕显示色温[具体介绍]
Filza&&号称完爆iFile的一款强大的文件浏览器
Flex2 Beta&&修改已安装软件,达到去广告、破解VIP等功能
Mobius&&设置主屏与文件夹无限循环翻页
Nitrous&& 帮助浏览器更快加载网页
NoLockBounce&&取消锁屏界面的回弹效果
Phantom for Snapchat&&Snapchat软件增强
SwipeSelection&&系统键盘支持光标移动
SwipeExpander&&增强系统键盘功能
StatusHUD2&&将声音显示加入状态栏
二、美化插件汇总
必装推荐:
1、Winterboard
作用简介:系统美化主题工具必备。这是一款美化主题的软件,使用该插件可以对背景、主题、图标进行更改。
2、Zeppelin
作用简介:运营商显示图标修改神器。通过这款插件,可以将运营商那一成不变的图标换成别的自己喜欢的图标或者改成文字。
3、Barrel3D
作用简介:著名3D桌面插件。能通过不同的翻转、淡进淡出、大小变化等视觉效果让用户在滑动翻页时看到炫酷的3D效果。
4、LockHTML3
作用简介:锁屏美化神器。可以让你的设备用上此前iOS时代的锁屏,更牛的是它把锁屏内容变成类似安卓桌面上的小模块,长按就可以自由拖曳。
其他兼容推荐:
AlphaBadge&&调整应用角标的透明度。
BatterSt BatteryStatusBar&&状态栏彩色进度条显示电量
BlurryBadges&&调整应用角标颜色显示
Cylinder&&与Barrel类似的桌面3D插件
ClassicDock&&仿iOS6 Dock栏样式调整
HideMe7&&隐藏你想隐藏的图标以及界面元素
SubtleLock(iOS7)&&可自行调整锁屏元素的位置
TabLess&&去除锁屏界面中&移动滑块解锁&板块
TransparentVolume&&音量调节背景透明
持续更新中...
月度 | 年度阅读排行后使用快捷导航没有帐号?
再过一周,某个疯狂的节日就要到来了,究竟为什么双11会从淡淡悲伤的单身节日变成时下...
盘古更新越狱工具,可从越狱设备直接更新。
我们已经用手中的Nexus 5刷了最新的Android 5.0来体验,采用了Material Design设计语...
采用 Material Design 设计语言,更加活泼的配色,有趣的功能这些都是 Android 5.0 操...
今天上午与大家分享了一部分 Android 5.0 的使用体验,接下来我们将继续与大家探索 An...
这位名叫 Hasan Kaymak 的设计师一定是 HTC 的忠实粉丝,此前他设计过多款 HTC 的概念...
华为在今天早上十点零八分正式发布了华为首款全网通智能手机——荣耀畅玩 4X。该机型...
苹果公司 CEO 蒂姆·库克今天在采访中确认, Apple Watch需要一天一充。
《PolyPic》是一款有趣的照片处理应用,想必大家平常都会用开将照片PS成各种色调的...
《空白生活》(Zero Lives)是一款非常简单纯粹的休闲益智游戏,可以用干净来形容这款...
《城堡射击》(Castle Scout)是一款街机风格的射击游戏,有着类似泡泡龙一般的射击消...
人类为什么要互相伤害?因为这就是生活的乐趣。今天要给大家看一款特别醉人的游戏,醉...
有一种动物天生就十分温顺,没错那就是羊,不过在 Adictiz 发布的《羊羊竞跑(Woolers...
《万千宠爱》(Million's Lovers - Tricks, Likes, Treats.)是近日推出的一款复古像...
本周的穿越躲避求生类的益智游戏可以说呈现了一种井喷式的发布,小编在一周之内居然就...
就在金色款 iPad 发布后不久,我们就拿到了一组适配新版 iPad 土豪金配色蓝牙键盘的照...
Olloclip 向来以推出夹带式的镜头闻名世界,出品的镜头配件做工优异、性能良好,在爱...
妈妈再也不用担心我号码太多。
就在我们翘首期盼着苹果公布其移动产品线最新阵容的时候,贝尔金却已经准备好了相关的...
=触宝(Zupool)推出的尚拍 ZP007 多功能遥控拍照器,可以让你轻松完成各种自拍,使用...
目前,iPad 的保护套配件还是非常受大家欢迎的,那些能起到很好的保护作用,并且同时...
世界顶级外设厂商美加狮(Mad Catz)前不久刚刚放话,称 一款名为 C.T.R.L.i 的 MFi ...
POWER SUPPORT,Apple 保护类配件领域的顶级品牌,其 Air Jacket 系列产品提供的全面...
IOS8可以安装插件么?
注册时间 最后登录
在线时间14 小时 UID
主题帖子人气
青苹果, 积分 193, 距离下一级还需 7 积分
Anywhere插件,IOS8系统
注册时间 最后登录
在线时间29 小时 UID
主题帖子人气
你试试就知道了。
注册时间 最后登录
在线时间90 小时 UID
主题帖子人气
如果越狱出了就能了,不过暂时还不能越狱
注册时间 最后登录
在线时间5874 小时 UID
主题帖子人气
注册时间 最后登录
在线时间235 小时 UID
主题帖子人气
插件只能在越狱设备上运行
注册时间 最后登录
在线时间4 小时 UID
主题帖子人气
可以安装啊。。我就安装了几个插件。。。
<p id="rate_28337" onmouseover="showTip(this)" tip="&a
href=&forum.php?mod=redirect&goto=findpost&ptid=8319384&pid=&fromuid=1&&&span &不越狱也能装插件了?&/span&&/a&&人气 + 1
" class="mtn mbn">
注册时间 最后登录
在线时间102 小时 UID
主题帖子人气
对pengjinlove-09-23 09:27:32在6楼发表的人气:+1;
可以安装啊。。我就安装了几个插件。。。不越狱也能装插件了?
威锋旗下产品
Hi~我是威威!
沪ICP备号-1 丨 深公安网监备案号 5
增值电信业务经营许可证:
Powered by Discuz!怎样使用 Box2D 和 Cocos2D 制作类似Fruit Ninja的游戏 Part 1 - 推酷
怎样使用 Box2D 和 Cocos2D 制作类似Fruit Ninja的游戏 Part 1
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
翻译:大侠,李延波,sharyu,杰西,蓝羽&&&校对:蓝羽
这篇教程是由
教程组成员
white&widget
在这篇教程里
你将会学习到使用强大的
库和一些预制工具,来制作一个切东西的
iPhone游戏,类似于
公司的水果忍者。
在大多数切东西的游戏里,当你画一条切线穿过一个精灵,不管你切到什么地方,游戏一般都是转换精灵图片为两个预先准备好的被从中间切开后的图片。
但是在这篇教程里我们将会见识到一个更酷的技术,我们的水果能够多次被切,并且精确的基于切割线,动态被分开。
正如你可能想到的,这是非常先进的技术,所以这篇教程是为那些高级的Cocos2D和Box2D开发者准备的。假如你Cocos2D或者Box2D新手,你应该在开始这篇教程开始前看看&
这个系列的教程被分成了三部分:
在这个系列的第一部分,你将会
致力于这个游戏的基础部分,学习怎样创建带纹理的多边形。
将会给你展示怎么样切开这些带纹理的多边形。
将会给你展示怎么样通过增加玩法和一些效果,把前面准备好的做成一个完整的游戏。
&为这篇教程提供基础,他负责移植
&到Cocos2D,并且也移植了CCBlade和PRKit到Cocos2D&2.0。仔细看看你将制作的游戏的视频,然后准备开始学习一些非常酷的新技术吧。
这里是一个
的视频,将会展示给你在这个系列的教程里面将会做些什么:
正如我提到的,你将会看到切水果的效果确实是动态的。这个水果被切的动态效果完全依据你所切的位置,既然你还可以多次的切这个物体,可以把它切碎。
你可以看见你将会实现一个酷的切割拖曳效果,一些粒子系统,游戏玩法逻辑和增添乐趣的声音。
这里涉及很多东西,所以让我们开始吧!
开始:工程设置
你将会在这个项目里面使用Cocos2D&2.X,所以你没有这个版本,你可以
一个。提醒一下,你也可以使用Cocos2D&1.X来代替
X版本的,如果你使用的
X,你可以跳过转化PRKit和CCBlade到Cocos2D&2.X这个部分,但是要注意对这些类作一些其他小的改变。
下载完成后,双击
来进行解压,然后运行终端,在终端里面输入下面的命令来安装
templates:
cd&~/Downloads/cocos2d-iphone-2.0-beta&./install-templates.sh&-f&–u
iOS\cocos2d&v2.x\cocos2d&iOS&with&Box2d&模板创建一个新项目,命名为
你的新项目看起来就像下面的一样: 为了有个好的开始,第一件你需要做的事就是清理一下这个模板。 打开HelloworldLayer.h,移除下面这行代码:
CCTexture2D&*spriteTexture_;//&weak&ref
HelloWorldLayer.mm
文件,修改如下:
//&Remove&this&line&from&the&top
#import&&PhysicsSprite.h&
//&Replace&the&init&method&with&this
-(id)&init
if(&(self=[super&init]))&{
//&enable&events
self.isTouchEnabled&=&YES;
self.isAccelerometerEnabled&=&YES;
CGSize&s&=&[CCDirector&sharedDirector].winS
//&init&physics
[self&initPhysics];
[self&scheduleUpdate];
//&Remove&these&two&methods
-(void)&createMenu&{
//all&content
-(void)&addNewSpriteAtPosition:(CGPoint)p&methods&{
//all&content
//&Remove&this&line&from&ccTouchesEnded
[self&addNewSpriteAtPosition:&location];
这时候,你就已经移除了
HelloworldLayer
PhysicsSprite的引用,但是还不能从这个项目里面移除PhysicsSprite,之后你需要在别的地方复制PhysicsSprite.mm包含的一个方法,所以现在先放一放。点击Command+R来编译运行你的项目,你将会看到一个有绿色边界包含空白的屏幕。
这个经过修改的模板代码,已经设置了Box2D的
debug&drawing
(box2d调试模式),会在屏幕上画出
刚体的边界。在屏幕四周看到了很细的绿色的线条了吗?这些线条就相当于是这个场景的墙,是这个模板里面默认的
initPhysics方法创建的。
看看剩下的模板代码,确保你理解了目前为止事情的进展
世界,设置这个场景范围(绿色的边界),设置
debug&drawing
等等。这是项目带有
Box2D一个非常好的“几乎空白”的起点,可以从这里开始我们的工程。
接下来把这个工程的
下来并且解压文件。
现在不要把全部的资源都加到这个工程里面,一些文件是可选的。把这个文件夹放在你容易找到的地方
因为在你学习这个教程时
我随时都可能让你增加一些文件到这个工程里面
下面就是这个文件夹里你可以找到的文件
文件夹里有一张背景图片和一些
制作的水果的艺术图片
还有一些其它
各种各样的图片。
文件夹里面有使用
&制作的混合背景音乐。
文件夹里面有使用
制作的音效
还有些是从
Particles(
文件夹里面有通过
创建的粒子效果的文件。
5.&在Misc&
文件夹里面有通过
&制作的一个
这个文件主要是包含了这个水果和炸弹类所需要的顶点信息。
6.&在Classes文件夹里面有水果和炸弹的类文件
7.&在Classes文件夹里面有这个教程需要的&
文件夹里面有一个这些资源的来源列表
用PRKit画带纹理的多边形
我们的目标是把这个精灵切成很多片。无论这个图像是什么形状,一个典型的CCSprite包含了一个纹理和一个边界盒。既然创建能够被切开的精灵非常重要的一个步骤,是要知晓图像内实际的形状,所以上面那种方式是不适合这个游戏的。
你需要创建多边形纹理
&&创建一个多边形和一个图片的对应关系
&&只显示图像在多边形边框边界内的部分(
Box2D都没有内置类来处理你想要的特性
所以你需要一些三角测量知识加上定制的
OpenGL绘制代码
听起来很困难吧
幸运的是,所有这些复杂的计算和需要实现的绘制代码已经被
的人们实现了
他们创建一个名叫
这个库就是处理
纹理映射和填充的
为了开始做带纹理的多边形
,解压,把PRKit文件夹拖到你的项目中,确定“Copy&items&into&destination&group’s&folder”和“Create&groups&for&any&added&folders”是勾选上的
注意PRKit是一直被Precognitive&Research维护的,所以有些时候它可能会被更新。为了避免混淆,资源套件包含了制作教程时使用的PRKit版本
你的工程现在应该包含下面的这些文件
你将会得到一些错误
出现这些错误的原因是因为PRKit是为Cocos2D&1.X制作的
OpenGL&ES&1.1,
但是我们现在使用的是
Cocos2D&2.X,
OpenGL&ES&2.0,
这两者间是有很大不同的
为了修复这些问题
PRFilledPolygon.m,
作以下的改变
//&Add&inside&the&initWithPoints:&andTexture:&usingTriangulator:&method
self.shaderProgram&=&[[CCShaderCache&sharedShaderCache]&programForKey:kCCShader_PositionTexture];
//&Replace&the&calculateTextureCoordinates&method&with&this
-(void)&calculateTextureCoordinates&{
for&(int&j&=&0;&j&&;&areaTrianglePointC&j++)&{
textureCoordinates[j]&=&ccpMult(areaTrianglePoints[j],1.0f/texture.pixelsWide*CC_CONTENT_SCALE_FACTOR());
textureCoordinates[j].y&=&1&-&textureCoordinates[j].y;
//&Replace&the&draw&method&with&this
-(void)&draw{
CC_NODE_DRAW_SETUP();
ccGLBindTexture2D(&self.texture.name&);
glTexParameteri(GL_TEXTURE_2D,&GL_TEXTURE_WRAP_S,&GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,&GL_TEXTURE_WRAP_T,&GL_REPEAT);
ccGLBlendFunc(&blendFunc.src,&blendFunc.dst);
ccGLEnableVertexAttribs(&kCCVertexAttribFlag_Position&|&kCCVertexAttribFlag_TexCoords&);
glVertexAttribPointer(kCCVertexAttrib_Position,&2,&GL_FLOAT,&GL_FALSE,&0,&areaTrianglePoints);
glVertexAttribPointer(kCCVertexAttrib_TexCoords,&2,&GL_FLOAT,&GL_FALSE,&0,&textureCoordinates);
glDrawArrays(GL_TRIANGLES,&0,&areaTrianglePointCount);
让我们一点点查看这些变更。
首先,在Cocos2D中,每个CCNode都附带有一个OpenGL&ES&2.0&渲染程序。为了绘制PRFilledPolygon,你需要请求内置的“位置/纹理”渲染程序来完成,它在
方法中指定。
接下来,你需要为多边形的每个点设置每个点正确的纹理坐标,所以你不得不对calculateTextureCoordinates作
&&Scale:&既然这个类有自己纹理坐标的计算方法,只是不会自动处理高清显示。为了解决这点,你必须用texture.pixelsWide(纹理的像素宽度)乘以CC_CONTENT_SCALE_FACTOR-一个简便的乘数因子由Cocos2D提供,用于普通和高清的转换。
&&Flip&Y:&因为一些原因,PRFIlledPolygon颠倒地绘制纹理,所以你在这里简单地翻转
最后,绘制代码被更新到OpenGL&ES&2.0,以此类推,精灵绘制是怎样从Cocos2D&1.X变到Cocos2D&2.X的:
通过调用CC_NODE_DRAW_SETUP()开始准备绘制节点.
glDisableClientState()&和&glEnableClientState()的调用是过时的,可以被抛弃的
glVertexPointer()和glTexCoordPointer()命令都被glVertexAttribPointer()替代,glVertexAttribPointer()现在接受顶点位置或者纹理坐标作为它的第一个参数
glTexEnvf()的配置,glTexEnvf()负责在多边形尺寸大于纹理时重复精灵,被glTexParameteri()调用所代替。
如果对这个感到困惑,你可能需要看看
&来获得更多背景知识。但是你不需要担心太多,因为我们现在正在做的事只是移植这个类,使它可以在Cocos2D&2.X下工作。
编译运行,所有的PRKit错误都应该消失了。
是时候使PRKit工作了,&你需要继承
PRFilledPolygon
类,获得一个
PolygonSprite
基类,用于绘制我们的水果。
PolygonSprite是在PRFilledPolygon基础上,附加一个Box2D物体到精灵上。在游戏的实现中,这个类也包含了一些用于水果的特定的变量和方法。
让我们开始做吧,按下
mad+N,用iOS\cocos2d&v2.x\CCNode类模版创建一个新的文件。使这个新文件成为PRFilledPolygon子类,并命名为PolygonSprite.m
//&Add&to&top&of&file
//加到文件头
#import&&Box2D.h&
#import&&PRFilledPolygon.h&
#define&PTM_RATIO&32
//&Add&inside&@interface
//加到@interface里面
//&Add&after&the&@interface
//加到@interface后
@property(nonatomic,assign)b2Body&*
@property(nonatomic,readwrite)BOOL&
@property(nonatomic,readwrite)b2Vec2&
//&Add&before&the&@end
//加到@end前
-(id)initWithTexture:(CCTexture2D*)texture&body:(b2Body*)body&original:(BOOL)
-(id)initWithFile:(NSString*)filename&body:(b2Body*)body&original:(BOOL)
+(id)spriteWithFile:(NSString*)filename&body:(b2Body*)body&original:(BOOL)
+(id)spriteWithTexture:(CCTexture2D*)texture&body:(b2Body*)body&original:(BOOL)
-(id)initWithWorld:(b2World*)
+(id)spriteWithWorld:(b2World*)
-(b2Body*)createBodyForWorld:(b2World*)world&position:(b2Vec2)position&rotation:(float)rotation&vertices:(b2Vec2*)vertices&vertexCount:(int32)count&density:(float)density&friction:(float)friction&restitution:(float)
-(void)activateC
-(void)deactivateC
上面的代码声明了创建一个PolygonSprite所需要的变量和方法,它们是:
&&body:&这是附着在我们精灵上的
,用于物理模拟。
&&original:&完整的和切掉的精灵将会使用相同的PolygonSprite类,照这样,如何区分将会非常重要。&如果这个数值是YES,意味着这个精灵没有切,或者说它是你最初创建的那个物体。否则,它仅是整体的一部分。
&&centroid:&图片里多边形的中心并不总和图片中心相同,所以存储这个值是有用的。
&&properties:所有变量用
properties
成为全局变量
,使其它类可以自由访问。
&&init/spriteWith*:&我们主要的初始化方法,遵循Cocos2D的命名约定。
&&other&method:&这些方法创建和处理连接的Box2D物体和它的属性。
&&PTM_RATIO:&像素到距离的比率。Box2D需要这个转换值,因为它处理的是距离而不是像素。
快速切换到PolygonSprite.m并重命名为PolygonSprite.mm.&所有混合Objective-C&(Cocos2D)和C++&(Box2D)的代码需要有一个“.mm”扩展名,来告知编译器使用混合语法。
接下来,对PolygonSprite.mm作如下改变
// Add inside the @implementation
@synthesize body = _
@synthesize original = _
@synthesize centroid = _
+(id)spriteWithFile:(NSString *)filename body:(b2Body *)body
original:(BOOL)original
return [[[self alloc]initWithFile:filename body:body original:original] autorelease];
+(id)spriteWithTexture:(CCTexture2D *)texture body:(b2Body *)body
original:(BOOL)original
return [[[self alloc]initWithTexture:texture body:body original:original] autorelease];
+(id)spriteWithWorld:(b2World *)world
return [[[self alloc]initWithWorld:world] autorelease];
-(id)initWithFile:(NSString*)filename body:(b2Body*)body
original:(BOOL)original
NSAssert(filename != nil, @&Invalid filename for sprite&);
CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage: filename];
return [self initWithTexture:texture body:body original:original];
-(id)initWithTexture:(CCTexture2D*)texture body:(b2Body*)body original:(BOOL)original
// gather all the vertices from our Box2D shape
b2Fixture *originalFixture = body-&GetFixtureList();
b2PolygonShape *shape = (b2PolygonShape*)originalFixture-&GetShape();
int vertexCount = shape-&GetVertexCount();
NSMutableArray *points = [NSMutableArray arrayWithCapacity:vertexCount];
for(int i = 0; i &; vertexC i++) {
CGPoint p = ccp(shape-&GetVertex(i).x * PTM_RATIO, shape-&GetVertex(i).y * PTM_RATIO);
[points addObject:[NSValue valueWithCGPoint:p]];
if ((self = [super initWithPoints:points andTexture:texture]))
_body-&SetUserData(self);
_original =
// gets the center of the polygon
_centroid = self.body-&GetLocalCenter();
// assign an anchor point based on the center
self.anchorPoint = ccp(_centroid.x * PTM_RATIO / texture.contentSize.width,
_centroid.y * PTM_RATIO / texture.contentSize.height);
// more init stuff here later when you expand PolygonSprite
-(id)initWithWorld:(b2World *)world
//nothing to do here
类似,所有以
spriteWith
开头的方法不过是以
开头的方法的
autoreleae
initWithWorld
PolygonSprite
类中还没有实际用途,但将来会被它的子类所使用。
大部分的变更可以在
initWithFile
initWithTexture
方法中找到。为了展示调用流程,创建一个水果对象的过程将会按照如下方式调
&&initWithWorld:&这个方法适用于
PolygonSprite
的子类,在目前不需要做什么,只要返回
就可以了,将来再处理它。
&&initWithFile:&这个方法从我们的文件中加载纹理,然后把相关的所有参数传给initWithTexture方法。
&&initWithTexture:&我们的初始化主函数。
PRFilledPolygon
类需要一个纹理内容和它需要填充的多边形的所有顶点。既然之前的步骤已经处理完成了纹理部分,这一步将通过对应精灵的
获得这些顶点信息。在将它们传给
PRFilledPolygon
之后,还需要初始化之前声明的哪些变量。
&&initWithPoints:&这个方法的所有内容都包含在
里面,好消息是在你更新完这些代码之后,就不再需要和
打交道了。
仍旧在PolygonSprite.mm中,添加如下方法:
-(void)setPosition:(CGPoint)position
[super&setPosition:position];
_body-&SetTransform(b2Vec2(position.x/PTM_RATIO,position.y/PTM_RATIO),&_body-&GetAngle());
-(b2Body*)createBodyForWorld:(b2World&*)world&position:(b2Vec2)position&rotation:(float)rotation&vertices:(b2Vec2*)vertices&vertexCount:(int32)count&density:(float)density&friction:(float)friction&restitution:(float)restitution
b2BodyDef&bodyD
bodyDef.type&=&b2_dynamicB
bodyDef.position&=&
bodyDef.angle&=&
b2Body&*body&=&world-&CreateBody(&bodyDef);
b2FixtureDef&fixtureD
fixtureDef.density&=&
fixtureDef.friction&=&
fixtureDef.restitution&=&
fixtureDef.filter.categoryBits&=&0;
fixtureDef.filter.maskBits&=&0;
b2PolygonShape&
shape.Set(vertices,&count);
fixtureDef.shape&=&&
body-&CreateFixture(&fixtureDef);
-(void)activateCollisions
b2Fixture&*fixture&=&_body-&GetFixtureList();
b2Filter&filter&=&fixture-&GetFilterData();
filter.categoryBits&=&0x0001;
filter.maskBits&=&0x0001;
fixture-&SetFilterData(filter);
-(void)deactivateCollisions
b2Fixture&*fixture&=&_body-&GetFixtureList();
b2Filter&filter&=&fixture-&GetFilterData();
filter.categoryBits&=&0;
filter.maskBits&=&0;
fixture-&SetFilterData(filter);
在上面的代码中,首先重载了
setPosition
方法,这样一来,当你更新精灵的位置的时候,与它关联的
的位置也同步更新了。
我们创建了一个便利的方法用于创建并定义
。为了创建一个物体
,你需要定义一个物体
定义,创建一个物体
、一个形状(
),以及一个夹具
定义。这些参数没有被硬编码为固定值,主要是考虑到这个方法将在
PolygonSprite
的子类中使用。
需要注意的是
categoryBits
这两个变量,这两个变量用来过滤对象之间碰撞事件,实现机制是通过一个对象的类别位(
category&bit
)和另一个对象的掩码位
(mask&bit)
相匹配,反之亦然。你需要首先将它们设置为
,因为在这些对象在初始创建的时候,你肯定不希望任何碰撞发生。
最后,你需要定义两个方法,通过变更
categroryBits
的取值,实现
PolygonSprite
对象碰撞功能的激活与反激活。
另外还有一个方法被添加到了PolygonSprite.mm之中:
-(CGAffineTransform)&nodeToParentTransform
b2Vec2&pos&&=&_body-&GetPosition();
float&x&=&pos.x&*&PTM_RATIO;
float&y&=&pos.y&*&PTM_RATIO;
if&(&!isRelativeAnchorPoint_&)&{
x&+=&anchorPointInPoints_.x;
y&+=&anchorPointInPoints_.y;
//&Make&matrix
float&radians&=&_body-&GetAngle();
float&c&=&cosf(radians);
float&s&=&sinf(radians);
if(&!&CGPointEqualToPoint(anchorPointInPoints_,&CGPointZero)&){
x&+=&c*-anchorPointInPoints_.x+&-s*-anchorPointInPoints_.y;
y&+=&s*-anchorPointInPoints_.x+&c*-anchorPointInPoints_.y;
//&Rot,&Translate&Matrix
transform_&=&CGAffineTransformMake(&c,&&s,
return&transform_;
还记得之前我曾经提到过你还需要
PhysicsSprite
中的一些东西吗?
,就是这个。上述代码的作用就是确保在
)在移动的时候,和对应的精灵处在同一个位置上。这是
为我们提供的,可以使得效果更棒。
拷贝完上述代码之后,现在就可以从项目中删除
PhysicsSprite.h
PhysicsSprite.mm
,因为我们已经完全不需要他们了。
编译运行,应该没有什么差错了。现在你已经完成了
PlygonSprite
在开始创建我们的水果类之前,你必须搞清楚图片和形状(
)所必须遵从的规则。既然需要将我们的纹理映射到单独的
多边形上,你必须遵从
对多边形的一些限制。你需要将下面两点记在心上:
多边形必须是凸多边形,意味着不存在大于
度的内角。
多边形不能超过
你如果允许每个物体
包含多个形状(
)的话,实际上是可以突破上述限制的。使用三角法将凹多边形分解成多个角度(即:将大于
度的角分解成若干个小于
的角),这样就可以使得
处理凹多边形了,但这些内容超出了本教程要讨论的内容。
为了让事情简单一些,在本教程中,你将遵从
)的规则。
注意:本教程后面将会讨论的
PhysicsEditor
工具,实际上内置了自动将你绘制的多边形分解成凸多边形集合的代码。然而,如同我之前描述的一样,在这里我们尽量让事情简单一些,保证使用凸多边形,使得每个物体
只需要一个形状(
让我们看一下这两个水果:
使用香蕉不是一个好主意,因为它天生就是凹的。相反,西瓜就非常合适,因为你可以定义一个凸多边形,能够与它的形状(
)吻合的非常好。
如果你按照
的规则为这两个水果定义多边形形状(
),最终将或多或少地做成如下的样子:
西瓜的形状(
)吻合的非常好,而香蕉的多边形会有一个很大的空白区域,在此之上,相应的图像向内弯曲。
将把这个区域作为我们对象的一部分,当它与其他对象碰撞或者被切的时候,会使得香蕉显得非常不自然。
这并不意味着你不能使用香蕉,而是不推荐使用香蕉。事实上,本教程中你要创建的游戏就会用到它。
创建第一个水果
现在是时候创建第一个水果了:西瓜(至少是一片西瓜)。
回顾我们初始化PolygonSprite的流程,你知道initWithTexture需要一个
刚体,但是之前的一步
initWithFile却没有提供这个刚体。
这个问题的原因在于:你需要单独的创建和定义每个水果的刚体,这会是在最初的步骤initWithWorld里进行的,在这个方法里,要创建刚体,并对于每个水果赋予独特的属性。
刚体,你必须先知道需要创建的多边形形状的顶点。有一些不同的方法来做这件事情,但是在这个教程中,你会用到一个漂亮的工具,叫做
PhysicsEditor。这个工具有很多功能,但你只用它来指导我们获取多边形的顶点坐标。如果你没有这个软件,
,安装并启动。你将会得到一个空白的项目,包括
使用PhysicsEditor非常直接了当。在左侧,放置所有你需要用到的图片。在中间栏里,能可视化地为图片定义多边形。右边栏中定义刚体的各种属性。
从资源包中的
文件夹中找到
watermelon.png,将其拖拽到左侧面板中。现在你会看到一个西瓜出现在中间的面板上。在面板的底部,放大视图尺寸到一个合适的程度,然后点击面板上方的五角形按钮(Pentagon&Button),用它创建一个
个边的多边形。
在创建的多边形上点击鼠标右键,选择“添加顶点”(Add&Vertex),直到有了
个顶点为止。在西瓜的边缘移动这些顶点,同时,保证以下两点:
你创建的多边形必须是凸多边形。
西瓜的所有像素点要包含在多边形中。
注意:另外一个绘制形状的捷径是使用PhysicsEditor中的魔棒(
magic&wand
)工具。将容差设置为(
),你将会得到
个顶点,然后再调整这些点。
从资源包的
文件夹中添加所有其它的水果和炸弹,对它们做同样的处理。
你应该为以下图片定义形状:
banana.png
grapes.png
pineapple.png
strawberry.png
Watermelon.png
在你结束工作后,在右上角处,更改导出(Exporter)设置为“Box2D&generic&(PLIST)”,最后,你应该得到下图中类似的结果:
点击“发布”(
),或者是“发布为”(
Publish&As
),将导出一个
文件,包含了顶点信息。将文件保存为
fruits.plist
例如,在教程中用到的
fruits.plist
包含在资源包的
文件夹中。
你只是想看看包含在
文件中的信息,因此不需要将它添加到你的项目中,只需要用
将其打开,就可以按照一定的组织方式浏览内容了。
”旁边的三角图标,展开这个片段,你可以看到所有定义了形状的图片列表。你需要一直展开到最后一层,才能得到西瓜的多边形顶点信息,如下
Expand&watermelon/fixtures/Item&0/polygons&and&you&should&now&see&another&Item&0&of&Type&Array&under&polygons.&This&last&array&is&your&shape.&If&you&had&properly&defined&a&convex&shape&with&8&or&less&vertices,&you&should&only&see&one&array&under&polygons.
展开watermelon/fixtures/Item&0/polygons,然后你可以看到另外一个属性数组Item&0在
结点下。这个最后的数组就是形状。如果你正确的定义了一个包含
个或更少顶点的凸多边形,在
下面只会看到一个数组。
如果你看到多于一属性个数组,比如Item&0,Item&1等等,这意味着PhysicsEditor制造了一个复杂的形状,你可能定义了过多顶点,或定义了一个凹多边形。如果是这样的话,回到PhysicsEditor中将其修正。
下一步,展开
数组,观察最后的列表。这些是多边形的顶点,你在右侧看到的按照
{&数字,&数字&}格式排列的值,是每个顶点的
现在,你获得了多边形确切的顶点,可以继续创建Watermelon类了。
在Xcode中,用iOS\cocos2d&v2.x\CCNode作为模板创建一个新的文件,并且继承PolygonSprite然后命名为Watermelon。打开Watermelon.h&,然后做以下的改变:
//&Add&to&top&of&file
#import&&PolygonSprite.h&
切换到Watermelon.m,重命名为Watermelon.mm,然后添加以下init方法:
//&Add&inside&the&@implementation
-(id)initWithWorld:(b2World&*)world
int32&count&=&7;
NSString&/a&&*file&=&@&watermelon.png&;
b2Vec2&vertices[]&=&{
b2Vec2(5.0/PTM_RATIO,15.0/PTM_RATIO),
b2Vec2(18.0/PTM_RATIO,7.0/PTM_RATIO),
b2Vec2(32.0/PTM_RATIO,5.0/PTM_RATIO),
b2Vec2(48.0/PTM_RATIO,7.0/PTM_RATIO),
b2Vec2(60.0/PTM_RATIO,14.0/PTM_RATIO),
b2Vec2(34.0/PTM_RATIO,59.0/PTM_RATIO),
b2Vec2(28.0/PTM_RATIO,59.0/PTM_RATIO)
CGSize&screen&=&[[CCDirector&sharedDirector]&winSize];
b2Body&*body&=&[self&createBodyForWorld:world&position:b2Vec2(screen.width/2/PTM_RATIO,screen.height/2/PTM_RATIO)&rotation:0&vertices:vertices&vertexCount:count&density:5.0&friction:0.2&restitution:0.2];
if&((self&=&[super&initWithFile:file&body:body&original:YES]))
//&We&will&initialize&more&values&for&the&fruit&here&later
在以上的代码中,你先定义了有几个顶点,那么在这个例子中是7个。接着,你创建了一个顶点数组,它存储了你在PLIST中看到的所有顶点的坐标。你用这些信息和一个你定义在PolygonSprite中的简单的方法,创建了一个body。
你添加了一个小的摩擦数值以至于不会让这个图形无休止的滑动,你也添加了一个小的restitution恢复数值,使模型在反弹的时候不会停下来。
最后,你通过调用父类的初始化方法,并传入图片文件的名字,创建Box2D&body对象,同时声明这个对象是一个原始的水果。
你需要一些在资源工具包中的西瓜图片,那么现在是时候去添加这个教程中需要使用到的所有图片资源了。
在你的项目导航面板中,右击Resources,选择“Add&Files&to&CutCutCut”。把资源工具包中的图片文件夹添加到项目中。确保勾选了“Copy&items&into&destination&group‘s&folder”和“Create&groups&for&any&added&folders”。
按照相同的步骤添加Banana,Grapes,Pineapple,Strawberry和Bomb。既然这是一个基本的重复添加的过程,你只要解决了如何一步步创建第一个水果就行了。资源工具包的Class文件夹中包含了已经做好的水果和炸弹类。当你需要一些指导的时候可以看看这些例子,或是你可以跳过这一步把他们直接加到你的项目中。
编译运行,确保一切运行正常。
在场景中加入一个水果
到目前为止,屏幕上没有任何反应,显然,你急切地想看到你的水果劳工。
切换到HelloWorldLayer.h&,然后做以下修改:
//&Add&to&top&of&file
#import&&PolygonSprite.h&
//&Add&inside&the&@interface
CCArray&*_
//&Add&after&the&@interface
@property(nonatomic,retain)CCArray&*
切换到HelloWorldLayer.mm,然后做这些修改:
//&Add&to&top&of&file
#import&&Watermelon.h&
//&Add&inside&the&@implementation
@synthesize&cache&=&_
//&Add&inside&the&init&method,&below&[self&initPhysics]
[self&initSprites];
//&Add&inside&the&dealloc&method,&before&calling&[super&dealloc]
[_cache&release];
//&Add&anywhere&inside&the&@implementation&and&before&the&@end
-(void)initSprites
_cache&=&[[CCArray&alloc]&initWithCapacity:53];
//&Just&create&one&sprite&for&now.&This&whole&method&will&be&replaced&later.
PolygonSprite&*sprite&=&[[Watermelon&alloc]&initWithWorld:world];
[self&addChild:sprite&z:1];
[sprite&activateCollisions];
[_cache&addObject:sprite];
你声明了一个将会保存所有你创建的水果和炸弹的缓存数组。接着,你创建了1个西瓜并把它加到了场景。你调用了activateCollisons方法使西瓜不会穿越围墙。
编译运行,你应该会看到一个西瓜从屏幕的中间掉落,停在底部。
你也许已经注意到西瓜并不在绝对的中心位置。这是因为你定位一个物体是基于它的Box2D&body,而Box2D&body的起始点是在物体的左下角。西瓜的薄边框可见是因为开了Box2D调试模式。
这里有一个包含上述教程中的所有代码的
这就是这个系列中的第一部分了。到目前为止,你有了一个西瓜图案的多边形掉落到屏幕的底部。
不同于平常你在Box2D教程中看到的绘制一个矩形的带有透明区域的精灵,这个教程使用PRKit只绘制了与Box2D的主体顶点相一致的纹理部分。这将很快派上用场。
敬请关注这个教程的第二部分,它会让你实现切水果的功能。同时,如果你有任何问题或建议,请加入下面的论坛。
已发表评论数()
&&登&&&陆&&

我要回帖

更多关于 lol客服 qq 的文章

 

随机推荐