2016-06-17 2 views
0

저는 앱을 만들고 있는데, 하나의 클래스에 SKScene의 상당 부분을 썼습니다. 그것은 훌륭하지만, 지난 한 학기 동안 (자바) 과정을 수강했을 때 수락 된 업계 관행은 그것을 여러 클래스들로 분리하는 것입니다.내 기능은 어디에 두어야합니까?

이보다 구체적으로는, 내 (SpriteKit) 응용 프로그램은 고양이와 마우스를 포함하고 과정을 말했다 끝난 후, 내가 대신 SKScene에 모든 정보를 포함, 나는 여러 클래스로의 일부를 분리해야한다는 결정 (A Player 슈퍼 클래스 (x 및 y 위치와 같은) 관련 정보와 함께 Scene 관련 함수 및 정보 만있는 함수 (예 : moveCat)를 Scene 클래스에 포함하고 있습니다 (예 : CatMouse 하위 클래스 포함).

문제은 함수의 내용에 있습니다.

특히, 기능 중 하나 인 pathBlocked (원하는 이동 경로를 차단하는 장벽이 있는지 확인)은 Player 개체 (예 : 모든 정보 등)에 포함되지 않는 많은 정보를 사용합니다. 칠판의 장벽, 그리고 얼마나 많은 치즈가 모아 졌는지). 이동 pathBlocked를 사용하는 고양이 (catAI)에 속해야하는 기능이 있기 때문에

난 그냥 Scene 함수로 pathBlocked을 떠날 수 없다. 장면의 방법이라면 효과가 없습니다. pathBlocked에 전화하기를 원할 때마다 Scene 객체를 인스턴스화해야합니다.

CatMouse 클래스를 만드는 것을 잊어 버리면 안되며, 속하지 않은 정보로 Player 클래스를 채워야합니까?

또는 제 3의 옵션이 있습니까?

코드 스 니펫이 필요하면 그 중 일부를 포함 할 수 있습니다.

감사합니다.

+0

'pathBlocked'는 내가 장면의 방법으로 가장 적합하다고 생각합니다. – Alexander

+0

언급을 잊어 버린 고양이는'pathBlocked'를 호출하는'catAI' 메소드를 가지고 있습니다. 장면의 방법이라면 효과가 없습니다. 'pathBlocked'를 호출하고 싶을 때마다 장면 객체를 인스턴스화 할 필요가 없을까요? –

+1

cat 객체는 부모 장면에 대한 약한 참조를 보유 할 수 있으며 그러한 정보를 쿼리 할 수 ​​있습니다. – Alexander

답변

1

좋아, 그래서 당신은 무엇을해야

class Cat { 
    var sceneRef: GameScene? //or whatever scene is called 
    var xPos: CGFloat! 
    var yPos: CGFloat! 

    init(s: GameScene){//just example stuff 
     sceneRef = s 
     xPos = sceneRef!.childNodeWithName("cat").position.x 
     yPos = sceneRef!.childNodeWithName("cat").position.y //However, these variables will not stay up to date. If you need them current, you would have to do the same thing again, xPos = sceneRef!.childNode...etc. 
    } 

    func doStuff{ 

    } 

    func createNewPath() 
     //create a new path 
    } 
} 

그런 다음 장면에서, 당신이 할 수 있습니다 :

class GameScene: SKScene { 
    var cat: Cat? 

    override init(size: CGSize){ 
     super.init(size: size) 
     cat = Cat(s: self) 

    func whatever() { 
     if (pathBlocked()){ 
      cat!.createNewPath() 
     } 
    } 

난 당신이 그냥 당신이 그것을 사용할 때마다 랩을 해제해야합니다 생각, 그러나 Xcode는 그것을 말할 것입니다.

^이것에 대한 크레디트는 AMomchilov로 가야합니다. 재미있는 학습 경험 XD였습니다.

코드를 구성하려는 경우 다른 방법으로 장면의 확장 파일을 가져 와서 거기에 모든 하위 수준 기능을 넣고 실제 장면에 모든 고수준 항목을 보관하십시오 수업. 새로운 클래스를 확인하고 호출 SceneExtension 또는 무언가 :

import SpriteKit 
//import whatever else you need 

extension GameScene { //<- Or whatever your previous scene that you want to extend is called 

    func pathBlocked() { 
     //function code 
    } 

    //other functions 
} 

을 그냥 기본적으로 당신이보고 바로 실제 장면 파일에 공간을 차지하지 않는 모든 다른 기능을 던져. 같은 파일에서와 같이 작동하므로 여기에있는 함수 중 하나를 호출하거나 두 클래스의 변수를 사용할 수 있습니다.

+0

약한 참조가 장면과 함께 변경됩니까? 장면에 변수가 포함되어 있으면 장면의 변수가 변경 될 때 약한 참조의 변수가 변경됩니까 –

+0

예. 만약 당신이'if scene.cheeseObtained> = 5' 또는 무엇인가를 체크한다면 그것은 정확할 것입니다. 그러나'var cheese = scene.cheeseObtained', 그리고 치즈가 scene 클래스에서 변경된 것, 방금 " 치즈 "는 업데이트되지 않지만,'cheese = scene.cheeseObtained'를 다시했다면 다시 정확합니다. 나는 물건을 시험하고, 그것이 옳은지 확인하고, XD를 오도하고 싶지 않습니다. – Arkidillo

+0

나는 그것을 직접 테스트했으며 모든 변수는 최신 상태로 유지됩니다. 그래서 현재 x 위치가 필요하다면 다음과 같이 할 수 있습니다 :'sceneRef !.childNodeWithName ("cat"). position.x' – Arkidillo

관련 문제