2017-12-18 331 views
-1

當前試圖讓怪物角色橫向來回移動。我剛剛開始學習上週的時候對Swift非常陌生,而且還沒有完全掌握OOP。那麼如何在調用addEnemy函數時正確調用enemyStaysWithinPlayableArea函數。繼承人我到目前爲止:如何在水平方向來回移動角色

import SpriteKit 

class GameScene: SKScene { 
    var monster = SKSpriteNode() 
    var monsterMove = SKAction() 
    var background = SKSpriteNode() 
    var gameArea: CGRect 



// MARK: - Set area where user can play 
    override init(size: CGSize) { 
     // iphones screens have an aspect ratio of 16:9 
     let maxAspectRatio: CGFloat = 16.0/9.0 
     let playableWidth = size.height/maxAspectRatio 
     let margin = (size.width - playableWidth)/2 
     gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height) 
     super.init(size: size) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 


override func didMove(to view: SKView) { 
    // I want to run addEnemy() while it checks for enemyStayWithinPlayableArea() 
    // run(SKAction.repeatForever(...)) ??? 
    enemyStayWithinPlayableArea() 

    // MARK: - Setting the background 
    background = SKSpriteNode(imageNamed: "background") 
    background.size = self.size 
    // Set background at center of screen 
    background.position = CGPoint(x:self.size.width/2 ,y:self.size.height/2) 
    // Layering so everything in the game will be in front of the background 
    background.zPosition = 0 
    self.addChild(background) 


} 


func addEnemy() { 

    // MARK: - Set up enemy and its movements 
    monster = SKSpriteNode(imageNamed: "monster") 
    monster.zPosition = 5 
    // this is where the enemy starts 
    monster.position = CGPoint(x: 0, y: 300) 
    self.addChild(monster) 
    // I want it to move to the end of the screen within 1 sec 
    monsterMove = SKAction.moveTo(x: gameArea.maxX, duration: 1.0) 
    monster.run(monsterMove) 


} 

func enemyStayWithinPlayableArea(){ 
    addEnemy() 
    // when the monster reaches the right most corner of the screen 
    // turn it back around and make it go the other way 
    if monster.position.x == gameArea.maxX{ 
     monsterMove = SKAction.moveTo(x: gameArea.minX, duration: 1.0) 
     monster.run(monsterMove) 

    } 
    // when the monster reaches the left most corner of the screen 
    // same idea as above 
    if monster.position.x == gameArea.minX{ 
     monsterMove = SKAction.moveTo(x: gameArea.maxX, duration: 1.0) 
     monster.run(monsterMove) 
    } 

} 


} 

到目前爲止,敵人在屏幕上移動到屏幕的右邊緣,以便部分完美地工作。我只需要幫助確保它繼續循環(也許使用SKAction.repeatForever方法,但不知道如何)。

回答

0

要理解spritekit中圖像的移動,請檢查此示例。

let moveLeft = SKAction.moveTo(CGPoint(x: xpos, y: ypos), duration: duration) 
let moveRight = SKAction.moveTo(CGPoint(x: xpos, y: ypos), duration: duration) 

sprite.runAction(SKAction.repeatActionForever(SKAction.sequence([moveLeft, moveRight]))) 

水平移動y位置從未改變應該是相同向左移動和移動right.to停止repeatforever行動使用本。

sprite.removeAllActions() 
0

使用各自的SKActions創建兩個函數moveToMax和moveToMin並使用完成處理程序運行操作。

func moveToMin(){ 
    monsterMove = SKAction.moveTo(x: gameArea.minX, duration: 1.0) 
    monster.run(monsterMove, completion: { 
     moveToMax() 
    }) 
}