Я пытаюсь построить простую игровую площадку, чтобы продемонстрировать концепцию GridWorld ML. Он состоит из простой сцены из 12 квадратов спрайтов, сложенных в виде таблицы. Он отлично работает в симуляторе Xcode, но в приложении Playgrounds на моем iPad сцена начинается в основном за пределами экрана, а затем постепенно изменяет размеры и перемещает положение, пока код работает, пока он, наконец, не окажется в нужном месте.
Я попытался изменить размер рамки просмотра, создав меньший вид для сцены. Эти изменения не устранили проблему, но изменили масштаб сцены в кадре до тех пор, пока она наконец не достигла правильного размера.
Первоначально создание сцены было выполнено путем переопределения sceneDidLoad. Я изменил его, чтобы переопределить init, но результаты были такими же.
import SpriteKit
import PlaygroundSupport
<snip>
class Map {
<snip code generating map values>
}
class MapGraphic:SKScene {
let blockSize = 75
var rectangleGroup:[SKShapeNode] = [SKShapeNode]()
var updateReady:Bool = false
var map:Map = Map()
// var map:Map
// Initialize objects during first start
override func sceneDidLoad() {
super.sceneDidLoad()
// self.physicsWorld.contactDelegate = self
var rectangle:SKShapeNode = SKShapeNode(rect: CGRect(x: 0, y:0, width: blockSize, height: blockSize))
var rect:CGRect = CGRect(x: 0, y:0, width: blockSize, height: blockSize)
for row in 0..<mHeight {
for col in 0..<mWidth {
rect = CGRect(x: col*blockSize, y: (mHeight - row - 1)*blockSize, width: blockSize, height: blockSize)
rectangle = SKShapeNode(rect: rect)
let val = map.val(row: row, col: col)
<snip (code setting rectangle color>
rectangleGroup.append(rectangle)
addChild(rectangle)
}
}
}
var dt = TimeInterval(0)
var lpCount = 0
override func update(_ currentTime: TimeInterval) {
super.update(currentTime)
if (lpCount < MAX_ITER) {
map.bellman()
map.update()
lpCount += 1
}
// here we print out the final results
else if lpCount == MAX_ITER {
map.mprint()
lpCount += 1
}
for i in 0..<rectangleGroup.count {
<snip (code setting rectangle color>
}
rectangleGroup[i].fillColor = sqColor
}
dt = currentTime
sleep(2)
}
func updateGMap() {
updateReady = true
}
func setMap(map: Map) {
}
}
let frame = CGRect(x: 0, y: 0, width: 300, height: 225)
var view = SKView(frame: frame)
var gMap = MapGraphic(size: view.frame.size)
view.presentScene(gMap)
PlaygroundPage.current.liveView = view
Я ожидал, что группа блоков появится в определенном размере, как определено, когда они были созданы и в рамке вида. Похоже, что есть некоторое несоответствие между рамкой обзора и рамкой сцены, поскольку они в основном начинаются от нижней части рамки просмотра и отражаются от разной степени масштабирования, прежде чем окончательно установить их правильно. Прямоугольники остаются ориентированными друг на друга правильно, но не на раму обзора.