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

Cocos2d iphone Cocos2D-添加对规范化位置的支持,cocos2d-iphone,add-on,Cocos2d Iphone,Add On,当坐标小于1时,我希望cocos2d使用节点的位置作为标准化因子,否则当坐标大于1时,我希望cocos2d像正常情况一样处理坐标 对于instace,位置(1,1)将在屏幕右上角定位节点,而(.5,5)将在屏幕中心定位节点 我正在考虑重写代码,就像下面的伪代码一样,cocos2d将坐标传递给顶点缓冲区 if (Position.x <= 1) BufferPosition.x = Screen.Width * Position.x; else BufferPosition.

当坐标小于1时,我希望cocos2d使用节点的位置作为标准化因子,否则当坐标大于1时,我希望cocos2d像正常情况一样处理坐标

对于instace,位置(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;
设置位置像素

-(无效)设置位置像素:(CGPoint)新位置
{
CGSize winSize=[[CCDirector sharedDirector]winSize];
位置像素=新位置;

如果(position_ux.x那么你真的认为这个变体是正确的吗?要改变整个框架,而不是仅仅在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

在可维护性方面,祝你好运。我很肯定你很快就会发现x、y值<1、标准化位置>1等的合法用例。而且PositionPixels不是cocos2d 2.0版的一部分。@YvesLeBorg我知道修改库不是最佳做法,但就在这种情况下(使用v1.x)这将有助于我获得理想的结果,我希望最新版本将添加这样的功能,它将在不同的屏幕大小下派上用场。原因是我使用的是旧版1.x,它将不再更新,并且使用这样的扩展将需要遍历整个节点的树时,有一个oriantation更改以更新每个节点的位置。我想知道为什么Cocos2D不支持此功能。好的。如果您想这样做,您可以创建CCNode子类来支持这种大小调整(我的意思是,对方向更改做出反应,实现因子定位等)好的,我恢复了更改并将按照您的建议执行,这也将适用于Cocos2D v2.x,这是一个更好的选择,因为它不能在类扩展上添加新成员变量,我如何跟踪哪些节点响应UIDeviceOrientationIDChangeNotification,并重新编程CCNode以在发布时将其自身作为观察者删除?
-(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
}
@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