2017-03-03 1 views
0

제발 도와주세요! 나는 이것을 함께 찾아 내려고 노력해왔다. 나는 인터넷을 수색하고 나는 저를 도울 아무거나를 찾아 낼 수 없다.적을 독립 생활을 보내는 방법?

현재 우주선이 중간에 있고 적의 배들이 당신쪽으로 움직이고 있고 그들을 쏴야 만하는 게임을 만들고 있습니다. 어떤 적들은 다른 삶을 가지고 있습니다. 예를 들면 : 빨간색 우주선은 폭발하기 위해 한 발을, 파란색 우주선은 3 등을 취합니다. 나는 삶만을 다할 수있는 모든 것을 가지고 있습니다. 예를 들면 : 푸른 배가 스크린에 불려 갈 때마다 한 번 쏴서 생명력은 2로 떨어집니다. 그러나 다른 파란 배가 호출 될 때마다 첫 번째 파란 배는 다시 생명력이 3으로 다시 설정됩니다. 어쨌든 나는 배가 생명을 잃을 때마다 다른 배가 불려지더라도 그런 식으로 남을 수 있도록 만들 수 있습니까?

_ = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(Level1.VillainRight), userInfo: nil, repeats: true) 

나는 spritekit에서 사용하고 있습니다 : 이것은이 함수를 호출하는 코드가

func VillainRight(){ 
    let TooMuch = self.size.width 
    let point = UInt32(TooMuch) 
    life = 3 
    let VillainR = SKSpriteNode(imageNamed: "BlueVillain") 

    VillainR.zPosition = 2 
    VillainR.position = CGPoint(x: self.frame.minX,y: CGFloat(arc4random_uniform(point))) 

    //This code makes the villain's Zposition point towards the SpaceShip 
    let angle = atan2(SpaceShip.position.y - VillainR.position.y, SpaceShip.position.x - VillainR.position.x) 
    VillainR.zRotation = angle - CGFloat(M_PI_2) 


    let MoveToCenter = SKAction.move(to: CGPoint(x: self.frame.midX, y: self.frame.midY), duration: 15) 

    //Physics World 
    VillainR.physicsBody = SKPhysicsBody(rectangleOf: VillainR.size) 
    VillainR.physicsBody?.categoryBitMask = NumberingPhysics.RightV 
    VillainR.physicsBody?.contactTestBitMask = NumberingPhysics.Laser | NumberingPhysics.SpaceShip 
    VillainR.physicsBody?.affectedByGravity = false 
    VillainR.physicsBody?.isDynamic = true 






    VillainR.run(MoveToCenter) 
    addChild(VillainR) 
    } 

:

는 화면에 적의 우주선이라고 얻고 추가 ​​내 선박 기능입니다 빠른. 대단히 감사드립니다.

+1

주 당신이 구현되지 않은 경우 SpriteKit에 타이머를 사용하여 몇 가지 문제로 당신을 이끌 수있는 [ 사용자 지정 일시 중지 기능] (http://stackoverflow.com/a/34398582/3402095). 예를 들어, 배경으로 들어가서 1 ~ 2 분 후에 게임으로 돌아 오면, 적을 가득 담은 화면을 볼 수 있습니다. 이는 Timer가 노드의 장면 또는보기의 일시 중지 상태에 영향을받지 않기 때문에 앱이 백그라운드로 들어간 직후 일시 중지되지 않기 때문입니다. 반면에 SKActions에서는 자동으로 처리됩니다. – Whirlwind

+1

또한 이름 지정 규칙을 따라야합니다. 유형 및 프로토콜 이름은 UpperCamelCase입니다. 나머지는 모두 lowerCamelCase입니다. 'VillainR.run (MoveToCenter) '대신에'villainR.run (moveToCenter)'를 의미합니다.) 이것은 다른 사람들이 코드를 이해하기 쉽게 만들어 줄 것입니다 ... – Whirlwind

답변

1

life 변수가 장면의 속성으로 선언되고 특정 노드 (적선)에만 국한되지 않기 때문에 이러한 현상이 발생합니다. 당신은 ... 첫 번째 방법은 노드의 userData 속성을 사용하는 것입니다 몇 가지 방법으로이 문제를 해결 할 수 있습니다

import SpriteKit 

let kEnergyKey = "kEnergyKey" 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    override func didMove(to view: SKView) { 


     let blueShip = getShip(energy: 3) 
     let greenShip = getShip(energy: 2) 
     let redShip = getShip(energy: 1) 

     if let blueShipEnergy = blueShip.userData?.value(forKey: kEnergyKey) as? Int { 

      print("Blue ship has \(blueShipEnergy) lives left") 
      //hit the ship 
      blueShip.userData?.setValue(blueShipEnergy-1, forKey: kEnergyKey) 

      if let energyAfterBeingHit = blueShip.userData?.value(forKey: kEnergyKey) as? Int { 

       print("Blue ship has \(energyAfterBeingHit) lives left") 
      } 
     } 
    } 

    func getShip(energy:Int)->SKSpriteNode{ 
     //determine which texture to load here based on energy value 
     let ship = SKSpriteNode(color: .purple, size: CGSize(width: 50, height: 50)) 

     ship.userData = [kEnergyKey:energy] 

     return ship 
    } 
} 

이이 문서 말할 것입니다 약 userData 특성 :

당신은 당신을 저장하기 위해이 속성을 사용하여 노드의 자체 데이터. 예를 들어, 게임 로직 내에서 사용할 각 노드에 대한 게임 관련 데이터를 저장할 수 있습니다. 이것은 게임 데이터를 저장하기 위해 자신의 노드 하위 클래스를 만드는 대신 유용한 대안이 될 수 있습니다. 당신이 볼 수 있듯이

,이 대안은 (SKSpriteNode) 노드의 서브 클래스입니다 :

class Enemy:SKSpriteNode { 

    private var energy:Int 
    //do initialization here 
} 
+0

Ok ..... 그리고 필요한 것이 무엇인지 말해 줄 수 있습니까? 총알 노드가 적 노드와 접촉 할 때마다 beginContCont 함수를 사용하여 수명이 1 씩 감소합니다. –

+0

@AlexMerlin 간단합니다. 'didBegin (contact :)'에서 우주선에 접근 한 다음 userData에 접근 한 다음 우주선의 종류에 따라 '에너지'변수를 줄이면 결국 제거됩니까? 이해가 되니? – Whirlwind

+0

좋습니다. ... 최대한 빨리 구현하고 상황이 어떻게되는지 알려 드리겠습니다. 대단히 감사합니다. –