Я работаю над игрой, в которой есть рыбные узлы, которые спускаются с верхней части экрана. Эти рыбы инициализируются с помощью пользовательского класса и перемещаются с помощью SKAction.moveTo (), см. Код ниже.
Проблема, с которой я сталкиваюсь, заключается в том, что моя позиция рыбы случайным образом увеличивается в значении Y для одного кадра, а затем возвращается в свое предполагаемое положение. Это может быть трудно увидеть на фотографиях, но это легко видно во время игры. Несмотря на то, что мой moveAction перемещает рыбу вниз по экрану, на втором изображении рыба находится выше, чем на первом изображении.
СМ. КАДР 1
СМ. КАДР 2
Я вызываю функцию setupFish () в методе обновления, где я запускаю таймер, который сокращается по мере того, как вы собираете узлы рыбы и увеличиваете счет.
Я не уверен, что этот код имеет какое-либо отношение к проблеме, с которой я столкнулся, но он дает вам лучшее представление о том, как я помещаю рыбу в игру.
override func update(_ currentTime: TimeInterval) {
if nextEnemyAddTime <= currentTime {
priorEnemyAddTime = currentTime
if gamePlaying == true {
setupFish()
}
}
}
private var priorEnemyAddTime: CFTimeInterval = 0
private var nextEnemyAddTime: CFTimeInterval {
let waitTime = score < 50 ? Double.random(in: 1.3...2.3)
: score < 100 ? Double.random(in: 1.2...2.1)
: score < 250 ? Double.random(in: 1.1...1.9)
: score < 500 ? Double.random(in: 1.0...1.7)
: score < 1000 ? Double.random(in: 0.9...1.5)
: score < 2500 ? Double.random(in: 0.8...1.3)
: score < 5000 ? Double.random(in: 0.7...1.1)
: score < 10000 ? Double.random(in: 0.6...0.9)
: score < 50000 ? Double.random(in: 0.4...0.7)
: 0.3
return priorEnemyAddTime + waitTime
}
Вот мой пользовательский класс Рыбы
import SpriteKit
enum FishType: String {
case redFish, purpleFish, orangeFish
}
class Fish: SKSpriteNode {
let type: FishType
init(type: FishType) {
self.type = type
let texture = SKTexture(imageNamed: "fish")
super.init(texture: texture, color: UIColor.clear, size: texture.size())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Вот функция, которую я использую для добавления узлов рыбы.
func getNewFish(type: FishType) -> Fish {
let fish = Fish(type: type)
fish.physicsBody?.categoryBitMask = PhysicsCategory.fish
fish.physicsBody?.contactTestBitMask = PhysicsCategory.hero
fish.physicsBody?.collisionBitMask = PhysicsCategory.none
return fish
}
func setupFish() {
let fish = self.getNewFish(type: self.getFishType())
let randomPosition = CGPoint(x: CGFloat.random(in: frame.maxX*0.25...frame.maxX*0.75), y: frame.maxY + fish.size.height/2)
fish.zPosition = 1
fish.name = "fish"
fish.size = CGSize(width: ((fish.texture?.size().width)!)/14, height: (fish.texture?.size().height)!/14)
fish.position = randomPosition
fish.texture = SKTexture(imageNamed: "fish")
fish.zPosition = 1
addChild(fish)
let randomDouble = Double.random(in: 0.5...1.2)
let moveAction = SKAction.move(to: CGPoint(x: randomPosition.x, y: frame.minY), duration: gameSpeed*randomDouble)
fish.run(moveAction) {
fish.removeFromParent()
fish.removeAllActions()
self.streak = 0
}
}
Заранее спасибо!