2017-04-14 6 views
1

내 코드에 문제가 있습니다. 그들은 단지로 이동합니다,이 코드를 실행하면SKSpriteNode를 다른 SKSpriteNode로 만드는 법

class GameScene: SKScene, SKPhysicsContactDelegate { 
    func Enemies() { 
     Enemy = SKSpriteNode(imageNamed: "Spaceship") 
     Enemy.size = CGSize(width: 50, height: 50) 
     Enemy.color = UIColor(red: 0.9, green: 0.1, blue: 0.1, alpha: 1.0) 
     Enemy.colorBlendFactor = 1.0 

     //physics 
     Enemy.physicsBody = SKPhysicsBody(rectangleOf: Enemy.size) 
     Enemy.physicsBody?.isDynamic = true 
     Enemy.physicsBody?.affectedByGravity = false 
     Enemy.name = "Enemy" 

     Enemy.position.y = -frame.size.height/2 
     let positionX = arc4random_uniform(UInt32(frame.size.width)) 
     Enemy.position.x = CGFloat(positionX) 
     addChild(Enemy) 
    } 

    override func didMove(to view: SKView) { 

     enemyTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(GameScene.Enemies), userInfo: nil, repeats: true) 

    override func update(_ currentTime: TimeInterval) { 
     Enemy.run(SKAction.move(to: ship.position, duration: 3)) 
    } 

, 나는 좀비를 생성 할 수 있지만 내 주요 선수를 따라하지 않을 것이다 : 나는 좀비가 다음 코드를 사용하여 주위에 내 플레이어를 따라하기 위해 노력하고있어 (즉, 시간 = 0에서 생성 된 좀비는 시간 = 0에서 배 위치로 갈 것이고, 시간 = 1에서 생성되는 좀비는 시간 = 1에서 배 위치로 갈 것입니다. 그러나이 코드를 실행하면 다음과 같이 좀비가 생성됩니다.

override func didMove(to view: SKView) { 
    Enemies() 
} 

고독한 좀비가 내 플레이어를 따라갑니다. 왜 코드가 한 좀비에 대해서만 작동하지만, 여러 좀비에는 사용할 수 없습니까?

+0

여기 많은 문제가 있습니다. 타이머를 사용하면 안됩니다. 게임 루프와 쌍을 이루지 않습니다. 둘째로, [target and seeker behavior]를 구현하기 위해 초당 60 회의 새로운 액션을 적용해서는 안됩니다 (http://stackoverflow.com/a/36235426/3402095). 다음에 유의할 점은 일단 만들어진 액션은 수정할 수 없습니다. 즉, 액션 매개 변수를 한 번 설정하면 나중에 수정할 수 없습니다. 또한 Enemy 변수는 전역 변수이므로 이해가되지 않습니다. 마지막으로 추가 된 적에 대한 참조 만 유지합니다. 내 말은, 당신의 논리가 아마도 그 경우에도 틀릴 것이라는 것입니다 ... – Whirlwind

답변

2

업데이트주기에 지속적으로 작업을 추가하는 것을 권장하지 않습니다. 백그라운드에서 발생하는 모든 작업으로 인해 성능이 저하 될 수 있습니다. 대신, 스프라이트에 한 번만 추가 할 SKAction.customAction을 사용하십시오.
다음은 원하는 작업을 수행 할 사용자 지정 작업의 예입니다. 한번만 지정하면됩니다. (코드 테스트를 거치지 않았으므로 편집해야 할 수도 있습니다.)

let customActionBlock = 
{ 
    (node,elapsedTime) in 
    let dx = ship.x - node.position.x 
    let dy = ship.y - node.position.y 
    let angle = atan2(dx,dy) 
    node.position.x += sin(angle) * speedPerFrame 
    node.position.y += cos(angle) * speedPerFrame 

} 

let duration = TimeInterval(Int.max) //want the action to run infinitely 
let followPlayer = SKAction.customAction(withDuration:duration,actionBlock:customActionBlock) 
Enemy.run(action:followPlayer,withKey:"follow") 
-1

조치를 읽기 전에 removeAllActions()Enemy으로 가져 가야 할 수도 있습니다. 3 초가 걸리는 작업이있는 것처럼 보이지만 모든 프레임마다 작업을 추가하므로 한 번에 한 노드에 대해 최대 180 개의 작업을 수행 할 수 있습니다.

+0

나는 이미 그것을 시도했지만 결과를 변경하지 않습니다. –

+0

'ship'이'struct' 또는'class'인지 확인하십시오. 어쩌면 그것은'struct'이고 여러분은 값을 복사하고 나중에 그것을 결코 업데이트하지 않을 것입니다 - 그것은'class'이어야합니다. – Alistra