SpriteKit。使用CameraNode停止旋转纹理

时间:2016-09-19 15:00:44

标签: swift sprite-kit

我做了一个汽车环绕行星的小游戏。摄像机始终以距离行星90度的角度指向机器。我遇到了一个问题,即行星的纹理随着相机一起旋转。如果相机不旋转,纹理就会表现得如此。我该如何解决这个问题?

从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

1 个答案:

答案 0 :(得分: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)

更新:我刚观看了您的视频,并意识到我的回答对外观做了一些不正确的假设。但是,裁剪节点方法仍然是合理的,只需要稍微设置精灵节点,以便重复纹理。具有透明度的纯精灵对于如此巨大且不规则(并且可能是生成的)行星不起作用。