2016-09-19 4 views
3

나는 차가 행성 주위를 돌아 다니는 작은 게임을하고 있습니다. 카메라는 항상 행성에서 90도 각도로 기계로 향하게됩니다. 행성의 질감이 카메라와 함께 회전한다는 문제가 발생했습니다. 카메라가 회전하지 않으면 텍스처가 정상적으로 작동합니다. 이 문제를 어떻게 해결할 수 있습니까?SpriteKit. Stop CameraNode로 텍스처 회전

beizerPath에서 지구를 만들기 :

planetTexture = SKTexture(imageNamed: "asanoha") 

planet = SKShapeNode(path: beizerPath.cgPath) 
planet.position = CGPoint(x: 0, y: 0) 
planet.zPosition = 10 
planet.physicsBody = SKPhysicsBody(polygonFrom: beizerPath.cgPath) 
planet.physicsBody?.isDynamic = false 
planet.physicsBody?.categoryBitMask = planetGroup 
planet.fillColor = SKColor.white 
planet.fillTexture = planetTexture 
planet.strokeColor = getRandomColor() 
planet.lineWidth = 7 
planet.glowWidth = 0.5 

sceneNode.addChild(planet) 

카메라 위치 :

var cam = SKCameraNode() 

override func didMove(to view: SKView) { 
    self.camera = cam 
} 

let angle = atan2(car.position.y, car.position.x) 
let theta : CGFloat = 0.0 

let cx = (Float(a) * cosf(Float(angle - theta))) 
let cy = (Float(a) * sinf(Float(angle - theta))) 

cam.position = CGPoint(x: CGFloat(cx), y: CGFloat(cy)) 
cam.zRotation = angle - CGFloat(M_PI_2) 

My problem on video

답변

2

그 이유는 모양이 채우기가 스크린 공간에서 수행하는 것입니다. 텍스처는 텍스처 좌표로 SKShapeNode에 매핑되지 않으며 채우기 색상처럼 처리됩니다.

해결책은 SKSpriteNode 또는 SKCropNode을 사용하는 것입니다. 스프라이트 노드를 사용한다면, 이미지는 이미 가장자리 둘레에서 투명도를 가지고있어 행성의 원형을 얻을 수 있습니다. 자르기 노드를 사용하는 경우 사각형 스프라이트 노드를 자식으로 추가 한 다음 마스크 노드 속성을 모양 노드로 설정하면 렌더링 된 마스크 된 부분이 결정됩니다.

자르기 노드 방법은 다음과 같이 될 것이다 :

planetTexture = SKTexture(imageNamed: "asanoha") 
planetSprite = SKSpriteNode(texture: planetTexture) 
planetMask = SKShapeNode(path: beizerPath.cgPath) 
planetMask.fillColor = UIColor.white 
planet = SKCropNode() 
planet.maskNode = planetMask 
planet.addChild(planetSprite) 
sceneNode.addChild(planet) 

업데이트 : 난 그냥 동영상을 지켜 내 대답은 모양에 대한 몇 가지 잘못된 가정을했다 깨달았다. 그러나 자르기 노드 접근법은 여전히 ​​소리가 있습니다. 스프라이트 노드를 조금 다르게 설정해야 텍스쳐가 반복됩니다. 투명성을 지닌 순수한 스프라이트는 거대하고 불규칙한 (그리고 아마 생성 된) 행성에서는 작동하지 않습니다.

+0

멋진 답변입니다. 고마워요! SKCropNode는 완벽하게 작동합니다. 필자는 SkShapeNode가 fillColor를 가져야 만한다는 점을 주목합니다. 그렇지 않으면 작동하지 않습니다. –

+0

@DmitriyRodygin 물론, 괜찮습니다.'maskNode'는 자식이 렌더링 된 다음 알파 마스크로 사용되는 것처럼 동작합니다 (실제로는 버퍼가 실제로 필요하지 않습니다). 따라서 'maskNode'의 자식 불투명 한 내용을 생성합니다. 그건 그렇고 - SO에 오신 것을 환영합니다 - 당신이 아주 새롭다는 것을 알기 때문에 아직 편집 할 수 없으므로 언급 한 변경 사항을 편집 할 것입니다. 또한 당신이 좋은/유용하다고 생각하는 질문과 대답 모두에 투표 할 수 있습니다 (자신의 질문에 대한 대답이 아니라 다른 질문에 대한 대답). – jhabbott

+0

대단히 감사드립니다! –

관련 문제