gpt4 book ai didi

ios - 如何使用 Singleton 在快速 Sprite Kit 游戏中显示分数标签

转载 作者:行者123 更新时间:2023-11-30 13:44:14 25 4
gpt4 key购买 nike

我已经尝试了几天来实现一个单例方法来更新我正在制作的游戏的每个级别的分数。我无法找出实现它的正确方法。我在构建和运行项目时没有错误,但在运行游戏时不会显示分数标签。我不知道为什么,但我知道这与单例方法没有正确实现有关。任何意见将不胜感激。下面的代码是我的第一个也是开头的场景,目前尚未显示分数标签或分数。

这是游戏的第一关:

import SpriteKit

class Singleton {

static let sharedInstance = Singleton()
var ScoreLabel = UILabel()
var Score : Int = 0


}



struct PhysicsCategory {
static let Enemy : UInt32 = 1
static let Bullet : UInt32 = 2
static let Player : UInt32 = 3
}



class GameScene: SKScene, SKPhysicsContactDelegate {
var HighScore = Int()
var Player = SKSpriteNode(imageNamed: "GoodGuy.png")
var Level1Label = UILabel()


override func didMoveToView(view: SKView) {
/* Setup your scene here */

var timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "update", userInfo: nil, repeats: true)

var HighScoreDefault = NSUserDefaults.standardUserDefaults()
if (HighScoreDefault.valueForKey("HighScore") != nil){

HighScore = HighScoreDefault.valueForKey("HighScore") as! NSInteger
}
else{
HighScore = 0
}




physicsWorld.contactDelegate = self

self.scene?.backgroundColor = UIColor.blackColor()

self.scene?.size = CGSize(width:640, height: 1136)

self.addChild(SKEmitterNode(fileNamed: "MagicParticle")!)

Player.position = CGPointMake(self.size.width/2, self.size.height/8)
Player.physicsBody = SKPhysicsBody (rectangleOfSize: Player.size)
Player.physicsBody?.affectedByGravity = false
Player.physicsBody?.categoryBitMask = PhysicsCategory.Player
Player.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
Player.physicsBody?.dynamic = false

Level1Label = UILabel (frame: CGRect(x:0, y:0, width: view.frame.size.width/3, height: 30))
Level1Label.center = CGPoint(x: view.frame.size.width/1.675 , y: view.frame.size.height/1.05)
Level1Label.textColor = UIColor.whiteColor()
Level1Label.text = "Level 1"
self.view?.addSubview(Level1Label)

Singleton.sharedInstance.ScoreLabel.text = "\(Singleton.sharedInstance.Score)"
Singleton.sharedInstance.ScoreLabel = UILabel(frame: CGRect(x:0, y:0, width:100, height:20))
Singleton.sharedInstance.ScoreLabel.backgroundColor = UIColor.clearColor()
Singleton.sharedInstance.ScoreLabel.textColor = UIColor.whiteColor()
self.view?.addSubview(Singleton.sharedInstance.ScoreLabel)


var Timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("SpawnBullets"), userInfo: nil, repeats: true)

var Enemytimer = NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: Selector("SpawnEnemies"), userInfo: nil, repeats: true)



self.addChild(Player)





}

func update() {
self.view?.presentScene(GameScene2())
Level1Label.removeFromSuperview()
}

func didBeginContact(contact: SKPhysicsContact) {
var firstBody : SKPhysicsBody = contact.bodyA
var secondBody : SKPhysicsBody = contact.bodyB
if ((firstBody.categoryBitMask == PhysicsCategory.Enemy) && (secondBody.categoryBitMask == PhysicsCategory.Bullet) ||
(firstBody.categoryBitMask == PhysicsCategory.Bullet) && (secondBody.categoryBitMask == PhysicsCategory.Enemy)){

CollisionWithBullet(firstBody.node as! SKSpriteNode, Bullet: secondBody.node as! SKSpriteNode)

}

else if ((firstBody.categoryBitMask == PhysicsCategory.Enemy) && (secondBody.categoryBitMask == PhysicsCategory.Player) ||
(firstBody.categoryBitMask == PhysicsCategory.Player) && (secondBody.categoryBitMask == PhysicsCategory.Enemy)){

CollisionWithPlayer(firstBody.node as! SKSpriteNode, Player: secondBody.node as! SKSpriteNode)
}


}


func CollisionWithBullet(Enemy: SKSpriteNode, Bullet: SKSpriteNode){
Enemy.removeFromParent()
Bullet.removeFromParent()
Singleton.sharedInstance.Score++


Singleton.sharedInstance.ScoreLabel.text = "\(Singleton.sharedInstance.Score)"
}



func CollisionWithPlayer(Enemy: SKSpriteNode, Player: SKSpriteNode){
var ScoreDefault = NSUserDefaults.standardUserDefaults()
ScoreDefault.setValue(Singleton.sharedInstance.Score, forKey: "Score")
ScoreDefault.synchronize()


if (Singleton.sharedInstance.Score > HighScore){

var HighScoreDefault = NSUserDefaults.standardUserDefaults()
HighScoreDefault.setValue(Singleton.sharedInstance.Score, forKey: "HighScore")

}


Enemy.removeFromParent()
Player.removeFromParent()
self.view?.presentScene(EndScene())
Level1Label.removeFromSuperview()

}

func SpawnBullets(){
var Bullet = SKSpriteNode(imageNamed: "Bullet.png")
Bullet.zPosition = -5
Bullet.position = CGPointMake(Player.position.x, Player.position.y)

let action = SKAction.moveToY(self.size.height + 30, duration: 1.0)
let actionDone = SKAction.removeFromParent()
Bullet.runAction(SKAction.sequence([action, actionDone]))


Bullet.physicsBody = SKPhysicsBody(rectangleOfSize: Bullet.size)
Bullet.physicsBody?.categoryBitMask = PhysicsCategory.Bullet
Bullet.physicsBody?.contactTestBitMask = PhysicsCategory.Enemy
Bullet.physicsBody?.affectedByGravity = false
Bullet.physicsBody?.dynamic = false
self.addChild(Bullet)
}

func SpawnEnemies(){
var Enemy = SKSpriteNode(imageNamed: "BadGuy.png")
var MinValue = self.size.width/8
var MaxValue = self.size.width - 150
let SpawnPoint = UInt32(MaxValue - MinValue)
Enemy.position = CGPoint(x: CGFloat(arc4random_uniform(SpawnPoint)), y: self.size.height)
Enemy.physicsBody = SKPhysicsBody(rectangleOfSize: Enemy.size)
Enemy.physicsBody?.categoryBitMask = PhysicsCategory.Enemy
Enemy.physicsBody?.contactTestBitMask = PhysicsCategory.Bullet
Enemy.physicsBody?.affectedByGravity = false
Enemy.physicsBody?.dynamic = true

let action = SKAction.moveToY(-70, duration: 3.0)
let actionDone = SKAction.removeFromParent()
Enemy.runAction(SKAction.sequence([action, actionDone]))

Enemy.runAction(SKAction.repeatActionForever(action))

self.addChild(Enemy)

}



override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */

for touch in touches {
let location = touch.locationInNode(self)

Player.position.x = location.x

}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)

Player.position.x = location.x

}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
}
}

这是游戏的第二关:

导入SpriteKit

struct PhysicsCategory2 {
static let Enemy : UInt32 = 1//00000000000000000000000000000001
static let Bullet : UInt32 = 2//00000000000000000000000000000010
static let Player : UInt32 = 3//00000000000000000000000000000100
}


class GameScene2: SKScene, SKPhysicsContactDelegate {
var HighScore = Int()
var Player = SKSpriteNode(imageNamed: "GoodGuy.png")
var Level2Label = UILabel()


override func didMoveToView(view: SKView) {
/* Setup your scene here */

var HighScoreDefault = NSUserDefaults.standardUserDefaults()
if (HighScoreDefault.valueForKey("HighScore") != nil){

HighScore = HighScoreDefault.valueForKey("HighScore") as! NSInteger
}
else{
HighScore = 0
}



physicsWorld.contactDelegate = self

self.scene?.backgroundColor = UIColor.blackColor()

self.scene?.size = CGSize(width:640, height: 1136)

self.addChild(SKEmitterNode(fileNamed: "MagicParticle")!)

Player.position = CGPointMake(self.size.width/2, self.size.height/8)
Player.physicsBody = SKPhysicsBody (rectangleOfSize: Player.size)
Player.physicsBody?.affectedByGravity = false
Player.physicsBody?.categoryBitMask = PhysicsCategory2.Player
Player.physicsBody?.contactTestBitMask = PhysicsCategory2.Enemy
Player.physicsBody?.dynamic = false

Level2Label = UILabel (frame: CGRect(x:0, y:0, width: view.frame.size.width/3, height: 30))
Level2Label.center = CGPoint(x: view.frame.size.width/1.675 , y: view.frame.size.height/1.05)
Level2Label.textColor = UIColor.whiteColor()
Level2Label.text = "Level 2"
self.view?.addSubview(Level2Label)


var Timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("SpawnBullets"), userInfo: nil, repeats: true)

var Enemytimer = NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: Selector("SpawnEnemies"), userInfo: nil, repeats: true)



self.addChild(Player)

Singleton.sharedInstance.ScoreLabel.text = "\(Singleton.sharedInstance.Score)"
Singleton.sharedInstance.ScoreLabel = UILabel(frame: CGRect(x:0, y:0, width:100, height:20))
Singleton.sharedInstance.ScoreLabel.backgroundColor = UIColor.clearColor()
Singleton.sharedInstance.ScoreLabel.textColor = UIColor.whiteColor()



}

func didBeginContact(contact: SKPhysicsContact) {
var firstBody : SKPhysicsBody = contact.bodyA
var secondBody : SKPhysicsBody = contact.bodyB
if ((firstBody.categoryBitMask == PhysicsCategory2.Enemy) && (secondBody.categoryBitMask == PhysicsCategory2.Bullet) ||
(firstBody.categoryBitMask == PhysicsCategory2.Bullet) && (secondBody.categoryBitMask == PhysicsCategory2.Enemy)){

CollisionWithBullet(firstBody.node as! SKSpriteNode, Bullet: secondBody.node as! SKSpriteNode)

}

else if ((firstBody.categoryBitMask == PhysicsCategory2.Enemy) && (secondBody.categoryBitMask == PhysicsCategory2.Player) ||
(firstBody.categoryBitMask == PhysicsCategory2.Player) && (secondBody.categoryBitMask == PhysicsCategory2.Enemy)){

CollisionWithPlayer(firstBody.node as! SKSpriteNode, Player: secondBody.node as! SKSpriteNode)
}


}


func CollisionWithBullet(Enemy: SKSpriteNode, Bullet: SKSpriteNode){
Enemy.removeFromParent()
Bullet.removeFromParent()
Singleton.sharedInstance.Score++


Singleton.sharedInstance.ScoreLabel.text = "\(Singleton.sharedInstance.Score)"
}




func CollisionWithPlayer(Enemy: SKSpriteNode, Player: SKSpriteNode){
var ScoreDefault = NSUserDefaults.standardUserDefaults()
ScoreDefault.setValue(Singleton.sharedInstance.Score, forKey: "Score")
ScoreDefault.synchronize()

if (Singleton.sharedInstance.Score > HighScore){

var HighScoreDefault = NSUserDefaults.standardUserDefaults()
HighScoreDefault.setValue(Singleton.sharedInstance.Score, forKey: "HighScore")

}


Enemy.removeFromParent()
Player.removeFromParent()
self.view?.presentScene(EndScene())
Level2Label.removeFromSuperview()
Singleton.sharedInstance.ScoreLabel.removeFromSuperview()

}

func SpawnBullets(){
var Bullet = SKSpriteNode(imageNamed: "Bullet.png")
Bullet.zPosition = -5
Bullet.position = CGPointMake(Player.position.x, Player.position.y)

let action = SKAction.moveToY(self.size.height + 30, duration: 1.0)
let actionDone = SKAction.removeFromParent()
Bullet.runAction(SKAction.sequence([action, actionDone]))


Bullet.physicsBody = SKPhysicsBody(rectangleOfSize: Bullet.size)
Bullet.physicsBody?.categoryBitMask = PhysicsCategory2.Bullet
Bullet.physicsBody?.contactTestBitMask = PhysicsCategory2.Enemy
Bullet.physicsBody?.affectedByGravity = false
Bullet.physicsBody?.dynamic = false
self.addChild(Bullet)
}

func SpawnEnemies(){
var Enemy = SKSpriteNode(imageNamed: "BadGuy.png")
var MinValue = self.size.width/8
var MaxValue = self.size.width - 150
let SpawnPoint = UInt32(MaxValue - MinValue)
Enemy.position = CGPoint(x: CGFloat(arc4random_uniform(SpawnPoint)), y: self.size.height)
Enemy.physicsBody = SKPhysicsBody(rectangleOfSize: Enemy.size)
Enemy.physicsBody?.categoryBitMask = PhysicsCategory2.Enemy
Enemy.physicsBody?.contactTestBitMask = PhysicsCategory2.Bullet
Enemy.physicsBody?.affectedByGravity = false
Enemy.physicsBody?.dynamic = true

let action = SKAction.moveToY(-70, duration: 3.0)
let actionDone = SKAction.removeFromParent()
Enemy.runAction(SKAction.sequence([action, actionDone]))

Enemy.runAction(SKAction.repeatActionForever(action))

self.addChild(Enemy)

}



override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */

for touch in touches {
let location = touch.locationInNode(self)

Player.position.x = location.x

}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)

Player.position.x = location.x

}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
}
}

这是游戏的Game Over页面:

import Foundation
import SpriteKit

class EndScene: SKScene {

var RestartButton : UIButton!
var HighScore : Int!
var HighScoreLabel : UILabel!
var GameOverLabel : UILabel!
override func didMoveToView(view: SKView) {

self.scene?.backgroundColor = UIColor.blackColor()

self.scene?.size = CGSize(width:640, height: 1136)

self.addChild(SKEmitterNode(fileNamed: "MagicParticle")!)

RestartButton = UIButton(frame: CGRect(x:0, y:0, width: view.frame.size.width/3
, height: 30))
RestartButton.titleLabel?.adjustsFontSizeToFitWidth = true
RestartButton.center = CGPoint(x: view.frame.size.width/2 , y: view.frame.size.height/1.5)
RestartButton.setTitle("Restart", forState: UIControlState.Normal)
RestartButton.showsTouchWhenHighlighted = true
RestartButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
RestartButton.addTarget(self, action: Selector("Restart"), forControlEvents: UIControlEvents.TouchUpInside)
self.view?.addSubview(RestartButton)

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

var HighScoreDefault = NSUserDefaults.standardUserDefaults()
HighScore = HighScoreDefault.valueForKey("HighScore") as! NSInteger

Singleton.sharedInstance.ScoreLabel = UILabel (frame: CGRect(x:0, y:0, width: view.frame.size.width/3, height: 30))
Singleton.sharedInstance.ScoreLabel.center = CGPoint(x: view.frame.size.width/1.6 , y: view.frame.size.height/2.5)
Singleton.sharedInstance.ScoreLabel.text = "\(Singleton.sharedInstance.Score)"
Singleton.sharedInstance.ScoreLabel.textColor = UIColor.whiteColor()
self.view?.addSubview(Singleton.sharedInstance.ScoreLabel)

HighScoreLabel = UILabel (frame: CGRect(x:0, y:0, width: view.frame.size.width/3, height: 30))
HighScoreLabel.center = CGPoint(x: view.frame.size.width/1.6 , y: view.frame.size.height/2)
HighScoreLabel.textColor = UIColor.whiteColor()
HighScoreLabel.text = "\(HighScore)"
self.view?.addSubview(HighScoreLabel)

GameOverLabel = UILabel (frame: CGRect(x:0, y:0, width: view.frame.size.width/3.8, height: 30))
GameOverLabel.center = CGPoint(x: view.frame.size.width/2 , y: view.frame.size.height/10)
GameOverLabel.textColor = UIColor.whiteColor()
GameOverLabel.text = "Game Over"
self.view?.addSubview(GameOverLabel)

}

func Restart(){
self.view?.presentScene(GameScene(), transition: SKTransition.crossFadeWithDuration(0.3))
RestartButton.removeFromSuperview()
HighScoreLabel.removeFromSuperview()
Singleton.sharedInstance.ScoreLabel.removeFromSuperview()
GameOverLabel.removeFromSuperview()

}
}

我想一个新问题是,除了更改变量名称之外,我是否还需要做其他事情才能使单例方法在场景之间工作

最佳答案

你在哪里调用 DisplayGameScore() ? (你没有)

除此之外,这不太好

static let ScoreLabel = Singleton()
static let Score = Singleton()

您创建了两个 Singleton 实例,这是错误的

然后你有同名 ScoreLabel 的实例变量,这也不太好

关于ios - 如何使用 Singleton 在快速 Sprite Kit 游戏中显示分数标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com