2013-04-10 61 views
0

我希望cocos2d在坐标小于1时使用节点位置作为标准化因子,否则当坐标大于1时,我希望cocos2d像处理坐标一样正常处理Cocos2D - 添加对标准化位置的支持

对于instater位置(1,1)将定位节点在屏幕的右上角,而(.5,.5)将定位节点在屏幕中心。

我想重写代码只是所在的坐标cocos2d的传递到像下面的伪代码顶点缓冲

if (Position.x <= 1) 
    BufferPosition.x = Screen.Width * Position.x; 
else 
    BufferPosition.x = Position.x; 

if (Position.y <= 1) 
    BufferPosition.y = Screen.Height * Position.y; 
else 
    BufferPosition.y = Position.y; 

所以我的问题是在哪里会你把这个代码,这样的cocos2d这样工作有没有问题,或者你会采取istead如果它是从上面

更新显示的不同

我改变了每一个呼叫/分配什么办法在整个cocos2d库中为positionInPixels

这意味着每一次,相应的getter和setter被caled而不是CCNode的positionInPixels_成员变量。

然后我CCNode.m改变,并setPositionInPixels这样

setPosition两种

-(void) setPosition: (CGPoint)newPosition 
{ 
CGSize winSize = [[CCDirector sharedDirector] winSize]; 

position_ = newPosition; 

if (position_.x <= 1.0) { 
    positionInPixels_.x = position_.x * winSize.width; 
} 
else 
{ 
    if(CC_CONTENT_SCALE_FACTOR() == 1) 
     positionInPixels_.x = position_.x; 
    else 
    positionInPixels_.x = newPosition.x * CC_CONTENT_SCALE_FACTOR(); 
} 

if (position_.y <= 1.0) { 
    positionInPixels_.y = position_.y * winSize.height; 
} 
else 
{ 
    if(CC_CONTENT_SCALE_FACTOR() == 1) 
    positionInPixels_.y = position_.y; 
    else 
    positionInPixels_.y = newPosition.y * CC_CONTENT_SCALE_FACTOR(); 
} 

isTransformDirty_ = isInverseDirty_ = YES; 
#if CC_NODE_TRANSFORM_USING_AFFINE_MATRIX 
isTransformGLDirty_ = YES; 
#endif 
} 

setPositionInPixels

-(void) setPositionInPixels:(CGPoint)newPosition 
{ 
CGSize winSize = [[CCDirector sharedDirector] winSize]; 

positionInPixels_ = newPosition; 

if (position_.x <= 1.0) { 
    position_.x = positionInPixels_.x/winSize.width; 
} 
else 
{ 
    if(CC_CONTENT_SCALE_FACTOR() == 1) 
    position_.x = positionInPixels_.x; 
    else 
    position_.x = newPosition.x * 1/CC_CONTENT_SCALE_FACTOR()/winSize.width; 
} 

if (position_.y <= 1.0) { 
    position_.y = positionInPixels_.y/winSize.height; 
} 
else 
{ 
    if(CC_CONTENT_SCALE_FACTOR() == 1) 
    position_.y = positionInPixels_.y; 
    else 
    position_.y = newPosition.y * 1/CC_CONTENT_SCALE_FACTOR()/winSize.height; 
} 

isTransformDirty_ = isInverseDirty_ = YES; 
#if CC_NODE_TRANSFORM_USING_AFFINE_MATRIX 
isTransformGLDirty_ = YES; 
#endif 
} 

这是工作到目前为止,即使使用CCActionInterval标准化坐标

+0

祝你好运,关于可维护性。我很肯定你很快就会找到x,y值<1,正常化位置> 1等合法用例,并且positionInPixels不是cocos2d 2.0版本的一部分。 – YvesLeBorg 2013-04-11 09:59:04

+0

@YvesLeBorg我知道修改库并不是最好的做法,但在这种情况下(使用v1.x)会帮助我获得理想的结果,我希望最新版本会添加这样的功能,它会来适用于不同的屏幕尺寸。 – rraallvv 2013-04-11 10:13:54

回答

2

所以你真的认为这个变种是正确的吗?要改变整个框架而不是只是将一种方法添加到CCNode的扩展中?我认为你很快就会发现很多定位问题。

此外它不好,(1.f,1.f)总是有坐标(screenWidth,screenHeight)。小节点会带来很多麻烦。恕我直言,如果你需要这样的定位,将这个“因子”坐标连接到节点的父亲大小更合适。 只需恢复cocos2d框架并将您自己的扩展添加到您的项目。例如,

@interface CCNode(FactorPositioning) 
- (void) setPositionFactor:(CGFloat) factor; 
@end 

@implementation CCNode(FactorPositioning) 
- (void) setPositionFactor:(CGFloat) factor 
{ 
    assert(self.parent != nil); 

    // do your calculations relatieve to the parent's content size 
} 
@end 
+0

嗯,原因是我使用的遗留版本1.x,不会再更新AFAIK,并且使用这样的扩展将需要遍历整个节点的树,当有更改的每次更改时节点的位置。我想知道为什么Cocos2D不支持这个功能。 – rraallvv 2013-04-11 10:08:10

+0

好的。如果你想这样做,你可以创建CCNode子类来支持这种调整大小(我的意思是,对方向变化作出反应,实现因素定位等) – Morion 2013-04-11 10:46:20

+0

好了,我恢复了所做的改变,并按照你的建议进行操作,这将与Cocos2D v2.x一起工作,这是一个更好的选择 – rraallvv 2013-04-12 10:46:19