【发布时间】:2014-06-13 06:15:52
【问题描述】:
情况
我正在使用 Lynda.com video series (iOS Game Dev. With Sprite Kit),该教程是 Objective-C 的最后一代,作为培训练习,我将其转换为 Swift 并使用新功能。目标是一个老式的破砖游戏。
我有一个更新的full project repository on GitHub here
问题
在GameScene.swift文件中,我写了一个方法addBricks(size: CGSize):
func addBricks (size: CGSize){
println(" the input parameter size: \(size)")
var maxRows = 1
var maxCols = 1
var xPos : CGFloat
var yPos : CGFloat
for (var rows = 0; rows < maxRows; rows++){
for (var i = 0; i < maxCols ; i++){
var brick: SKSpriteNode = SKSpriteNode(imageNamed: "brick")
brick.physicsBody = SKPhysicsBody(rectangleOfSize: brick.frame.size)
xPos = CGFloat(size.width) / CGFloat(maxCols+1) * CGFloat(i + 1)
yPos = CGFloat(size.height) - CGFloat(80 * rows) - 100.0
brick.physicsBody.dynamic = false
brick.physicsBody.categoryBitMask = brickCategory
brick.shadowCastBitMask = 1
brick.lightingBitMask = 1
//brick.position = CGPointMake(CGFloat(xPos), CGFloat(yPos))
brick.position = CGPointMake(320.0, 1036.0)
println("Brick position - xpos: \(xPos), ypos: \(yPos) || overall:\(brick.position)")
self.addChild(brick)
}
}
}
我首先在didMoveToView() 的场景中调用它,一切都很好,我的砖节点放置在适当的位置。在我的游戏逻辑中,我稍后从didBeginContact() 调用此方法,当球在逻辑检查后看到没有剩余的砖块后撞击桨时。在“当你用完砖时,添加更多”的感觉......
func didBeginContact(contact: SKPhysicsContact!){
var notTheBall : SKPhysicsBody
// check the contacts and find the one thats not the ball
if ( contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask ){
notTheBall = contact.bodyB
} else {
notTheBall = contact.bodyA
}
/* more logic here for other contacts */
if ( notTheBall.categoryBitMask == paddleCategory ){
self.runAction(playSFXBlip)
//println("\(self.children.count) and \(staticSize)")
if ( self.children.count <= 5 ){
addBricks(self.frame.size)
}
}
}
在对addBricks() 的任何后续方法调用中,所有砖块都放置在视图左下角的点 0,0 处,即使在控制台显示它们被放置在不同位置时也是如此:
self 对象是SKScene println(self) 的当前实例 -> <SKScene> name:'(null)' frame:{{0, 0}, {640, 1136}}
我试过了:
- 将我的位置计算的所有元素转换为
Floats 和CGFloats - 通过设置静态浮点值来调试 addBricks 方法
- 在联系方法之外为框架大小创建一个属性,并将该大小传递给 addBricks。
- google 和咨询 the Swift Programming Language Guide 以及任何相关的文档
是什么导致了不适当的定位?提前感谢TL;DR
【问题讨论】:
-
以防万一,我正在为 iPhone5s iOS8 构建。但为 iPhone5 构建时,其他所有功能在功能上都相似
-
您的联络代表是谁? SKScene 还是其他类?
-
@Grimxn,如果我正确理解这一点,我应该使用 SKScene 类
class GameScene: SKScene, SKPhysicsContactDelegate -
好吧,SKScene 类是显而易见的代表,但并非必须如此。我问是因为在您的“addBricks(self.frame.size)”行中,“self”是最重要的。 addBricks 的代码是什么?
-
再次感谢您的回复,添加砖块功能的代码已在上面发布,并且有一个指向github上完整公共存储库的链接
标签: ios iphone objective-c swift