如何使物体在swift中从边缘反弹

时间:2016-06-21 09:37:26

标签: ios swift

我试图让我的'敌人'在所有界限上反弹。例如,当敌人与屏幕的左,右,顶部和底部发生碰撞时,它应该改变方向。

这是我目前的代码:

import SpriteKit
import GameplayKit

struct Physics {
    static let Enemy: UInt32 = 0x1 << 1
    let BorderCategory : UInt32 = 0x1 << 2
    let BottomCategory : UInt32 = 0x1 << 3
    let BallCategory   : UInt32 = 0x1 << 4

}

class GameScene: SKScene {

    var Enemy = SKSpriteNode()
    var gameStarted = Bool()
    var gameState = "running"
    var destX : CGFloat = 0.0
    var destY : CGFloat = 0.0
    var score = 0

    override func didMove(to view: SKView) {
        let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        borderBody.friction = 0
        self.physicsBody = borderBody
        let screenSize: CGRect = UIScreen.main().bounds     // get the screen size
        let screenWidth = screenSize.width                  //get the width
        let screenHeight = screenSize.height                //get the height


        Enemy = SKSpriteNode(imageNamed: "red2")
        Enemy.size = CGSize(width: 60, height: 70)
        Enemy.position = (CGPoint(x: self.frame.width / 6 - Enemy.frame.width, y: self.frame.height / 10))

        Enemy.physicsBody = SKPhysicsBody(circleOfRadius: Enemy.frame.height / 2)
        Enemy.physicsBody?.categoryBitMask = Physics.Enemy
        //Enemy.physicsBody?.categoryBitMask = Physics.Ground | Physics.wall
        //Enemy.physicsBody?.contactTestBitMask = Physics.Ground | Physics.wall
        Enemy.physicsBody?.affectedByGravity = false
        Enemy.physicsBody?.isDynamic = true


        self.addChild(Enemy)
        Enemy.physicsBody?.velocity = CGVector(dx: 50, dy: 50)

        if (Enemy.position.x == screenWidth) {
            Enemy.physicsBody?.velocity = CGVector(dx: -50, dy: 0)      // change direction at edge DOESN'T WORK
        }

        if(Enemy.position.y == screenHeight){
            Enemy.physicsBody?.velocity = CGVector(dx: 0, dy: -50)      //change direction at edge  DOESN'T WORK
        }
    }

2 个答案:

答案 0 :(得分:1)

好的,根据你的代码,我写了一个工作的弹跳精灵。它使用物理引擎来实现这一点,而不是手动改变方向(我猜你应该怎么做)。

override func didMove(to view: SKView) {
    let borderBody = SKPhysicsBody(edgeLoopFrom: frame)
    borderBody.friction = 0
    borderBody.categoryBitMask = Physics.wall
    physicsBody = borderBody
    let enemy = enemySprite(size: CGSize(width: 60, height: 70), position: CGPoint(x: frame.size.width/2, y: frame.size.height/2))
    addChild(enemy)
    let force = SKAction.applyForce(CGVector(dx: 300, dy: 300) , duration: 0.1)
    enemy.run(force)
}

func enemySprite(size: CGSize, position: CGPoint) -> SKSpriteNode {
    let enemy = SKSpriteNode(color: SKColor.red(), size: CGSize(width: 60, height: 80))
    enemy.position = CGPoint(x: frame.width/2, y: frame.height/2)
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.frame.height / 2) // A bit silly with circle, but you seem to have an image for this use
    enemy.physicsBody?.categoryBitMask = Physics.enemy
    enemy.physicsBody?.restitution = 1
    enemy.physicsBody?.friction = 0
    enemy.physicsBody?.collisionBitMask = Physics.wall
    enemy.physicsBody?.affectedByGravity = false
    enemy.physicsBody?.angularDamping = 0
    enemy.physicsBody?.linearDamping = 0
    return enemy
}

您需要考虑的问题是如何设置场景?场景大小与视图大小相同吗?否则,场景的物理身体不会让球在你期望的地方反弹......

答案 1 :(得分:0)

由于您的条件,它不会(在大多数情况下) - 使用等于运算符而不是大于/小于运算符。

import SpriteKit

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {

        // Create enemy with physics body attached and add it to the scene
        let enemy = SKSpriteNode(color: SKColor.greenColor(), size: CGSize(width: 20, height: 20))
        enemy.name = "enemy"
        enemy.position = CGPoint(x: size.width / 2, y: size.height / 2)
        enemy.physicsBody = SKPhysicsBody(rectangleOfSize: enemy.size)
        enemy.physicsBody!.affectedByGravity = false
        enemy.physicsBody!.linearDamping = 0
        enemy.physicsBody!.mass = 0.1
        enemy.physicsBody!.velocity = CGVector(dx: 150, dy: 0)
        addChild(enemy)
    }

    override func didSimulatePhysics() {
        let enemy = childNodeWithName("enemy")!

        if (enemy.position.x > size.width && enemy.physicsBody!.velocity.dx > 0)
            || (enemy.position.x < 0 && enemy.physicsBody!.velocity.dx < 0) {
            enemy.physicsBody!.velocity.dx *= -1
        }
    }
}
相关问题