2017-04-25 99 views
2

我一直在四處尋找試圖找出如何讓我的玩家和敵人相撞。我有一個攻擊按鈕被設置,並且需要按鈕,當按鈕被按下時,玩家前面的敵人被從屏幕上移開。我將如何設置碰撞,以及如何在按下按鈕時僅進行碰撞?雪碧套件玩家和敵人碰撞

我曾嘗試使用此代碼進行碰撞,但我不認爲它有任何作用。

//physicsbody for player and enemies 
func didBegin(_ contact: SKPhysicsContact) { 
    var bodyA = SKPhysicsBody() 
    var bodyB = SKPhysicsBody() 

    if contact.bodyA.node?.name == "player" { 
     bodyA = contact.bodyA 
     bodyB = contact.bodyB 
    } else { 
     bodyA = contact.bodyB 
     bodyB = contact.bodyA 
    } 
    //Player hits the rocket and dies and also remove the rocket 
    if bodyA.node?.name == "player" && bodyB.node?.name == "enemy" { 
     bodyA.node?.removeFromParent() 
     bodyB.node?.removeFromParent() 


     //After player dies go to death scene 
     let gameOver = GameOverScene(size:CGSize(width: 2048, height: 1536), won: false) 
     self.view?.presentScene(gameOver) 

    } 

} 

那麼這是玩家:

func createPlayer(_ position: CGPoint) { //This is the method that creates the player on screen. You must pass this method the position you want the sprite spawned. Or maybe you can do it somewhere else in Swift, I dunno. 

    //graphic stuff 
    //let playerTexture = SKTexture(imageNamed: "Ttam1") //create variable with graphic assigned to it 
    let player = SKSpriteNode(texture: playerTexture) //give player the graphic 
    player.size = CGSize(width: 175, height: 200) //player sprite size 
    player.zPosition = 20 
    player.name = "player" 
    //physics stuff 
    player.physicsBody = SKPhysicsBody(texture: playerTexture, size: player.size) //Set up pixel-perfect collision mesh for the player 
    player.physicsBody?.isDynamic = true 
    player.physicsBody!.affectedByGravity = true //Stop the player from being affected by gravity 
    player.physicsBody?.allowsRotation = false 
    player.physicsBody?.categoryBitMask = ColliderType.PLAYER 


    //spawny stuff 
    insertChild(player, at: 0) //spawn player 
    player.position = position //move player to position passed into this method 
    playerNode = player //Create a node where the player is, filled by the player itself... Like a D.Va ult! The call mech one, not the self-destruct one. 
    /* 
    let frame2 = SKTexture(imageNamed: "Ttam2") 
    let frame3 = SKTexture(imageNamed: "Ttam3") 
    let frame4 = SKTexture(imageNamed: "Ttam4") 

    */ 
    let animation = SKAction.animate(with: [playerTexture, frame2, frame3, frame4], timePerFrame: 0.2) 
    let runForever = SKAction.repeatForever(animation) 

    player.run(runForever) 

} 

,這是敵人:

//Create enemy - slime 
func spawnEnemy() { 

    //Call the enemy variable and sprite 
    let enemyTexture = SKTexture(imageNamed: "Slime1") 
    let enemy = SKSpriteNode(texture: enemyTexture) 
    enemy.size = CGSize(width: 175, height: 175) 
    enemy.zPosition = 10 
    //Collision with the enemy 
    enemy.name = "enemy" 
    enemyNode = enemy 

    //Randomly place the enemy on screen and move 
    enemy.position = CGPoint(x: 2100, y: 325) 
    enemy.physicsBody? = SKPhysicsBody(texture: enemyTexture, size: enemy.size) 
    enemy.physicsBody?.affectedByGravity = true 
    enemy.physicsBody?.allowsRotation = false 
    enemy.physicsBody?.isDynamic = true 




    //Add enemy node to screen. 
    addChild(enemy) 

    let frame2 = SKTexture(imageNamed: "Slime2") 
    let frame3 = SKTexture(imageNamed: "Slime3") 
    let animation = SKAction.animate(with: [enemyTexture, frame2, frame3, frame2], timePerFrame: 0.2) 
    let runForever = SKAction.repeatForever(animation) 

    enemy.run(runForever) 



    //Set the enemy to move in a single direction: 
    let actionMove = SKAction.moveTo(x: -enemy.size.width/2, duration: 10.0) 

    //Remove enemy from screen when action is complete: 
    let actionRemove = SKAction.removeFromParent() 
    enemy.run(SKAction.sequence([actionMove, actionRemove])) 

} 
+0

讓我們嘗試縮小可能的問題。你能看到你期望在場景中看到的所有精靈嗎?玩家和敵人看起來是在視覺上碰撞嗎?如果你在你的'didBegin'函數中設置了一個斷點,你是否真的達到了那個斷點? –

+0

截至目前我已評論bodyA和bodyB的聯繫人。我有我的朋友在這裏和我一起工作,以及我試圖弄清楚這一點。我最初在敵人物理盒子裏遇到了問題(沒有出現,甚至沒有在遊戲場景中工作),但已經解決了。他們在測試時都會在現場碰撞,但是現在不會爲其激活任何代碼 –

+0

更新:我們讓玩家現在被粘液擊中並將他從場景中移除。現在我需要一種讓按鈕摧毀敵人的方式,當靠近球員 –

回答

0

要具有攻擊鍵消滅敵人,實現touchesBegan如果攻擊鍵是按下,設置一個標誌:

attacking = true

(定義attacking第一:var attacking = false你的財產定義)

touchesEnded,如果在attck按鈕觸摸結束設置attacking = false

然後,在你的didBegin中,只有在攻擊標誌沒有設置的情況下才會銷燬玩家。如果它被設置(即玩家和煤泥碰撞而攻擊鍵被按下),破壞公正的泥,加一些分數等

//Player hits the rocket and dies and also remove the rocket 
if bodyA.node?.name == "player" && bodyB.node?.name == "enemy" {  
    switch attacking { 
    case false: 
     bodyA.node?.removeFromParent() 
     bodyB.node?.removeFromParent() 

     //After player dies go to death scene 
     let gameOver = GameOverScene(size:CGSize(width: 2048, height: 1536), won: false) 
     self.view?.presentScene(gameOver) 
    case true: 
     let enemy = contact.bodyA.categoryBitMask == ColliderType.ENEMY ? contact.bodyA.node : contact.bodyB.node 
     enemy.removeFromParent() 
     score += 1 
    } 
} 

我假設在您的評論的「火箭」是那個粘液的敵人節點? :-)我沒有看到爲敵人設置的categoryBitMask - 有沒有一個?我以爲它在你的didBegin:ColliderType.ENEMY

的代碼塊是多餘的:

var bodyA = SKPhysicsBody() 
var bodyB = SKPhysicsBody() 
if contact.bodyA.node?.name == "player" { 
    bodyA = contact.bodyA 
    bodyB = contact.bodyB 
} else { 
    bodyA = contact.bodyB 
    bodyB = contact.bodyA 
} 

因爲你永遠不會出現使用bodyAbodyB變量設置。如果你在以後使用它們,那麼這可能會更有意義:

if contact.bodyA.node?.name == "player" { 
    player = contact.bodyA 
    enemy = contact.bodyB 
} else { 
    enemy = contact.bodyB 
    player = contact.bodyA 
} 

,然後這行代碼:

 let enemy = contact.bodyA.categoryBitMask == ColliderType.ENEMY ? contact.bodyA.node : contact.bodyB.node 

可以從case true:塊被刪除。