Sprite Kit - 在错误的位置绘制的SKSpriteNode

时间:2014-07-11 09:47:12

标签: ios swift sprite-kit

每当我尝试绘制SKSpriteNode时,它都会被绘制得低于应有的值。 但似乎其他SKSpriteNode工作正常没有问题。

这是我目前的代码:

func initMainGround() {
    let gSize = CGSizeMake(self.size.width/4*3, 120);
    ground = SKSpriteNode(color: SKColor.brownColor(), size: gSize);
    ground.name = gName;

    ground.position = CGPointMake(0, 0);

    ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.size);
    ground.physicsBody.restitution = 0.0;
    ground.physicsBody.friction = 0.0;
    ground.physicsBody.angularDamping = 0.0;
    ground.physicsBody.linearDamping = 0.0;
    ground.physicsBody.allowsRotation = false;
    ground.physicsBody.usesPreciseCollisionDetection = true; //accurate collision
    ground.physicsBody.affectedByGravity = false;
    ground.physicsBody.dynamic = false;
    ground.physicsBody.categoryBitMask = gBitmask;
    ground.physicsBody.collisionBitMask = pBitmask;

    self.addChild(ground);
}

func addBomb() {
    let bomb = SKSpriteNode(imageNamed: "trap");
    bomb.size = CGSizeMake(30, 30);
    bomb.position = CGPointMake(ground.position.x, actualY+10);

    bomb.physicsBody = SKPhysicsBody(circleOfRadius: bomb.size.width/2);
    bomb.physicsBody.restitution = 0.0;
    bomb.physicsBody.allowsRotation = false;
    bomb.physicsBody.usesPreciseCollisionDetection = true;
    bomb.physicsBody.affectedByGravity = false;
    bomb.physicsBody.dynamic = false;
    bomb.physicsBody.categoryBitMask = bBitmask;
    bomb.physicsBody.collisionBitMask = pBitmask;
    bomb.physicsBody.contactTestBitMask = pBitmask;

    self.addChild(bomb);
 }

虽然炸弹被认为几乎是直接在地面上方,但看起来炸弹已经高出地面100多了。 由于游戏是横向的,所以地面被假设填满了屏幕高度的近三分之一,但它比正常低。

为什么地面被拉到错误的位置,但炸弹被拉到正确的位置?

2 个答案:

答案 0 :(得分:3)

这听起来像我开始使用SpriteKit时遇到的问题一样。如果您的游戏使用.sks文件来显示它的主场景(默认情况下),则此场景使用.sks文件中定义的任意维值。

尝试动态设置场景的尺寸以查看是否是这种情况。 在didMoveToView函数中,在函数顶部添加类似的内容:

self.size = view.bounds.size

这样,.sks文件中的维度值将被实际的屏幕尺寸覆盖。

希望这有帮助!

答案 1 :(得分:2)

在地面图像上设置anchorPoint。

ground.anchorPoint = CGPointZero // same as CGPointMake(0, 0)
ground.position = CGPointZero

默认的anchorPoint是(0.5,0.5),即图像的中心。因此,如果没有设置,地面图像的中心将绘制在屏幕的左下角(0,0)。

由于同样的原因,你的炸弹会在你想象的地方绘制,中心位于你指定的位置。