Swift 3期待参数错误

时间:2016-10-16 19:25:04

标签: swift

我正在创建一些功能,以便制作类似Flappy Bird的游戏。我是一个完全的初学者,在我继续前进的过程中,我正试图完全理解一切。我已经能够让我的障碍移动但是当我试图将它放入一个函数中以便稍后我有更多的灵活性时会遇到一个错误。

'无法将类型'()'转换为预期的参数类型'SKAction'

类GameScene:SKScene,SKPhysicsContactDelegate {

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())


}

2 个答案:

答案 0 :(得分:2)

theta = std::abs(theta);的声明更改为:

moveObstacle1

编辑:

关于你的评论,

func moveObstacle1() -> SKAction{ let distance = CGVector(dx: -self.frame.width, dy: 0) let moveDistance = SKAction.move(by: distance, duration: 5) return moveDistance } 是一种方法。当你调用它时,它运行你传入的SKAction。就是这样!你要做的是run。这究竟是什么意思?如何将方法调用作为参数传递?在运行时,run(moveObstacle1())返回值将传递给moveObstacle1()。换句话说,要编译runrun(moveObstacle1())必须使用moveObstacle1()语句返回值。该值必须是return类型,因为这是您传递给SKAction的内容。

run用于返回return中的值,以便您可以拨打moveObstacle1()

run(moveObstacle1())只是一种常规方法。

答案 1 :(得分:1)

变化:

Obstacle1.run()

要:

Obstacle1.run(SKAction(moveObstacle1()))

错误消息非常清楚,您需要将SKAction传递给SKSpriteNode

修改

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)
    }
}