我希望cocos2d在坐标小于1时使用节点的位置作为标准化因子,否则当坐标大于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;
所以我的问题是你在哪里放置这些代码,以便cocos2d以这种方式工作没有问题,或者你采取什么方法,如果它与上面显示的不同
更新
我更改了positionInPixels_
positionInPixels
的每一次调用/分配
这意味着每次都会使用相应的getter和setter来代替CCNode的positionInPixels_成员变量。
然后我更改了setPosition
和setPositionInPixels
中的CCNode.m
的 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 :(得分: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