2016-09-19 62 views
3

我正在做一個小遊戲,汽車繞行星。相機總是以與地球成90度的角度對準機器。我遇到了一個問題,即行星的質感與相機一起旋轉。如果相機不旋轉,紋理表現得應該如此。我該如何解決?SpriteKit。停止與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,它被視爲像填充顏色。

解決方法是使用SKSpriteNodeSKCropNode。如果你使用精靈節點,你的圖像已經具有透明度,以獲得行星的圓形形狀。如果使用裁剪節點,則可以將方形精靈節點添加爲子節點,然後將其掩碼節點屬性設置爲您的形狀節點 - 這將確定被渲染的遮罩部分。

作物節點的方法是這樣的:

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 @DmitriyRodygin當然,你說得很對 - 'maskNode'的行爲就好像它的子元素被渲染,然後用作alpha掩碼(實際上沒有實際需要緩衝區),所以'maskNode'的子元素需要產生不透明的內容。順便說一句 - 歡迎來到我 - 我注意到你很新,所以你可能還沒有編輯,所以我會編輯你提到的那些改變。另外請注意,您可以對您認爲很好/有用的問題和答案進行投票(不僅僅是對自己問題的回答,也包括其他問題)。 – jhabbott

+0

非常感謝! –