【问题标题】:swift background color + button/image bug快速背景颜色+按钮/图像错误
【发布时间】:2015-05-16 01:27:37
【问题描述】:

我刚刚在测试我的应用程序时遇到了一个非常奇怪的错误。

import Foundation
import SpriteKit
import AVFoundation

class EndScene : SKScene {

var Highscore : Int!
var ScoreLabel : UILabel!
var HighscoreLabel : UILabel!
var AudioPlayer = AVAudioPlayer()

override func didMoveToView(view: SKView) {

    scene?.backgroundColor = UIColor.grayColor()

    var EndGameMusic = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("endSong", ofType: "wav")!)
    AudioPlayer = AVAudioPlayer(contentsOfURL: EndGameMusic, error: nil)
    AudioPlayer.prepareToPlay()
    AudioPlayer.play()

    var scoreDefault = NSUserDefaults.standardUserDefaults()
    var Score = scoreDefault.valueForKey("Score") as! NSInteger

    var HighscoreDefault = NSUserDefaults.standardUserDefaults()
    Highscore = HighscoreDefault.valueForKey("Highscore") as! NSInteger

    NSLog("\(Highscore)")

    ScoreLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 30))
    ScoreLabel.center = CGPoint(x: view.frame.size.width, y: view.frame.size.width/4)
    ScoreLabel.text = "Last Game:\(Score)"
    self.view?.addSubview(ScoreLabel)

    HighscoreLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 30))
    HighscoreLabel.center = CGPoint(x: view.frame.size.width, y: view.frame.size.width/2)
    HighscoreLabel.text = "Highscore: \(Highscore)"
    self.view?.addSubview(HighscoreLabel)

    let RestartBtn = SKSpriteNode(imageNamed: "RestartBtn")
    RestartBtn.position = CGPointMake(size.width/2, size.height/2)
    RestartBtn.name = "Restart"
    addChild(RestartBtn)
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */
        for touch: AnyObject in touches {
            let touchLocation = touch.locationInNode(self)
            let touchedNode = self.nodeAtPoint(touchLocation)
            if(touchedNode.name == "Restart"){
                Restart()
            }
        }
}
func Restart(){
    self.view?.presentScene(InGame(), transition: SKTransition.crossFadeWithDuration(0.3))
    HighscoreLabel.removeFromSuperview()
    ScoreLabel.removeFromSuperview()
}
}

发生的情况是,当调用此场景时,会出现两个标签,即 highscore 和 score,但我的背景变为黄色,并且我用作按钮的图像不存在,但如果我触摸任何地方在屏幕上(无论边界如何,我都试过了)它会激活按钮并退出。

如果我删除此代码:

let RestartBtn = SKSpriteNode(imageNamed: "RestartBtn")
RestartBtn.position = CGPointMake(size.width/2, size.height/2)
RestartBtn.name = "Restart"
addChild(RestartBtn)

然后错误不会发生并且背景设置正常,所以我知道这段代码有问题,并假设由于某种原因它被放大了我的图像(不能发布没有 10 声望...)

然而,在调整大小和修复这个问题的所有尝试之后,实际上没有任何帮助,但我仍然忍不住认为这是一个相对简单的解决方案,只是这段代码在我之前的场景中使用没有任何问题。

有什么建议吗?

编辑:我确定它采用了我图像的颜色并将其用作背景,并将整个背景设置为重新启动按钮,我只是尝试使用另一张不同样式的图像。

编辑 2:图像大小 = 200x80,我在第一次编辑中使用的图像缩小到 40x80

【问题讨论】:

    标签: ios image swift debugging background


    【解决方案1】:

    这不是一个错误,所以基本上 SKSpriteNode 的工作方式是它们采用图像文件的大小,因为您没有在其他任何地方明确设置大小。根据您的代码,我猜您的图像超过 1000 x 1000 像素,因此它占据了整个屏幕。例如,iPhone 6 的尺寸在 xCode 中约为 667 x 375 像素,因此从某种意义上说,您的重启按钮实际上比屏幕大。要解决此问题,请将 xScale 和 yScale 值设置为低,看看有什么效果(使精灵的大小更小)

    RestartBtn.xScale = 0.01
    RestartBtn.yScale = 0.01
    

    这将使按钮小 100 倍(或以前大小的 1/100),只需调整这些值,直到获得您喜欢的大小。

    编辑:所以我之前在 spriteKit 中也遇到过这个问题。由于某些原因,屏幕的大小会变得混乱,除非您在声明场景的地方设置它的大小。

    (What you called your screen).size = skView.bounds.size
    

    例如,如果你喜欢

    let skView = self.view as SKView!
    myScene = GameScene()
    myScene.size = skView.bounds.size
    skView.presentScene(myScene)
    

    【讨论】:

    • 我的图像大小为 200 x 80 像素,我在第一次编辑中使用的图像是 40x80。还是试试看,谢谢。
    • 所以它起作用了,但我必须缩放到 0.001 才能看到整个按钮。考虑到图像的大小,你知道是什么导致图像变得如此之大吗?这样我以后就可以避免这种情况了。
    猜你喜欢
    • 2021-10-29
    • 2016-02-27
    • 2016-11-09
    • 2012-05-15
    • 2013-06-24
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多