我一直在四處尋找試圖找出如何讓我的玩家和敵人相撞。我有一個攻擊按鈕被設置,並且需要按鈕,當按鈕被按下時,玩家前面的敵人被從屏幕上移開。我將如何設置碰撞,以及如何在按下按鈕時僅進行碰撞?雪碧套件玩家和敵人碰撞
我曾嘗試使用此代碼進行碰撞,但我不認爲它有任何作用。
//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]))
}
讓我們嘗試縮小可能的問題。你能看到你期望在場景中看到的所有精靈嗎?玩家和敵人看起來是在視覺上碰撞嗎?如果你在你的'didBegin'函數中設置了一個斷點,你是否真的達到了那個斷點? –
截至目前我已評論bodyA和bodyB的聯繫人。我有我的朋友在這裏和我一起工作,以及我試圖弄清楚這一點。我最初在敵人物理盒子裏遇到了問題(沒有出現,甚至沒有在遊戲場景中工作),但已經解決了。他們在測試時都會在現場碰撞,但是現在不會爲其激活任何代碼 –
更新:我們讓玩家現在被粘液擊中並將他從場景中移除。現在我需要一種讓按鈕摧毀敵人的方式,當靠近球員 –