我正在尝试为iOS构建通用游戏,该游戏使用的精灵会稍微放大,以便可以将其稍微缩小以适合任何设备。
我遇到的问题是,按比例缩小后,精灵会变得稍微变形或未对齐。
例如(image1),我有一个边框和一个正方形,正方形应该完全适合边框内的任何间隙。但是,正如您在我的第二张图片(image2)中看到的那样,正方形顶部出现了一个小灯。
缩放是在开始时(在GameViewController中)执行的,我将计算gameScene的宽度和高度,以适应下面的显示区域(750 x 450)代码:
var fullAreaSize: CGSize!
override func viewDidLoad() {
super.viewDidLoad()
let skView = self.view as! SKView
skView.ignoresSiblingOrder = true
skView.showsFPS = true
skView.showsNodeCount = true
skView.isMultipleTouchEnabled = false
skView.showsPhysics = true
fetchDeviceSizes()
let scene = GameScene(size: fullAreaSize)
scene.scaleMode = .aspectFill
skView.presentScene(scene)
}
func fetchDeviceSizes() {
let focusAreaSize = CGSize(width: 750, height: 450)
let scaleX:CGFloat = focusAreaSize.width / view.bounds.size.width
let scaleY:CGFloat = focusAreaSize.height / view.bounds.size.height
if scaleX > scaleY {
fullAreaSize = CGSize(width: CGFloat(Int(view.bounds.size.width * scaleX)), height: CGFloat(Int(view.bounds.size.height * scaleX)))
} else {
fullAreaSize = CGSize(width: CGFloat(Int(view.bounds.size.width * scaleY)), height: CGFloat(Int(view.bounds.size.height * scaleY)))
}
}
下面是我添加的精灵:
override func didMove(to view: SKView) {
anchorPoint = CGPoint(x: 0.5, y: 0.5)
backgroundColor = UIColor.white
let baseSprite = SKSpriteNode()
baseSprite.position.y = -1
addChild(baseSprite)
let borderSprite = SKSpriteNode(imageNamed: "border")
baseSprite.addChild(borderSprite)
let fillSprite = SKSpriteNode(imageNamed: "fill")
borderSprite.addChild(fillSprite)
}
从外观上看,每个子画面都是独立缩放的,这就是为什么两个子画面不能完全对齐的原因(因为在子画面的边缘创建了较小的透明度)。有什么可以做的以确保不会发生这种未对准/扭曲的情况?例如,使所有子图变平或渲染然后缩放(如果我将缩放保持正常,则对齐是完美的)?
我在某处读到,使用int宽度和高度应该可以阻止这种未对准/扭曲,但这似乎行不通。我也玩过scaleMode,但是这也没有用。将两个Sprite都分配给父Sprite,然后缩放父Sprite也无效。
很长的问题很抱歉!任何帮助将不胜感激。