Xcode Spritekit在触摸时破坏精灵并创建其他精灵



我正在创建一个游戏,玩家必须触摸敌人的精灵才能摧毁它们。播放器总是在屏幕中间。有很多不同的敌人类型,我正在测试应用程序的想法,首先有两种敌人类型。

这是创建敌人的代码。

func createEnemy(type:Enemies, forSpawner spawner: Int) -> SKSpriteNode?
{
switch type {
case .diamond:
enemySprite = SKSpriteNode(imageNamed: "Diamond")
enemySprite.setScale(0.5)
enemySprite.color = UIColor.green
enemySprite.colorBlendFactor = 1
enemySprite.name = "enemy"
let location = targetLocation
let action = SKAction.move(to: CGPoint(x: location.x, y: location.y), duration: 2.0)
enemySprite.run(action)
case .diamondSolid:
enemySprite = SKSpriteNode(imageNamed: "DiamondSolid")
enemySprite.setScale(0.5)
enemySprite.color = UIColor.purple
enemySprite.colorBlendFactor = 1
enemySprite.name = "enemySolid"
let location = targetLocation
let action = SKAction.move(to: CGPoint(x: location.x, y: location.y), duration: 1.0)
enemySprite.run(action)
}
guard let enemyPosition = spawnArray?[spawner].position else {return nil}
let dx = targetLocation.x - enemyPosition.x
let dy = targetLocation.y - enemyPosition.y
let angle = atan2(dy,dx)
enemySprite.position.x = enemyPosition.x
enemySprite.position.y = enemyPosition.y
enemySprite.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: enemySprite.size.width, height: enemySprite.size.height))
enemySprite.physicsBody?.categoryBitMask = enemyCategory
enemySprite.zRotation = angle - 90 * degreesToRadians

return enemySprite
}

和触摸功能

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let location = touch.previousLocation(in: self)
let node = self.nodes(at: location).first
if node?.name == "enemy"{
node?.removeFromParent()
}
}
}

我想我需要做的是从触摸事件中发送一个位置,并将其发送到一个新的功能,该功能可以用一些发射器粒子来摧毁敌人,让玩家知道形状已经死亡。根据类型的不同,它要么摧毁并添加到分数,要么摧毁、添加到分数并产生一些其他敌人,并在将他们移动到targetLocation之前将他们向后移动一定数量。能帮我做这件事吗?

好吧,我想我通过为敌人创建一个类来解决这个问题,但现在我遇到了一个问题,当每个敌人都被杀死时,我无法产生一个发射器作为爆炸效果。我删除了一些代码来平衡问题,但这是代码

import SpriteKit
enum EnemyType:Int {
case diamond
case triangle
case chevron
case elipse
case pentagon
case diamondSolid
case traingleSolid
case elipseSolid
case pentagonSolid
}
class Enemy: SKSpriteNode {
let type: EnemyType
var enemyTexture:SKTexture!
var touched = false
init (type:EnemyType){
self.type = type
switch type {
case .diamond:
enemyTexture = SKTexture(imageNamed: "diamond")
case .triangle:
enemyTexture = SKTexture(imageNamed: "triangle")
case .chevron:
enemyTexture = SKTexture(imageNamed: "chevron")
case .elipse:
enemyTexture = SKTexture(imageNamed: "elipse")
case .pentagon:
enemyTexture = SKTexture(imageNamed: "pentagon")
case .diamondSolid:
enemyTexture = SKTexture(imageNamed: "diamondSolid")
case .traingleSolid:
enemyTexture = SKTexture(imageNamed: "triangleSolid")
case .elipseSolid:
enemyTexture = SKTexture(imageNamed: "elipseSolid")
case .pentagonSolid:
enemyTexture = SKTexture(imageNamed: "pentagonSolid")
}
super.init(texture: enemyTexture,color:UIColor.clear, size: CGSize.zero)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createPhysicsBody()
{
physicsBody = SKPhysicsBody(rectangleOf: size)
physicsBody?.isDynamic = true
physicsBody?.categoryBitMask = PhysicsCategory.enemyCategory
physicsBody?.contactTestBitMask = PhysicsCategory.playerCategory
physicsBody?.collisionBitMask = PhysicsCategory.playerCategory
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let explosion = SKEmitterNode(fileNamed: "explosion.sks"){
explosion.position = self.position
self.addChild(explosion)
self.run(SKAction.wait(forDuration: 1)){
explosion.removeFromParent()
}
}
removeFromParent()
}
}

目前,所有这些代码应该做的就是移除被触摸的敌人,并播放粒子发射器。我做错什么了吗?

最新更新