我在名为" 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")
}}}}
答案 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)
}