swift - 创建的按钮出现在游戏中的其他场景中
问题描述
// 按钮类
类按钮:UIButton {
override init(frame: CGRect){
super.init(frame: frame)
setup()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setup(){
backgroundColor = #colorLiteral(red: 0.1215686277, green: 0.01176470611, blue: 0.4235294163, alpha: 1)
layer.cornerRadius = 12
layer.masksToBounds = false
translatesAutoresizingMaskIntoConstraints = false
}
}
// 创建按钮对象的类
结构问题 { var 问题:字符串!var 答案:[字符串]!var AnswerNumber : 整数!}
类LevelOne:SKScene {
var button = Button()
var buttons = [Button]()
let Question_met = UILabel(frame: CGRect(x: 0.3, y: 0.3, width: 40, height: 21))
var Questions = [Question]()
var QNumber = Int()
var buttonNames = [""]
var AnsNumber = Int()
let selectors:[Selector] = [#selector(handleButton1), #selector(handleButton2), #selector(handleButton3),#selector(handleButton4)]
override func didMove(to view: SKView) {
let background = SKSpriteNode(imageNamed: "background")
background.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
background.zPosition = 0
self.addChild(background)
questionFunction()
buttonFuction()
pickQuestion()
}
@objc func questionFunction(){
Questions = [Question(Question: "What is a BMW ?", Answers: ["Bat","Cat","Vehicle","Pat"], AnswerNumber: 2),
Question(Question: "What is a Boeing ?", Answers: ["Bat","Aircraft","Cat","Pat"], AnswerNumber: 1),
Question(Question: "What is a Ant ?", Answers: ["Insect","Cat","Insect","Nate"], AnswerNumber: 2),
Question(Question: "What is a Apple ?", Answers: ["Fruit","Cat","bat","Pat"], AnswerNumber: 0),
Question(Question: "Where is london ?", Answers: ["UK","USA","France","Germany"], AnswerNumber: 0),
Question(Question: "Where is New York ?", Answers: ["Canada","USA","France","Germany"], AnswerNumber: 2),
Question(Question: "where is Berlin ?", Answers: ["UK","USA","Italy","Germany "], AnswerNumber: 3),
Question(Question: "Where is Toronto ?", Answers: ["India","Africa","Canada","Norway"], AnswerNumber: 2),
Question(Question: "Where is Rome ?", Answers: ["Japan","China","Italy","Ireland"], AnswerNumber: 2),
Question(Question: "where is Chennai ?", Answers: ["India","Brazil","Swiss","Germany"], AnswerNumber: 0),]
Question_met.frame = CGRect(x: 330, y: 70, width: 200, height: 21)
Question_met.backgroundColor = UIColor.orange
Question_met.textColor = UIColor.white
Question_met.textAlignment = NSTextAlignment.center
Question_met.text = "What caused Global Warming ?"
self.view?.addSubview(Question_met)
}
@objc func buttonFuction(){
let stacView = UIStackView()
stacView.spacing = 12
stacView.distribution = .fillEqually
stacView.axis = .horizontal
stacView.translatesAutoresizingMaskIntoConstraints = false
view!.addSubview(stacView)
buttonNames = ["One","Two","Three","Four"]
for i in 0..<4{
button = Button()
button.setTitle(buttonNames[i], for: .normal)
stacView.addArrangedSubview(button)
buttons.append(button)
button.addTarget(self, action: selectors[i], for: .touchUpInside)
}
NSLayoutConstraint.activate([stacView.centerXAnchor.constraint(equalTo: view!.centerXAnchor),stacView.centerYAnchor.constraint(equalTo: view!.centerYAnchor),stacView.widthAnchor.constraint(equalToConstant: 350),stacView.heightAnchor.constraint(equalToConstant:70)])
}
@objc func pickQuestion(){
if Questions.count > 0{
QNumber = 0
Question_met.text = Questions[QNumber].Question
AnsNumber = Questions[QNumber].AnswerNumber
for i in 0..<buttons.count{
buttons[i].setTitle(Questions[QNumber].Answers[i], for: .normal)
}
Questions.remove(at: QNumber)
}
else {
print("Done!")
let sceneToMoveTo = Instructions(size: self.size)
sceneToMoveTo.scaleMode = self.scaleMode
let myTransition = SKTransition.fade(withDuration: 0.5)
self.view!.presentScene(sceneToMoveTo, transition: myTransition)
}
}
@objc func handleButton1() {
if AnsNumber == 0 {
pickQuestion()
print("Correct!")
}
else {
print("You are Wrong!!!")
}
}
@objc func handleButton2(){
if AnsNumber == 1 {
pickQuestion()
print("Correct!")
}
else {
print("You are Wrong!!!")
}
}
@objc func handleButton3(){
if AnsNumber == 2 {
pickQuestion()
print("Correct!")
}
else {
print("You are Wrong!!!")
}
}
@objc func handleButton4(){
if AnsNumber == 3 {
pickQuestion()
print("Correct!")
}
else {
print("You are Wrong!!!")
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
}
我目前正在开发一个游戏,其中包含各种级别和菜单场景。当前关卡创建了问题标签和答案按钮,即使在关卡完成并且您导航到另一个场景之后,无论您浏览哪个场景,按钮和问题都会保留在场景中。
我希望得到一个解决方案,只有按钮和标签出现在指定的场景中,除非另有说明,否则不会出现在其他场景中。
先感谢您。
解决方案
我认为您不了解这里的所有权模型。ViewController 拥有它的视图。视图拥有 SKView,SKView 拥有 SKScene。从 SKScene 到它的 SKView 有一个反向指针,您正在使用它来将 UIKit StakcView 添加到场景的父视图。由于 UIKit 位于 SKScene 之上,因此您的按钮始终可见。这里正确的架构是视图应该添加和管理自己的子视图。每当它加载一个新的 SKScene 时,它应该确定该场景需要什么 UI,然后隐藏任何不应显示的 UI。您可以通过在相关视图上设置 .isHidden 来做到这一点。
推荐阅读
- c - 在 C 中记录所有新进程
- python-3.x - 在行为python中重用特征文件之间的公共步骤定义
- javascript - 使用 react-daterange-picker 的打字稿错误“没有重载匹配此调用。”
- docker - JKube 在 GitHub 存储库上部署的 Pod 在 MicroK8 中部署时导致 401
- r - 过滤最大值大于限制的组
- bash - 用空格解析var
- oracle - PLS-00382:表达式类型错误 - 在 oracle 函数中使用数组作为 var 时
- python - 如何将不同的条目绑定到返回键
- c# - 如何从 C# SQL Server 中的特定架构中删除所有表?
- jetty - Jetty 10 中的 addLifeCycleListener 发生了什么?