我搜索了很多,但找不到任何有用的东西。 我正在使用Swift 3在SpriteKit中创建一个游戏。
SpriteNodes在屏幕的右侧产生,并使用SKActions进入屏幕的左侧,重复此过程。
我需要一种方法,当SpriteNode通过我的播放器时(在场景中间),分数会上升一个。
以下区块将我的敌人角色从右向左移动。
func createEnemyBird() {
// Create Enemy Bird 1
enemyBird1 = EnemyBird(imageNamed: "enemy 1")
enemyBird1.position.x = self.frame.width + 100
enemyBird1.position.y = CGFloat.randomBetweenNumbers(firstNum: -(self.frame.size.height / 2.8), secondNum: (self.frame.size.height / 2.4))
enemyBird1.name = "EnemyBird1"
enemyBird1.initialise()
print(enemyBird1.position.y)
// Add Physics Bodys
enemyBird1.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height/10)
enemyBird1.physicsBody?.allowsRotation = false
enemyBird1.physicsBody?.affectedByGravity = false
enemyBird1.physicsBody?.isDynamic = false
// Add Collision Bitmasks
enemyBird1.physicsBody?.categoryBitMask = ColliderType.Pipes
// Animate Enemy Bird
var enemyBirdAnim = [SKTexture]()
for i in 1..<5 {
let enemyName = "enemy \(i)"
enemyBirdAnim.append(SKTexture(imageNamed: enemyName))
}
let animateEnemyBird = SKAction.animate(with: enemyBirdAnim, timePerFrame: 0.08, resize: false, restore: true)
enemyBird1.run(SKAction.repeatForever(animateEnemyBird))
// Make enemy Bird Move Left
let destination = self.frame.width * 2;
let move = SKAction.moveTo(x: -destination, duration: TimeInterval(6));
let remove = SKAction.removeFromParent();
// Run Enemy Bird Mobe
enemyBird1.run(SKAction.sequence([move, remove]), withKey: "Move")
// Add Children to scene
self.addChild(enemyBird1)
}
我也有一个功能但我不知道何时调用它
// Score increase
func incrementScore() {
if enemyBird1.position.x == -(self.frame.size.width/2) {
score += 1
scoreLabel.text = String(score)
}
}
我试图在序列中添加一个SKAction Run Block来调用它,但是在它实际开始计数之前通过大约6个敌人角色并不能很好地工作(这很奇怪)...
答案 0 :(得分:1)
一种解决方案是在incrementScore
上的update
方法中添加SKScene
函数:
override func update(_ currentTime: TimeInterval) {
if !enemyBird1.isScored {
if enemyBird1.position.x > -self.frame.size.width / 2 {
score += 1
scoreLabel.text = String(score)
enemyBird1.isScored = true
}
}
}
update
方法将触发每一帧,并检查鸟是否已经通过屏幕中心。如果有,它将被标记为已经得分,因此不会再次计算。
这将要求您向isScored
课程添加EnemyBird
属性。
假设您的EnemyBird
是SKSpriteNode
,它将如下所示:
class EnemyBird: SKSpriteNode {
var isScored = false
// other properties, inits, functions, etc
}
答案 1 :(得分:1)
您可以考虑在EnemyBird中覆盖position
,以便在鸟的位置发生变化时调用函数。例如,在EnemyBird类中,您可以添加如下内容:
override var position: CGPoint {
didSet {
if self.position.x == theParentSceneLeftEdge {
// call a function to update score
}
}
}
EnemyBird还需要知道theParentSceneLeftEdge
的值,当你初始化EnemyBird时,你可以指定它等于场景左边缘的值。
希望这有帮助!
答案 2 :(得分:1)
你可以用SKActions完成整个事情。只需将移动分为两部分:首先移动到划线,然后移动剩下的部分。在两者之间,更新分数。此代码替换ws.Cells["A4"].Style.Indent = 5;
中的“让敌人向左移动”和“运行敌人鸟类”部分:
createEnemyBird()
您也可以从// first action moves to the score line
let scoreLineDestination = -self.frame.width / 2
let moveToScoreLine = SKAction.moveTo(x: scoreLineDestination, duration: TimeInterval(3));
// second action calls your incrementScore() method
let increment = SKAction.run(self.incrementScore)
// third action moves the rest of the way
let finalDestination = -self.frame.width * 2;
let moveToFinal = SKAction.moveTo(x: finalDestination, duration: TimeInterval(3));
// finally remove
let remove = SKAction.removeFromParent();
enemyBird1.run(SKAction.sequence([moveToScoreLine, increment, moveToFinal, remove]), withKey: "Move")
删除位置检查,因为您知道在鸟儿越过分数线之前不会被调用:
incrementScore()
这样你就不用担心哪只鸟叫它了。