SKSpriteNode - некорректный рендеринг тени? - PullRequest
2 голосов
/ 27 мая 2020

Я использую Xcode 11.4.1 и Swift 5.2.2, и я пытаюсь отбросить тень с помощью SKLightNode на круговой SKSpriteNode.

Однако тень отбрасывается на прямоугольную angular рамку SpriteNode, а не на изображение круга png, которое я использую.

Это желаемый эффект

Вот что происходит

В первом изображении я использую круг размером 611x611px PNG, а во втором я использую 612x612 PNG. Я обнаружил, что эта «угловая тень» возникает только при использовании определенных c размеров изображения для создания SpriteNode.

В частности, в ходе моего тестирования квадратные изображения размером <688 пикселей и> 601 пикселей не отображают тени углов, кроме размеров точно 612 и 608. Я тестирую это на игровой площадке, но та же проблема происходит в полном xcodeproj.

Что я здесь сделал не так? Я сомневаюсь, что проблема в моем коде, но вот он:

import PlaygroundSupport
import SpriteKit

class GameScene: SKScene {

    override func didMove(to view: SKView) {
        let background = SKSpriteNode(color: UIColor.blue, size: frame.size)
        background.zPosition = 0
        background.position = CGPoint(x: frame.midX, y: frame.midY)
        background.lightingBitMask = 1
        addChild(background)

        let light = SKLightNode()
        light.zPosition = 100
        light.categoryBitMask = 1
        light.falloff = 0.5
        light.lightColor = UIColor.white
        light.position = CGPoint(x: frame.midX, y: frame.midY)
        addChild(light)

        let sprite = SKSpriteNode(imageNamed: "612.png")
        sprite.color = UIColor.yellow
        sprite.colorBlendFactor = 1
        sprite.zPosition = 3
        sprite.position = CGPoint(x: frame.midX, y: frame.midY + 100)
        sprite.size = CGSize(width: 100, height: 100)
        sprite.physicsBody = SKPhysicsBody(circleOfRadius: 50)
        sprite.physicsBody?.categoryBitMask = 2
        sprite.shadowCastBitMask = 1
        sprite.lightingBitMask = 1
        sprite.physicsBody?.isDynamic = false
        addChild(sprite)
    }
}

let sceneView = SKView(frame: CGRect(x:0 , y:0, width: 640, height: 480))

let scene = GameScene()
scene.scaleMode = .aspectFill
scene.size = sceneView.frame.size
sceneView.presentScene(scene)

PlaygroundSupport.PlaygroundPage.current.liveView = sceneView
...