2016-10-16 14 views
0

Flappy Birdに似たゲームを作るためにいくつかの関数を作成しています。私は完全な初心者であり、私が進む前にすべてを完全に理解しようとしています。私は自分の障害を乗り越えることができましたが、複数の障害で後で柔軟性を持たせるために関数に入れようとすると、エラーが発生します。 SKScene、SKPhysicsContactDelegate {Swift 3 Expect Argument Error

var Player = SKSpriteNode() 
var Ground = SKSpriteNode() 
var Roof = SKSpriteNode() 
var Background = SKSpriteNode() 
let Obstacle1 = SKSpriteNode(imageNamed: "Fire Barrel 1") 

override func didMove(to view: SKView) { 

    // Create Background Color 
    backgroundColor = bgColor 

    // Set World Gravity 
    self.physicsWorld.gravity = CGVector(dx: 0.0, dy: -4.0) 

    // Create Player 
    Player = SKSpriteNode(imageNamed: "Player") 
    Player.setScale(0.5) 
    Player.position = CGPoint(x: -self.frame.width/2 + 100, y: -Player.frame.height/2) 

    self.addChild(Player) 

    // Create Ground 
    Ground = SKSpriteNode(imageNamed: "BGTileBtm") 
    Ground.anchorPoint = CGPoint(x: 0,y: 0.5) 
    Ground.position = CGPoint(x: -self.frame.width/2, y: -self.frame.height/2) 

    self.addChild(Ground) 

    // Create Roof 
    Roof = SKSpriteNode(imageNamed: "BGTileTop") 
    Roof.anchorPoint = CGPoint(x: 1,y: 1) 
    Roof.position = CGPoint(x: -self.frame.width/2, y: self.frame.height/2 - Roof.frame.height) 
    Roof.zRotation = CGFloat(M_PI) 

    self.addChild(Roof) 

    // Set Physics Rules 
    Player.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "Player"), size: Player.size) 
    Player.physicsBody!.affectedByGravity = true 
    Player.physicsBody!.allowsRotation = false 

    Ground.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "Ground"), size: Ground.size) 
    Ground.physicsBody!.affectedByGravity = false 
    Ground.physicsBody!.isDynamic = false 

    // Obstacle 
    func addObstacle1(){ 

     Obstacle1.position = CGPoint(x: self.frame.width/2, y: -self.frame.height/2 + Obstacle1.frame.height) 
     Obstacle1.zPosition = 1 
     addChild(Obstacle1) 
    } 

    func moveObstacle1(){ 

     let distance = CGVector(dx: -self.frame.width, dy: 0) 
     let moveDistance = SKAction.move(by: distance, duration: 5) 
     run(moveDistance) 

    } 

    addObstacle1() 
    Obstacle1.run(moveObstacle1()) 


} 
+0

完全な初心者の方は、最初に変数と関数/メソッドが小文字で始まる命名規則について検討してください。 – vadian

+0

入力していただきありがとうございます。それに応じて変数が調整されます。 –

答えて

2

変更し、これにmoveObstacle1の宣言:

func moveObstacle1() -> SKAction{ 

    let distance = CGVector(dx: -self.frame.width, dy: 0) 
    let moveDistance = SKAction.move(by: distance, duration: 5) 
    return moveDistance 

} 

EDIT:あなたのコメントについて

runが方法です。あなたがそれを呼び出すと、渡されたSKActionが実行されます。それだけです!あなたがしようとしているのはrun(moveObstacle1())です。それはどういう意味ですか?どのようにしてメソッド呼び出しをパラメータとして渡すことができますか?実行時に戻り値moveObstacle1()の場合はrunに渡されます。つまり、run(moveObstacle1())をコンパイルするには、moveObstacle1()returnステートメントを使用して値を返す必要があります。その値は、runに渡すものなので、タイプSKActionでなければなりません。

returnmoveObstacle1()から値を返すために使用され、run(moveObstacle1())を呼び出すことができます。

runは、単なる通常の古い方法です。

+0

恐ろしい!それがそれでした。 SKActionを追加しましたが、復帰するために実行を変更する必要があることはわかりませんでした。あなたは、この問題の文脈で、プレーン・イングリッシュでリターン・コマンドと実行コマンドの違いを説明したいと思いませんか? –

+0

@MartinJones私の編集した回答を参照してください – Sweeper

+0

説明をありがとう。私の問題は、ノードが複数回出現することです。私は遅れをもって繰り返し永遠のアクションを使用しようとしましたが、うまくいかないようです。 –

1

変更:

Obstacle1.run() 

へ:

SKAction '

クラスGameScene '期待される引数の型に'

「タイプを変換できません'()

Obstacle1.run(SKAction(moveObstacle1())) 

エラーメッセージは明らかです。SKActionSKSpriteNodeに渡す必要があります。

編集

import SpriteKit 
import GameplayKit 

class GameScene : SKScene, SKPhysicsContactDelegate { 

    var Player = SKSpriteNode() 
    var Ground = SKSpriteNode() 
    var Roof = SKSpriteNode() 
    var Background = SKSpriteNode() 
    let Obstacle1 = SKSpriteNode(imageNamed: "Spaceship") 

    let sprite = SKSpriteNode(imageNamed:"Spaceship") 

    override func didMove(to view: SKView) { 

     // Create Background Color 
     backgroundColor = UIColor.green 

     // Set World Gravity 
     self.physicsWorld.gravity = CGVector(dx: 0.0, dy: -4.0) 

     // Create Player 
     Player = SKSpriteNode(imageNamed: "Player") 
     Player.setScale(0.5) 
     Player.position = CGPoint(x: -self.frame.width/2 + 100, y: -Player.frame.height/2) 

     self.addChild(Player) 

     // Create Ground 
     Ground = SKSpriteNode(imageNamed: "BGTileBtm") 
     Ground.anchorPoint = CGPoint(x: 0,y: 0.5) 
     Ground.position = CGPoint(x: -self.frame.width/2, y: -self.frame.height/2) 

     self.addChild(Ground) 

     // Create Roof 
     Roof = SKSpriteNode(imageNamed: "BGTileTop") 
     Roof.anchorPoint = CGPoint(x: 1,y: 1) 
     Roof.position = CGPoint(x: -self.frame.width/2, y: self.frame.height/2 - Roof.frame.height) 
     Roof.zRotation = CGFloat(M_PI) 

     self.addChild(Roof) 

     // Set Physics Rules 
     Player.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "Player"), size: Player.size) 
     Player.physicsBody!.affectedByGravity = true 
     Player.physicsBody!.allowsRotation = false 

     Ground.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "Ground"), size: Ground.size) 
     Ground.physicsBody!.affectedByGravity = false 
     Ground.physicsBody!.isDynamic = false 

     sprite.size = CGSize(width:50, height: 50) 
     sprite.position = CGPoint(x:self.frame.midX, y:self.frame.midY); 

     self.addChild(sprite) 

     Obstacle1.run(SKAction(moveObstacle1())) 
    } 


    func moveObstacle1(){ 
     let action = SKAction.moveTo(x: self.frame.size.width * 2, duration: 20) 
     sprite.run(action) 
    } 
} 
+0

入力いただきありがとうございます。この変更によりエラーメッセージは削除されますが、障害物は移動しません。私は行方不明の何か他にありますか? –

+0

私は100%確信しているわけではありません。私はこれほど多くのことをしていませんでしたが、新しいSKSpriteNodeを作成しました。これがあなたに役立つことを願っています@MartinJones –

+0

はい、それがありました。上記の回答も解決しました。それは、使用するために走る代わりにリターンが必要なように見えます。入力いただきありがとうございます。 –