私の目標:プレイヤーが戻って、それは同じものをカウントしていない場合はレベルユニットは、一度、したがって、プレイヤーの背後にある場合にのみカウントスコアリングシステムを達成するために二回採点システムカウント複数回
私は現在、自分のゲームで前進するためにプレーヤーをタップするたびに、スコアラベルに1を加えたスコアリングシステムを持っています。これはプレーヤーが後方に行くことができ、前方にタップするとそのスコアがあります。プレーヤーは後方に進み、次に前方に向かった。
プレーヤの背後にあるプラットフォーム(LevelUnits)の数をカウントするというアイデアを思いついたので、前に戻ると同じプラットフォーム(LevelUnit)を2回カウントしないようにしました。これは私が思い付いたものです
:
override func update(_ currentTime: TimeInterval) {
let scoreLabel = childNode(withName: "scoreLabel") as! Score // links the scorelabel with Score class
worldNode.enumerateChildNodes(withName: "levelUnit") {
node, stop in
let nodeLocation:CGPoint = self.convert(node.position, from: self.worldNode) //converts cordinates of level units with the world node.
let player1Location:CGPoint = self.convert(self.thePlayer.position, from: self.worldNode)
if (nodeLocation.y < (player1Location.y) - self.levelUnitHeight) { // checks to see if the node is behind the player's position
self.countLevelUnits += 1
}
if (self.countLevelUnits > scoreLabel.number) {
while self.countLevelUnits > scoreLabel.number {
scoreLabel.addOneToScore()
}
} else if (self.countLevelUnits < scoreLabel.number) {
// Do Nothing
}
}
}
唯一の問題は、彼らが選手の後ろに常にしているため、コードがそれを複数回カウントし、私はゲームをオフにしない限り、そうし続けていることです。プレイヤーの背後にあるプレイヤーの背後にあるLevelUnitsを一度カウントする方法はありますか?
EDIT 1:LEVELのユニットクラス
class LevelUnit:SKNode {
//General Level Unit and Object Variables
var imageName:String = ""
var levelUnitSprite:SKSpriteNode = SKSpriteNode()
var levelUnitWidth:CGFloat = 0
var levelUnitHeight:CGFloat = 0
var theType:LevelType = LevelType.normal
let thePlayer:Player = Player(imageNamed: "Frog")
var levelUnitPicker = 0
var levelUnitsSpawned = 0
var levelUnitScored:Bool = false
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init() {
super.init()
}
func setUpLevel(){
imageName = “Wall”
let theSize:CGSize = CGSize(width: levelUnitWidth, height: levelUnitHeight) //defines the size background sprite as defined by the height and width of level unit
let tex:SKTexture = SKTexture(imageNamed: imageName) //defines the testue that the backgroundsprite will have.
levelUnitSprite = SKSpriteNode(texture: tex, color: SKColor.black, size: theSize)
scoredLevelUnit = false
self.addChild(levelUnitSprite) //adds the level unit to the scene
self.name = "levelUnit" //names the whole backgroundsprite under the name level Unit
self.position = CGPoint(x: levelUnitSprite.size.width/2, y: 0)
//The Level Types Physics Body
if (theType == LevelType.blank) {
levelUnitSprite.physicsBody = SKPhysicsBody(rectangleOf: levelUnitSprite.size)
levelUnitSprite.physicsBody!.categoryBitMask = BodyType.normal.rawValue
levelUnitSprite.physicsBody!.contactTestBitMask = BodyType.normal.rawValue
levelUnitSprite.physicsBody!.isDynamic = false
} else if (theType == LevelType.normal) {
levelUnitSprite.physicsBody = SKPhysicsBody(rectangleOf: levelUnitSprite.size)
levelUnitSprite.physicsBody!.categoryBitMask = BodyType.normal.rawValue
levelUnitSprite.physicsBody!.contactTestBitMask = BodyType.normal.rawValue
levelUnitSprite.physicsBody!.isDynamic = false
} else if (theType == LevelType.floating) {
levelUnitSprite.physicsBody = SKPhysicsBody(rectangleOf: levelUnitSprite.size)
levelUnitSprite.physicsBody!.categoryBitMask = BodyType.floating.rawValue
levelUnitSprite.physicsBody!.contactTestBitMask = BodyType.floating.rawValue
levelUnitSprite.physicsBody!.isDynamic = false
}
}
それを得点
scored == true
かどうかを確認することができず、設定しました「得点する」。このオブジェクトを "得点する"ときには 'scored = true'をセットし、次回は' scored == true'をチェックして再びスコアリングしないでください。 – Paulw11@ Paulw11私はプロパティを追加しました。スコアリングコードで同じ名前を使用する方法個々のレベルユニットごとにスコアリングされたプロパティにアクセスするにはどうすればよいですか? levelUnitクラスに "self.levelUnitScored = false"のようなものを追加して、得点コードにlevelUnitクラスのインスタンスを作成する必要がありますか?私は元の投稿を自分のレベルのUnitクラスで更新しました。 – Astrum