我有一個視圖轉換,使任何UIView對象跟隨一個cocos2d節點。做工精細iOS上,在這個例子中的UIButton遵循其Box2D的身體:如何將適用於UIView的視圖轉換應用於NSView?
現在的Mac我第一次驗證了我正確的有覆蓋NSWindow設置,以借鑑的cocos2d OpenGL上的一個NSView對象視圖。這樣的作品,因爲在這種情況下,與NSButton:
但後來我瞭解到,有是NSViews沒有[NSView setTransform:..]
方法。我不確定這是如何在Mac上運行,但這是我做的:
// sometime after initializing the view
[nsView setWantsLayer:YES];
// every time I update transform:
nsView.layer.affineTransform = transform;
我驗證該圖層非零。我還重新驗證了NSView是在啓用setWantsLayer之後繪製的。結果是令人失望的,按鈕是無處整個窗口上看到,這並不甚至似乎略微偏移或鏡像,它只是不存在了:
這使我的轉換代碼。正如我所說的,這與iOS的代碼相同(除了最後指定轉換)。它可以在iOS上完美工作(也可以在任何方向),但不能在Mac OS X上使用NSView對象,在那裏我根本看不到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。我會很感激,如果不是解決方案,然後一些提示如何調試。謝謝!
UPDATE:
我開始改變層的小值變換看個究竟玩耍。
CGAffineTransform transform = _cocoaView.layer.affineTransform;
transform = CGAffineTransformTranslate(transform, 0.1, 0.1);
_cocoaView.layer.affineTransform = transform;
這個效果是一個緩慢移動的NSButton。它不停地向上移動,並在右邊,但它消失在視圖幀的邊界矩形:
所以我相信我在這裏的問題是,視圖不會改變,只是層 - 當我轉換圖層會快速將視圖的內容繪製到圖層邊界之外,因此不再顯示任何內容。
我是否有權假定我必須直接改變視圖的屬性呢?文件也強調了這一點。在這一點上,我只是不知道如何將轉換應用於視圖(即我回到了原點)。我嘗試手動設置旋轉和框架原點,但這樣我無法將旋轉中心與cocos2d節點的中心(anchorPoint)對齊。
謝謝,我會給予一個鏡頭。 – LearnCocos2D
這類工作但有一個很大的缺點:由於superview是一個與主窗口大小相同的覆蓋窗口,出於某種原因在其contentView上啓用層支持會禁用所有用戶輸入。不僅僅在窗口內部,而且還包括窗口的x + - 圖標(這可能是因爲窗口實際上太大)。另外有趣的是:如果覆蓋窗口的contentView是分層支持的,但沒有子視圖,則會減慢幀率到30 fps,直到添加視圖(按鈕)。不過,你應該得到500分。 ;) – LearnCocos2D
如果你只需要旋轉,那麼對層次支持窗口的contentView的替代方法是使用NSView的 - (void)setFrameRotation:(CGFloat)角度或 - (void)setFrameCenterRotation :(CGFloat )角度。你可以檢查對象的類,並且如果它是NSControl,就可以這樣旋轉它。 – Jorge