C艹 仅以此日志帮助那些从AS3转到2dx不习惯的战友

Ctrl + , 是打开某个类 就是FB里的 Ctrl + Shift + R
Ctrl + K ,+ D 是代码格式化 (先按K,再按D)
注释是 Ctrl + K ,+ C
反注释是 Ctrl + K ,+ U
删除整行:Control + L ( FB是Ctrl + D )
格式化整个块:Ctrl+K+F
查看上次阅读处\反上次查看处:Control+"-"\Control+Shift+"-"   (很长用的快捷键,fb里的 alt + 左右)
还有以前按住Ctrl 再鼠标点击的东西 现在都是F12
代码提示 Ctrl+J

int billy [5];
int billy [5] = { 16, 2, 77, 40, 12071 }; 
int billy [] = { 16, 2, 77, 40, 12071 };  // 不写个数也可以
如果我们声明一个全局数组(在所有函数之外),则它的内容将被初始化为所有元素均为0。
char * terry = "hello";

删除
delete pRet; 
pRet = NULL;   

if ( pRet && pRet->init() )
{
    这个和as3一样
}
 

遍历node
CCArray * pChildrenArray = this->getChildren();  
CCLayer* child = NULL;  
CCObject* pObject = NULL;  

CCARRAY_FOREACH( pChildrenArray, pObject  )
{
    child = (CCLayer*)pObject;  
    if(!child)
    break;  
    //child->dosomething();  
}

for (int i = 0; i < int( arr->count() ); i++)
{
CCLabelTTF* test = (CCLabelTTF*)( arr->objectAtIndex(i) );
test->setPosition( ccp(400,300 + 60 * i) );
CCLog("length::%d" , i );
}

输出int型

CCLog("length::%d" , i );

http://www.ityran.com/archives/2105

在项目上右键添加 -> 类,一次生成cpp 和 h 文件,这是我一个初学者想到的,也是最基本的需求。
但是这样文件的位置无法改变。所以必须用添加项,h 和 cpp 分开添加,然后指定目录。还能更麻烦点吗?

想做socket,不会,看教程,教程里之字没提导包的事,试了半天没有想要的包。后来知道需要的配置下。

加载plist文件

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("1.plist");
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("2.plist");
CCSprite *sp = CCSprite::createWithSpriteFrameName("test.jpg");
this->addChild(sp);  

就这么简单,他会自动管理缓存里的文件。
只要知道名字就行,可恶的是需要知道后缀。
不过他的管理方式已经比as3还简单了。

http://www.cnblogs.com/sambird/archive/2013/07/18/3197562.html  

cocos2d-x在使用CCScale9Sprite的时候需要注意,因为使用到了扩展库所以要
在项目属性中的C/C++的附加包含目录中,添加$(SolutionDir)extensions,设置include路径
在连接器的输入中,添加libExtensions.lib,这个库文件位于cocos2d-x编译结果目录中(Debug.win32)
接下来需要在源码中加入相应的代码,首先是添加头文件及名字空间

#include "cocos-ext.h" 
USING_NS_CC_EXT;  
交叉编译的时候要注意在Android.mk中要加
$(call import-module,extensions) \
方可编译成功

CCTexture2D *tt2d = CCTextureCache::sharedTextureCache()->addImage("1.png");
CCSpriteBatchNode *qb = CCSpriteBatchNode::createWithTexture(tt2d);
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("1.plist",tt2d);
关于这个管理混乱的问题,可以参看这个文章
http://blog.csdn.net/sdhjob/article/details/8227181 讲的特别详细

想实现这个的话。。。
"ying" + ( int(i / 2) + 1) + ".jpg"  就得这样
char nameStr[100] = {0};
memset( nameStr, 0, sizeof(nameStr) );
sprintf( nameStr,  "fish%d_%d%d.png" ,  13   ,   i / 10  ,  i%10  );

移动的时候会用到的
但是快速移动的时候会有很大延迟,没找到更好的办法。
CCSetIterator iter1 = pTouches->begin();
CCTouch *t1 = (CCTouch*)(*iter1);
iter1++;

ccpSub( getLocation(), getPreviousLocation() );  计算两点距离的宏

移动的话 这么写就行 直接相加 操作符已经重载了 

node->setPosition( t1->getDelta() + node->getPosition() );

关于大小的问题。
as3里直接width height
2dx要麻烦些。

http://blog.csdn.net/bill_ming/article/details/9078781   

CCNode类的setPosition,getPosition函数如果是一个Node的Child则获取的坐标就是该Node的本地坐标
另一个关键问题就是在cocos2d-x里就是各种对象的大小问题。
因为在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。
所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。
当然cocos2d-x里提供了对应函数来完成这些操作:

getContentSize 函数来获得节点原始的大小。只是逻辑尺寸,不是像素
boundingBox 函数来获得经过缩放和旋转之后的外框盒大小。
getContentSizeInPixels 获得的是像素点大小  

无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了。
所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚。

基本的两个坐标系:屏幕坐标系和GL坐标系。
屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。这个和as一样。
GL坐标系x轴朝右,y轴朝上。默认原点在左下角。

在调用任何需要设置位置的函数,或从函数获取位置信息前,必须要明确这个函数使用哪个坐标系。

比如调用CCNode类的setPosition函数,  它使用的就是GL坐标系。
比如在处理触摸事件时CCTouch对象中的坐标就是   屏幕坐标系。(左上角的)

另一个重要的坐标系就是和Node相关的本地坐标系。

这个结构和一般做3D用的场景树的概念是一样的。

所以从Node拿到的位置是该节点的本地坐标,需要通过特定的函数才能把本地坐标转换为世界坐标。
而且这里的坐标都用的是GL坐标系。在CCNode对象中有几个方便的函数可以做坐标转换。

convertToWorldSpace方法可以把基于当前node的本地坐标系下的坐标转换到世界坐标系中。
convertToNodeSpace方法可以把世界坐标转换到当前node的本地坐标系中。
 
  另一个关键的问题就是在cocos2d里面就是各种对象的大小问题。
因为在cocos2d里CCNode对象有缩放的方法setScaleX和setScaleY。
所以在获取对象大小的时候就必须根据情况明确指定获取对象原始大小,还是缩放后的大小。
当然cocos2d里提供了对应的函数来完成这些操作。

  getContentSize 函数用来获得节点原始的大小。
  boundingBox 函数用来获得经过缩放和旋转之后的外框盒大小。

  举个简单的例子:
  bool ret = CCRect::CCRectContainsPoint(
  this->boundingBox() , this->getParent()->convertTouchToNodeSpace( pTouch ));
  这个例子的功能是来判定当前的触摸操作是否发生在自己的node对象上。其中pTouch是CCTouch对象的指针,包含了当前触摸事件发生点的坐标。
 
  CCRectContainsPoint这个函数用来判断一个点是否在一个矩形范围内。我们就想用这个函数来判断当前触摸操作的这个点是否在当前node的范围内。
  this->boundingBox() 方法获得了当前节点对象在父节点对象下的缩放之后的本地坐标大小,并且是用GL坐标系表示的。

  pTouch对象中的坐标是屏幕坐标系,所以必须转换到GL坐标系,再转换到父节点的本地坐标下。
好在convertTouchToNodeSpace这个函数一次完成了这两个转换,可以参考该库的源码,其中有具体的计算过程。
 
  所有数据都转换到同一个坐标系下了以后,就可以通过CCRectContainsPoint函数完成最终的判定操作。

  最后想说的一点是,尽可能用相对坐标。换句话说,程序中所有对象在设置大小和位置时,都应该以父对象的大小和位置为依据。 这样程序发布在以各种不同的分辨率发布时,只需要调整根对象的大小就可以了。

比如你的node scale是2
那么点击你的node 坐标是多少?
坐标是未放大的。。。
比如你点的x 200 
但给你的是100 明白?

双手缩放

CCSetIterator iter1 = pTouches->begin();
//第一个点
CCPoint p1  = ((CCTouch*)(*iter1))->getPreviousLocation(); //getPreviousLocationInView();
CCPoint p11 = ((CCTouch*)(*iter1))->getLocation(); //getLocationInView();
别用注释的那个 y是反的 坐标系很重要
iter1++;
//第二个点
CCPoint p2  = ((CCTouch*)(*iter1))->getPreviousLocation();
CCPoint p22 = ((CCTouch*)(*iter1))->getLocation();

float dis1 = p1.getDistance(p2);  //旧的距离
float dis2 = p11.getDistance(p22);//新的距离
float olds = node->getScale();
//旧的中点
float oldx = ( p1.x + p2.x ) / 2;
float oldy = ( p1.y + p2.y ) / 2;

CCPoint oldp = node->convertToNodeSpace( ccp(oldx,oldy) );

float news = dis2/dis1 * olds;
node->setScale( news );
 
//新的中点
float newx = ( p11.x + p22.x ) / 2;
float newy = ( p11.y + p22.y ) / 2;

//偏移了多少
//我需要知道 缩放的是 地图里的哪个点
//想让变大后的图的 oldp点 显示在 newWorldP位置上

float ax = -( oldp.x * news - newx );
float ay = -( oldp.y * news - newy );

node->setPosition(ax,ay);

拼接45度角地图时,会出现缝隙 或者拼接小图时也会有缝,咋办?

sb = CCSpriteBatchNode::create("1.png");
1.sb->getTexture()->setAliasTexParameters();
node->addChild(sb);
char *abc = "cao.png";
CCSprite *t2d = CCSprite::createWithSpriteFrameName(abc);
2.t2d->getTexture()->setAliasTexParameters();

在 1 和 2 任意一个地方设置都可以。 这句话的意思是 
设置贴图无锯齿的属性。

还有其他方法 请看这   http://blog.csdn.net/yuanhong2910/article/details/7163539
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值