SpriteKit 滚动背景图像显示图像之间的线
SpriteKit scrolling background image showing line between images
我正在学习如何在 iOS 中制作游戏,所以我决定使用我自己的资产复制马里奥兄弟的第一关,只是为了学习如何制作它们。
我现在遇到的问题是,在创建滚动背景时,使用我在 Hacking with Swift 上找到的这个公式,我的图像之间总是有一条线。
我检查过我的图像在 AI 文件中没有边框。 (图片就是上图)
import SpriteKit
import GameplayKit
class GameScene: SKScene {
private var player = SKSpriteNode()
private var bg = SKSpriteNode()
override func didMove(to view: SKView) {
let playerTexture = SKTexture(imageNamed: "player")
player = SKSpriteNode(texture: playerTexture)
player.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
addBackground()
self.addChild(player)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
}
// MARK: UTILITY FUNCTIONS
func addBackground() {
let bgTexture = SKTexture(imageNamed: "bg")
for i in 0 ... 1 {
bg = SKSpriteNode(texture: bgTexture)
//bg.position = CGPoint(x: (i == 0 ? bgTexture.size().width : bgTexture.size().width - 1) * CGFloat(i), y: self.frame.midY)
bg.position = CGPoint(x: (bgTexture.size().width * CGFloat(i)) - CGFloat(1 * i), y: 0)
bg.size.height = self.frame.height
//bg.anchorPoint = CGPoint.zero
bg.zPosition = -10
self.addChild(bg)
let moveLeft = SKAction.moveBy(x: -bgTexture.size().width, y: 0, duration: 5)
let moveReset = SKAction.moveBy(x: bgTexture.size().width, y: 0, duration: 0)
let moveLoop = SKAction.sequence([moveLeft, moveReset])
let moveForever = SKAction.repeatForever(moveLoop)
bg.run(moveForever)
}
}
}
只需创建一个新项目,复制粘贴它,您应该会看到它运行
我还将 GameScene.sks
尺寸更改为:2688 x 1242
我为使背景全屏显示所做的最后一项更改是按照 中所述设置 LaunchScreen,这似乎是 Xcode 12
中的一个问题
我了解到 Hacking with Swift post 中的公式使图像重叠 1px,我尝试从中删除 1 * i
部分,但结果不是不一样。
我做的另一件事是验证图像是否完美地“连接”在一起,它们确实如此,您在下图中看到的线条来自 AI canvas,两张图像都连接在“仙人掌”。
我也试过 运行 将它放入设备中,以防它可能是模拟器中的错误:
您的图片左侧和顶部有一个 1 像素宽的黑色细边框。它是黑色的。删除它并重试。
我正在学习如何在 iOS 中制作游戏,所以我决定使用我自己的资产复制马里奥兄弟的第一关,只是为了学习如何制作它们。
我现在遇到的问题是,在创建滚动背景时,使用我在 Hacking with Swift 上找到的这个公式,我的图像之间总是有一条线。
我检查过我的图像在 AI 文件中没有边框。 (图片就是上图)
import SpriteKit
import GameplayKit
class GameScene: SKScene {
private var player = SKSpriteNode()
private var bg = SKSpriteNode()
override func didMove(to view: SKView) {
let playerTexture = SKTexture(imageNamed: "player")
player = SKSpriteNode(texture: playerTexture)
player.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
addBackground()
self.addChild(player)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
}
// MARK: UTILITY FUNCTIONS
func addBackground() {
let bgTexture = SKTexture(imageNamed: "bg")
for i in 0 ... 1 {
bg = SKSpriteNode(texture: bgTexture)
//bg.position = CGPoint(x: (i == 0 ? bgTexture.size().width : bgTexture.size().width - 1) * CGFloat(i), y: self.frame.midY)
bg.position = CGPoint(x: (bgTexture.size().width * CGFloat(i)) - CGFloat(1 * i), y: 0)
bg.size.height = self.frame.height
//bg.anchorPoint = CGPoint.zero
bg.zPosition = -10
self.addChild(bg)
let moveLeft = SKAction.moveBy(x: -bgTexture.size().width, y: 0, duration: 5)
let moveReset = SKAction.moveBy(x: bgTexture.size().width, y: 0, duration: 0)
let moveLoop = SKAction.sequence([moveLeft, moveReset])
let moveForever = SKAction.repeatForever(moveLoop)
bg.run(moveForever)
}
}
}
只需创建一个新项目,复制粘贴它,您应该会看到它运行
我还将 GameScene.sks
尺寸更改为:2688 x 1242
我为使背景全屏显示所做的最后一项更改是按照
我了解到 Hacking with Swift post 中的公式使图像重叠 1px,我尝试从中删除 1 * i
部分,但结果不是不一样。
我做的另一件事是验证图像是否完美地“连接”在一起,它们确实如此,您在下图中看到的线条来自 AI canvas,两张图像都连接在“仙人掌”。
我也试过 运行 将它放入设备中,以防它可能是模拟器中的错误:
您的图片左侧和顶部有一个 1 像素宽的黑色细边框。它是黑色的。删除它并重试。