Cocos2D -添加对规范化位置的支持



我希望cocos2d在坐标小于1时使用节点位置作为标准化因素,否则当坐标大于1时,我希望cocos2d像通常那样处理坐标

例如position(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就可以正常工作了,或者如果它与上面所示的不同,你会采取什么方法来代替

我为positionInPixels更改了整个cocos2d库中positionInPixels_的每个调用/赋值

这意味着每次调用对应的getter和setter,而不是CCNode的positionInPixels_成员变量。

然后我把CCNode.m中的setPositionsetPositionInPixels改成这样

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

你真的认为这个变体是正确的吗?改变整个框架,而不是只是添加一个方法到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

最新更新