0

是否有可能在接触时破坏物体?就像不只是用 body.removeFromParent() 从屏幕上删除它一样,我想要一个动画。

我有一个玩家和墙壁,当玩家有一个特殊的能量提升时,我希望它能够在接触时摧毁墙壁。我可以想象我像墙一样分裂了许多小的物理体,它们像锚点一样粘在一起,当我的玩家击中它时,他们会从玩家那里得到一个冲动(我猜只是将 isDynamic 设置为 true)然后输了锚点,这样所有的精灵节点都会飞起来,所以墙会被摧毁。

你能给我一些帮助/建议一个好的方法吗?

4

1 回答 1

1

您不需要以任何方式将组成墙的节点连接在一起 - 只需将它们放在屏幕上即可。如果玩家没有上电,请关闭墙节点的physicsBodies中的玩家位,collisionBitMask以免墙节点与玩家发生碰撞。然后当玩家撞到墙壁时,玩家会受到碰撞的影响(并反弹),但墙壁节点不会受到影响。

当玩家电时,使墙节点受到碰撞影响,同时打开玩家与墙的接触(只需打开玩家的墙类别的位就足够了contactTestBitMask)。然后墙节点将受到碰撞的影响(并移动或旋转),您didBegin() 将被调用,您可以在每个墙节点上运行一个动作,包括您想要的动画并以removeFromParent().

碰撞和接触测试位掩码指南: https ://stackoverflow.com/a/40596890/1430420

操作位掩码以关闭和打开碰撞和接触。 https://stackoverflow.com/a/46495864/1430420

编辑:SK演示显示一个物体撞到由块组成的墙壁:

创建一个新的 SK 项目并将其用作 GameScene,swift:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

    override func didMove(to view: SKView) {

        physicsWorld.gravity = CGVector(dx:0, dy:0)

        let ball = SKSpriteNode.init(color: .red, size: CGSize(width: 50, height: 50))
        ball.physicsBody = SKPhysicsBody.init(circleOfRadius: ball.size.width/2)
        ball.position = CGPoint(x: 0, y: 0)

        buildWall()

        addChild(ball)

        ball.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 50))
    }

    func buildWall() {
        let xStart : CGFloat = ((scene?.size.width)!/2) * -0.9
        var brickPosition = CGPoint(x: xStart, y: 500)
        let brickSize = CGSize(width: 20, height:20)

        for wallRow in 1...10 {
            for wallColumn in 1...30 {
                let brick = SKSpriteNode(color: .yellow, size: brickSize)
                brick.physicsBody = SKPhysicsBody.init(rectangleOf: brick.size)

                brick.position = brickPosition

                addChild(brick)
                brickPosition.x += brickSize.width + 1
            }
            brickPosition.x = xStart
            brickPosition.y -= 11
        }
    }
}
于 2018-12-10T14:06:58.110 回答