使用Physics Body创建SKSprite节点的功能

时间:2017-11-28 18:11:31

标签: ios swift xcode sprite-kit

我在名为" BuildViewController"的类中调用函数。然后它运行我的" GameScene"创建一个SpriteNode并在我的GameScene上显示它,但什么都没有出现。它正在运行该函数,但由于某种原因,当我在函数中声明节点时它不起作用。另外,使SpriteNode完全正常运行的代码就像它不在函数中而在GameScene中一样。

// I call the function in BuildViewController 

GameScene().buildfarm()

// here is the function, it is in the class "GameScene"

func buildfarm()  {
        var farm = SKSpriteNode(imageNamed: "farm.png")     
        farm.position = CGPoint(x: 100, y: 100)     
        farm.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 100, height: 100))     
        farm.physicsBody?.isDynamic = true     
        farm.physicsBody?.affectedByGravity = false     
        farm.name = "farm"     
        GameScene().addChild(farm)     
    }

我尝试了很多东西......比如在函数中返回精灵,并使用函数添加一个孩子。谢谢,根据需要提出问题!

每个班级的完整代码如下,但我不相信这是必要的感谢!

//
//  BuildViewController.swift
//  MSB Game
//
//  Created by Matthew Jacobsen on 10/18/17.
//  Copyright © 2017 Matthew Jacobsen. All rights reserved.
//
import SpriteKit
import UIKit


class BuildViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    // Build the farm cuddi
    @IBAction func BuildFarm(_ sender: Any) {
        if gold >= 25 {
        print("Build The Farm")
            gold = gold - farmprice

           GameScene().buildfarm()

            foodpersecond = foodpersecond + 0.1
            print (foodpersecond)
        }
        else if gold < 25 {
            print("not enough gold")
        }

    }
    //Build the House cuddi
    @IBAction func BuildHouse(_ sender: Any) {
        if gold >= 100 {
            print("Build The House")
            gold = gold - houseprice



//
//
        }
        else if gold < 100 {
            print("not enough gold")
        }
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

...

//
//  GameScene.swift
//  MSB Game
//
//  Created by Matthew Jacobsen on 10/3/17.
//  Copyright © 2017 Matthew Jacobsen. All rights reserved.
//

import SpriteKit
import GameplayKit
import Foundation
import UIKit
// declare array of spritenodes
var buildings:[SKSpriteNode] = []

var gold = 150.0
var wood = 0.0
var stone = 0.0
var food = 100.0

let lgold = UILabel(frame: CGRect(x: 80, y: 0, width: 1000, height: 1000))
let lwood = UILabel(frame: CGRect(x: 80, y: 0, width: 200, height: 200))
let lstone = UILabel(frame: CGRect(x: 80, y: 0, width: 200, height: 200))
let lfood = UILabel(frame: CGRect(x: 80, y: 0, width: 200, height: 200))

var upgradel = SKShapeNode()
var cancell = SKShapeNode()
var upgradelabel = UILabel(frame: CGRect(x: 80, y: 0, width: 1000, height: 1000))
var cancellabel = UILabel(frame: CGRect(x: 80, y: 0, width: 200, height: 200))

var time = Timer()

var foodpersecond = 0.0
var woodpersecond = 0.0
var stonepersecond = 0.0
var goldpersecond = 0.0
var sellrate = 1.0

var foodstring = food.description
var goldstring = gold.description

let houseprice = 100.0
let farmprice = 25.0
let trainfarmer = 50.0
let trainsupervisor = 100.0

func sellfood() {
    if food >= 10 {
        food = food - (sellrate * 10)
        foodstring = food.description
        lfood.text = foodstring
        gold = gold + sellrate
        goldstring = gold.description
        lgold.text = goldstring
    }
}
class GameScene: SKScene {

    func buildfarm()  {
        var farm = SKSpriteNode(imageNamed: "farm.png")
        farm.position = CGPoint(x: 100, y: 100)
        farm.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 100, height: 100))
        farm.physicsBody?.isDynamic = true
        farm.physicsBody?.affectedByGravity = false
        farm.name = "farm"
        GameScene().addChild(farm)
    }
    var topbar = SKShapeNode()

    //buildings.append(farm)

    override func didMove(to view: SKView) {
        //label for all the food and stuff
        lgold.font = UIFont.preferredFont(forTextStyle: .title1)
        lgold.textColor = .yellow
        lgold.center = CGPoint(x: 70, y: 50)
        lgold.textAlignment = .center
        var goldstring = gold.description
        lgold.text = goldstring
        lwood.font = UIFont.preferredFont(forTextStyle: .title1)
        lwood.textColor = .brown
        lwood.center = CGPoint(x: 160, y: 50)
        lwood.textAlignment = .center
        var woodstring = wood.description
        lwood.text = woodstring
        lstone.font = UIFont.preferredFont(forTextStyle: .title1)
        lstone.textColor = .gray
        lstone.center = CGPoint(x: 250, y: 50)
        lstone.textAlignment = .center
        var stonestring = stone.description
        lstone.text = stonestring
        lfood.font = UIFont.preferredFont(forTextStyle: .title1)
        lfood.textColor = .red
        lfood.center = CGPoint(x: 340, y: 50)
        lfood.textAlignment = .center
        var foodstring = food.description
        lfood.text = foodstring

        backgroundColor = UIColor.brown



        self.view?.addSubview(lgold)
        self.view?.addSubview(lwood)
        self.view?.addSubview(lstone)
        self.view?.addSubview(lfood)

        //label for all the food and stuff

        topbar = SKShapeNode(rectOf: CGSize(width:800, height: 150))
        topbar.position = CGPoint(x: 00, y:600)
        topbar.fillColor = .black

        self.addChild(topbar)

        //Build - Train -


        time = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(GameScene.countertimer), userInfo: nil, repeats: true)

        //        var farm = SKSpriteNode(imageNamed: "farm.png")
        //        farm.position = CGPoint(x: 100, y: 100)
        //        farm.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 100, height: 100))
        //        farm.physicsBody?.isDynamic = true
        //        farm.physicsBody?.affectedByGravity = false
        //        farm.name = "farm"
        //        self.addChild(farm)








        func update(_ currentTime: TimeInterval) {
            // Called before each frame is rendered

        }
    }


    @objc func countertimer() {
        food = food + foodpersecond
        foodstring = food.description
        lfood.text = foodstring
    }



    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches {
            let pointOfTouch = touch.location(in: self)
            let nodeITapped = atPoint(pointOfTouch)
            let nameOfTappedNode = nodeITapped.name

            if nameOfTappedNode == "upgradewhite" {
                upgradel.removeFromParent()
                cancell.removeFromParent()
                cancellabel.removeFromSuperview()
                upgradelabel.removeFromSuperview()
                if gold >= 5 {
                    foodpersecond = foodpersecond + 0.5
                    gold = gold - 5.0
                    goldstring = gold.description
                    lgold.text = goldstring
                }}
            if nameOfTappedNode == "cancelwhite" {
                upgradel.removeFromParent()
                cancell.removeFromParent()
                cancellabel.removeFromSuperview()
                upgradelabel.removeFromSuperview()
            }

            if nameOfTappedNode == "farm" {

                upgradelabel.font = UIFont.preferredFont(forTextStyle: .title1)
                upgradelabel.textColor = .red
                upgradelabel.center = CGPoint(x: 100, y: 500)
                upgradelabel.textAlignment = .center
                upgradelabel.text = "UPGRADE"

                cancellabel.font = UIFont.preferredFont(forTextStyle: .title1)
                cancellabel.textColor = .red
                cancellabel.center = CGPoint(x: 300, y: 500)
                cancellabel.textAlignment = .center
                cancellabel.text = "CANCEL"

                upgradel = SKShapeNode(rectOf: CGSize(width:250, height: 150))
                upgradel.fillColor = .white
                upgradel.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 100, height: 100))
                upgradel.physicsBody?.isDynamic = true
                upgradel.position = CGPoint(x: -200, y:-250)
                upgradel.physicsBody?.affectedByGravity = false
                upgradel.name = "upgradewhite"

                cancell = SKShapeNode(rectOf: CGSize(width:250, height: 150))
                cancell.fillColor = .white
                cancell.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 100, height: 100))
                cancell.physicsBody?.isDynamic = true
                cancell.position = CGPoint(x: 150, y:-250)
                cancell.physicsBody?.affectedByGravity = false
                cancell.name = "cancelwhite"

                self.addChild(upgradel)
                self.addChild(cancell)
                self.view?.addSubview(cancellabel)
                self.view?.addSubview(upgradelabel)
                print("farm tapped")

            }}}}

1 个答案:

答案 0 :(得分:0)

您创建了GameScene的两个实例。相反,你应该这样做:

GameScene().buildfarm()

// here is the function, it is in the class "GameScene"

func buildFarm()  {
    var farm = SKSpriteNode(imageNamed: "farm.png")     
    farm.position = CGPoint(x: 100, y: 100)     
    farm.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 100, height: 100))     
    farm.physicsBody?.isDynamic = true     
    farm.physicsBody?.affectedByGravity = false     
    farm.name = "farm"     
    self.addChild(farm)     
}