我做了一个汽车环绕行星的小游戏。摄像机始终以距离行星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)
答案 0 :(得分: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)
更新:我刚观看了您的视频,并意识到我的回答对外观做了一些不正确的假设。但是,裁剪节点方法仍然是合理的,只需要稍微设置精灵节点,以便重复纹理。具有透明度的纯精灵对于如此巨大且不规则(并且可能是生成的)行星不起作用。