我正在尝试构建一个简单的游乐场来演示GridWorld ML概念。它由一个12个精灵正方形的简单场景组成,它们作为一个表格堆叠在一起。它在Xcode模拟器中可以正常工作,但在我iPad上的Playgrounds应用中,场景大多从屏幕开始,然后在代码运行时逐渐调整大小和重新定位,直到最终将其放置在正确的位置。
我尝试更改视图框架的大小,为场景创建一个较小的视图。这些更改不能解决问题,但可以更改场景在帧中的缩放比例,直到最终弹出正确大小为止。
最初,场景创建是通过覆盖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
我希望这组框会以创建时定义的尺寸出现在视图框架内。视框与场景框之间似乎存在一些不匹配,因为它们主要从视框的底部开始并在不同比例的缩放之间反弹,直到最终正确设置为止。矩形彼此保持正确的方向,只是不与视框对齐。