나는 모든 UIView 개체가 cocos2d 노드를 따르도록 뷰 변환을했습니다. UIView에서 NSView로 작동하는 뷰 변환을 적용하는 방법은 무엇입니까?
지금 Mac 용 내가 먼저 내가적인 Cocos2D의 OpenGL을 위에 NSView의 객체를 그리기 위해 제대로 오버레이 NSWindow 표시 설정이 있는지 확인하십시오있는 UIButton이 Box2D의 본문을 다음 예에서, iOS에서 잘 작동 전망.
을하지만 내가 NSViews에 대한 [NSView setTransform:..]
방법이 없다는 것을 알게 : 그건 NSButton이 경우처럼 작동합니다. 이것이 Mac에서 작동하는 방법인지 모르겠지만 여기에 내가 한 일이 있습니다.
// sometime after initializing the view
[nsView setWantsLayer:YES];
// every time I update transform:
nsView.layer.affineTransform = transform;
레이어가 아닌 것으로 확인되었습니다. 또한 setWantsLayer를 활성화 한 후에 NSView가 그려지는지 다시 확인했습니다. 그 결과가 조금이라도 오프셋 또는 미러링하지 않는 것, 버튼이 아무데도 전체 창에서 볼 수, 실망, 그것은 더 이상 그냥 거기 :
이가 나를 데리고 온다 변환 코드. 앞에서 말했듯이 이것은 iOS와 같은 코드입니다 (마지막에 변환을 지정하는 것을 제외하고). 그것은 iOS (모든 방향에서도)에서 완벽하게 작동하지만 더 이상 NSView 객체를 전혀 볼 수없는 NSView 객체가있는 Mac OS X에서는 작동하지 않습니다.
나는 무엇이 잘못 될 수 있을지 모르겠다. 아마도 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의 효과. 그것은 위로 오른쪽으로 이동 유지하지만, 뷰 프레임의 경계 RECT에서 사라 :
그래서 여기 내 문제는보기, 그냥 레이어를 변형되지 않는 것입니다 생각 - 그리고 때 레이어를 변환하면 레이어의 경계를 벗어난보기의 내용이 빠르게 그려 지므로 아무 것도 더 이상 표시되지 않습니다.
대신보기 속성을 직접 변경해야한다고 가정하는 것이 맞습니까? 이 문서는 또한이 점을 강조합니다. 이 시점에서 뷰에 변환을 적용 할 수있는 방법을 알지 못합니다. 즉 다시 사각형으로 돌아갑니다.회전 및 프레임 원점을 수동으로 설정하려고 시도했지만 회전 중심을 cocos2d 노드의 중심 (anchorPoint)과 정렬 할 수 없습니다.
덕분에, 내가 탄 것을 줄 것이다. – LearnCocos2D
일종의 작품이지만 큰 단점이 있습니다. 수퍼 뷰는 메인 윈도우와 같은 크기의 오버레이 윈도우입니다. 왜냐하면 어떤 이유에서든 contentView에서 레이어지지를 사용하면 모든 사용자 입력을 사용할 수 없게됩니다. 창 안쪽뿐만 아니라 창 x + - 아이콘도 있습니다 (이것은 창 크기가 너무 크기 때문일 수 있습니다). 또한 흥미로운 점은 오버레이 윈도우의 contentView가 레이어 기반이지만 서브 뷰가없는 경우보기 (버튼)가 추가 될 때까지 프레임 속도가 30fps로 느려집니다. 그래도 500 포인트를받을 자격이 있습니다. ;) – LearnCocos2D
NSView의 - (void) setFrameRotation : (CGFloat) angle 또는 - (void) setFrameCenterRotation : (CGFloat)을 사용하여 윈도우의 contentView를 레이어 백킹하는 대신에 회전이 필요한 경우 기존의 메서드를 사용하여 뷰를 회전하는 방법을 사용할 수 있습니다.)각도. NSControl 인 경우 객체의 클래스를 확인하고 그런 식으로 회전 할 수 있습니다. – Jorge