在cocos2d里添加UITextField

来源:未知 责任编辑:责任编辑 发表时间:2014-01-25 11:31 点击:

Environment: Cocos2d V2.x , Xcode 4.5.2 , MountainLion , SpriteHelper Pro 1.8.307 , LevelHelper Pro 1.4.989

目的:希望在游戏启动时能弹出一个输入框让用户输入信息。

 

结果:可以实现,但是中间几个点会扰乱思维,导致可能出现的UITextField位置不对!!

步骤:

1. 利用Xcode创建一个cocos2d V2.x项目,不动文件以及代码,保持默认

2. 利用LevelHelper创建一个Level,放入一个Sprite

3.

 

 

    //Xcode里HelloWorldLayer.m里实例化
    LevelHelperLoader *loader=[ [   LevelHelperLoader alloc]  initWithFileContent@myGameLevel];

    [loader addSpritesToLayer:self];

    CCSprite* mysprite=[loader spriteWithUniquename:@mySpriteName];  //这个Sprite其实是辅助定位用的,不起实际作用。等会儿UITextField我会与它重合

     //容易出错的地方....

    CGPoint worldPositionInOpenGL=[mysprite.parent convertToWorldAR:mysprite.position];

    CGPoint screenPositionInQuartz=[[CCDirector sharedDirector]  convertToUI:worldpositionInOpenGL];

    CGPoint upperLeftnOfMyTextField=CGPointMake(   screenPositionInQuartz.x-mysprite.contentSize.width/2,   screenPositionInQuartz.y-mysprite.contentSize.height/2   );

     UITextField field=[  [UITextField alloc]  initWithFrame:CGRectMake(   upperLeftnOfMyTextField.x,  upperLeftnOfMyTextField.y,  

                                               mysprite.contentSize.Width,  mysprite.contentSize.Height)];    

      field.placeholder=@ABCDEFG;

    [ [CCDirector sharedDirector:view]   addSubView:mytextfield];


 

容易出错的地方....

1. 动态生成的UITextField默认是看不见边框的,所以先给出placeholder,这样我们马上就能知道它的位置

2. UITextField的initWithFrame()里面头2个参数是指文本框的左上角X,Y值。Developer.Apple.com的官方文档没有详细说明,这是个小问题

3. CCSprite默认的anchorPoint是0.5,0.5即本地坐标系的原点在我的Sprite的中心

4. Sprite的Position是相对父坐标系的,不是屏幕坐标系,而我们在初始化UITextField时必须指定屏幕坐标。所以必须先使用convertToWorldSpace或convertToWorldSpaceAR转换到world space坐标系里

5. convertToWorldSpace是把(0,0)作为sprite的坐标原点的,所以我使用了converToWorldSpaceAR:mysprite.position

6. converToWorldSpaceXX是使用Sprite的parent来操作的,即[mysprite.parent converToworldSpace:mysprite.position]才是正确的。

根据某文说即使你是SpriteD,而它的parent是SpriteC,而C的parent是SpriteB,B的parent是SpriteA,我们转换SpriteD的position时不用考虑SpriteB与SpriteA,

用[mysprite convertToWorldSpace:mysprite.position]是不对的,很不幸的是cocos2d的官方文档也没对此说明。

7. world space其实是用的OpenGL坐标系的(屏幕左下角是原点,cocos2d也是用的这个坐标系),而UITextField用的是Quartz坐标系(屏幕左上角是原点。所有标准UIKit的控件都用这个坐标系)。 所以Quartz坐标要使用 CCDirector的convertToUI方法转换我们得到的world space中的坐标

不照上面做就会导致UITextField无法与Sprite左上角重合

开始时没理清楚OpenGL与Quartz的区别,结果位置偏了,折腾了一天

\

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1