我有一个视图转换,可以让任何 UIView 对象跟随 cocos2d 节点。在 iOS 上运行良好,在本例中 UIButton 遵循其 Box2D 主体:
现在对于 Mac,我首先验证了我是否正确设置了覆盖 NSWindow,以便在 cocos2d OpenGL 视图之上绘制 NSView 对象。这行得通,就像在这种情况下使用 NSButton 一样:
但后来我了解到[NSView setTransform:..]
NSViews 没有方法。我不确定这是否是它在 Mac 上的工作方式,但这是我所做的:
// sometime after initializing the view
[nsView setWantsLayer:YES];
// every time I update transform:
nsView.layer.affineTransform = transform;
我验证了该层是非零的。我还重新验证了在启用 setWantsLayer 后绘制了 NSView。结果令人失望,按钮在整个窗口上无处可见,甚至似乎没有轻微偏移或镜像,它不再存在:
这让我想到了转换代码。正如我所说,这与 iOS 的代码相同(除了在最后分配转换)。它在 iOS 上完美运行(也可以在任何方向上),但在带有 NSView 对象的 Mac OS X 上却不行,我根本看不到 NSView 对象。
我不确定这里可能出了什么问题,也许 CALayer 的工作方式不同,也许我只是犯了一个非常愚蠢和明显的错误。我只是找不到任何东西。
KKAppDelegate* ad = (KKAppDelegate*)[KTApplication sharedApplication].delegate;
float windowHeight = ad.window.frame.size.height;
float x = _position.x - _contentSize.width * _anchorPoint.x;
float y = windowHeight - (_position.y + _contentSize.height * _anchorPoint.y);
if (_ignoreAnchorPointForPosition)
{
x += _anchorPointInPoints.x;
y += _anchorPointInPoints.y;
}
float cx = 1, sx = 0, cy = 1, sy = 0;
if (_rotationX || _rotationY)
{
float radiansX = CC_DEGREES_TO_RADIANS(_rotationX);
float radiansY = CC_DEGREES_TO_RADIANS(_rotationY);
cx = cosf(radiansX);
sx = sinf(radiansX);
cy = cosf(radiansY);
sy = sinf(radiansY);
}
CGAffineTransform transform =
CGAffineTransformMake(cy * _scaleX, sy * _scaleX,
-sx * _scaleY, cx * _scaleY, x, y);
#if KK_PLATFORM_IOS
_cocoaView.transform = transform;
#elif KK_PLATFORM_MAC
_cocoaView.layer.affineTransform = transform;
#endif
我验证了代码运行并且 x/y 值是可以预期的(即没有负位置或疯狂值)。甚至在第一步都没有执行旋转,但是在第一帧的变换和绘制之后我仍然看不到 NSView。
我是 CALayer 的总 n00b 并将转换应用于 NSView。如果不是解决方案,我将不胜感激,然后提供一些有关如何调试的提示。谢谢!
更新:
我开始尝试通过小值更改图层的变换,看看会发生什么。
CGAffineTransform transform = _cocoaView.layer.affineTransform;
transform = CGAffineTransformTranslate(transform, 0.1, 0.1);
_cocoaView.layer.affineTransform = transform;
这样做的效果是一个缓慢移动的 NSButton。它一直向上和向右移动,但在视图框架的边界矩形处消失了:
所以我相信我的问题是视图没有被转换,只是图层 - 当我转换图层时,它会快速将视图的内容绘制到图层边界之外,因此不再显示任何内容。
我是否正确地假设我必须直接更改视图的属性?文档也强调了这一点。在这一点上,我只是不知道如何将转换应用到视图(即我回到第一方)。我尝试手动设置旋转和框架原点,但这样我无法将旋转中心与 cocos2d 节点的中心(anchorPoint)对齐。