【问题标题】:Swift Spritekit Change Frame ShapeSwift Spritekit 更改框架形状
【发布时间】:2016-06-28 16:59:35
【问题描述】:

我正在使用 Spritekit 在 Swift 中制作 IOS 游戏,玩家有一个三角形网格,我使用以下代码创建:

    let viewpath = CGPathCreateMutable();

    CGPathMoveToPoint(viewpath, nil, 200, 0);

    CGPathAddLineToPoint(viewpath, nil, 0, 400);

    CGPathAddLineToPoint(viewpath, nil, 400, 400);

    CGPathAddLineToPoint(viewpath, nil, 200, 0);

    let playerviewshape = SKShapeNode(path: viewpath);

    playerviewshape.fillColor = SKColor(red: 1, green: 1, blue: 1, alpha: 0.1)

    playerviewshape.strokeColor = SKColor(red: 1, green: 1, blue: 1, alpha: 0.2)

    playerview = SKSpriteNode(texture: view.textureFromNode(playerviewshape));

    playerview.zPosition = 0;

    playerview.position = CGPoint(x: 0, y: 200);

    player.addChild(playerview);

我想知道三角形内是否有任何敌人,所以在更新循环中我使用if(enemy.intersectsNode(playerview)) { 但是这只检查它是否在节点的框架内,这是三角形周围的一个矩形。我尝试将三角形用作 SKShapeNode,也尝试使用 containsPoint 而不是 intersectsNode。

如何更改框架/检测交叉点的方式,以便仅检测位于三角形内的精灵?

【问题讨论】:

  • 如果你想要那种检测,你必须使用 SKPhysicsBody
  • 附带说明,SKShape 仍然有很多问题,所以我建议创建您的 SKShape,然后使用您的视图中名为 textureFromNode 的函数制作纹理(或者您可以生成一个新的SKView,没关系),然后将该纹理输入 SKSpriteNode。然后使用您的 SKPhysicsBody,您应该能够根据所需的形状处理碰撞
  • @Knight0fDragon 如果我将物理实体添加到节点,我该如何阻止它们相互影响,.E.G.互相推搡?
  • 你将碰撞位掩码设置为 0
  • 其实刚刚意识到我应该使用collisionBitMask。

标签: swift sprite-kit


【解决方案1】:

我编写了一些对开始设置物理有用的代码:

(P.S.我不知道播放器是哪种类型,所以我用playerview来做个例子..)

enum CollisionTypes: UInt32 {
    case Playerview = 1 // my hero
    case WarField = 2 // the warfield 
    case Enemy1 = 4 // simple enemies type
    case Enemy2 = 8  // 2 level enemies type
    case Enemy3 = 16 // boss enemies type
    case Enemy4 = 32 // boss of the boss enemies type
}


playerview.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
playerview.physicsBody!.categoryBitMask = CollisionTypes.Playerview.rawValue
playerview.physicsBody!.contactTestBitMask = CollisionTypes.Enemy1.rawValue | CollisionTypes.Enemy2.rawValue | CollisionTypes.Enemy3.rawValue | CollisionTypes.Enemy4.rawValue
playerview.physicsBody!.collisionBitMask = 0

func didBeginContact(contact: SKPhysicsContact) {
     if (contact.bodyA.categoryBitMask == CollisionTypes.Playerview.rawValue &&
            contact.bodyB.categoryBitMask == CollisionTypes.Enemy1.rawValue) {
         print("The collision was between the playerview and a enemy1")
     }
     ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多