sprite kit - Swift 3: class doesn't function correctly -
so i've got class named flashypaddleeffect
. mention in class, gamescene
, doesn't apply effect should. paddle should flashing blue , white colors, stays white. paddle should lose physics body when blue.
if need other information, don't hesitate ask.
note: there might problems code gave (because of indents, it's quite tricky make code indenting 4 spaces every line, sorry).
import spritekit import gameplaykit class flashypaddleeffect { var node = skspritenode() var ballnode = skspritenode() var updatetimer: timer? = nil var timer: timer? = nil @objc func changenodecolor() { switch node.color { case skcolor.blue: node.color = skcolor.white case skcolor.white: node.color = skcolor.blue default: _ = 1 + 2 } } @objc func update() //i used objc prefix silence warning selectors of timers produced. { let previousphysicsbody = node.physicsbody if node.color == skcolor.blue { node.physicsbody = nil } node.physicsbody = previousphysicsbody } func make(applyeffectto: skspritenode, ball: skspritenode) { node = applyeffectto ballnode = ball timer = timer.scheduledtimer(timeinterval: 0.6, target: self, selector: #selector(changenodecolor), userinfo: nil, repeats: true) updatetimer = timer.scheduledtimer(timeinterval: 0.3, target: self, selector: #selector(update), userinfo: nil, repeats: true) _ = node _ = timer } } class gamescene: skscene { var ball = skspritenode() var player = skspritenode() var enemy = skspritenode() var scores = [0, 0] var initscores = [0, 0] var scorelabels: [sklabelnode]? = nil let playlabel = sklabelnode() let timelabel = sklabelnode() let timeuplabel = sklabelnode() var secondsleft: int = 180 var initialtime: int? = nil var timer = timer() var amountofpausemenucloses = 0 var resultslabel = sklabelnode() let flasheffect = flashypaddleeffect() //i define variable mention class easier later on. override func didmove(to view: skview) { //initialize nodes of scene editor. ball = self.childnode(withname: "ball") as! skspritenode player = self.childnode(withname: "ppaddle") as! skspritenode enemy = self.childnode(withname: "epaddle") as! skspritenode //set styles play notification label (referred pnl later) playlabel.position = cgpoint(x: 0, y: 0) playlabel.text = "tap anywhere play." playlabel.name = "playlabel" //set styles timer label (referred timer later) timelabel.position = cgpoint(x: 90, y: 0) timelabel.text = string(secondsleft) //doing manipulations connected scores here. scores = [0, 0] initscores = scores scorelabels = [self.childnode(withname: "pscorelabel") as! sklabelnode, self.childnode(withname: "escorelabel") as! sklabelnode] //create border our ball bounce off. let border = skphysicsbody(edgeloopfrom: self.frame) border.friction = 0 border.restitution = 1 border.lineardamping = 0 border.angulardamping = 0 self.physicsbody = border //to avoid ball's damping. ball.physicsbody?.lineardamping = 0 ball.physicsbody?.angulardamping = 0 showpause() //show (pause) menu @ beginning //set variable refer time standard later. initialtime = secondsleft //the game timer. timer = timer.scheduledtimer(timeinterval: 1.0, target: self, selector: #selector(reducesecondfromtimer), userinfo: nil, repeats: true) flasheffect.make(applyeffectto: player, ball: ball) //this reference class in class. } //a function show (pause) menu. func showpause(hidenodes: bool = true) { self.addchild(playlabel) if hidenodes == true { ball.removefromparent() player.removefromparent() enemy.removefromparent() scorelabels?[0].removefromparent() scorelabels?[1].removefromparent() } } override func update(_ currenttime: timeinterval) { var alreadychangedtextlabel = false in scorelabels! { if i.name == "pscorelabel" {i.text = string(scores[0])} if i.name == "escorelabel" {i.text = string(scores[1])} } if ball.position.y <= player.position.y {scores[1] += 1} if ball.position.y >= enemy.position.y {scores[0] += 1} if secondsleft == 0 { showpause(hidenodes: false) if alreadychangedtextlabel == false { timeuplabel.text = "time up! \(whoiswinning(scores: scores)) won!" alreadychangedtextlabel = true } timeuplabel.name = "timeuplabel" timeuplabel.position = cgpoint(x: 0, y: 180) if !(self.children.contains(timeuplabel)) { self.addchild(timeuplabel) } timelabel.removefromparent() } if self.children.contains(playlabel) { secondsleft = initialtime! } timelabel.text = string(secondsleft) let alignwithball = skaction.move(to: cgpoint(x: ball.position.x, y: enemy.position.y), duration: 0.8) enemy.run(alignwithball) } func initgame() { //initializing process every game. scores = initscores ball.position = cgpoint(x: 0, y: 0) if amountofpausemenucloses == 1 {ball.physicsbody?.applyimpulse(cgvector(dx: 15, dy: 15))} secondsleft = initialtime! timelabel.text = string(secondsleft) } override func touchesended(_ touches: set<uitouch>, event: uievent?) { childnode in self.children { if childnode.name == "playlabel" { if self.children.contains(playlabel) { playlabel.removefromparent() } if !(self.children.contains(player)) { self.addchild(player) } if !(self.children.contains(enemy)) { self.addchild(enemy) } if !(self.children.contains(ball)) { self.addchild(ball) } if !(self.children.contains((scorelabels?[0])!)) { self.addchild((scorelabels?[0])!) } if !(self.children.contains((scorelabels?[1])!)) { self.addchild((scorelabels?[1])!) } if !(self.children.contains(timelabel)) { self.addchild(timelabel) } if self.children.contains(timeuplabel) { timeuplabel.removefromparent() } amountofpausemenucloses += 1 initgame() } } } override func touchesmoved(_ touches: set<uitouch>, event: uievent?) { t in touches { if self.nodes(at: t.location(in: self)).contains(player) {player.position.x = t.location(in: self).x} } } func reducesecondfromtimer() { secondsleft -= 1 } func whoiswinning(scores: array<int>) -> string { var r: string? = nil if scores[0] >= scores[1] { r = "you" } if scores[1] >= scores[0] { r = "enemy" } return r! } }
thanks lot answers. p.s it's first question ever don't judge me strictly.
1) not use nstimer
use skaction
. can see way doing stack timer after timer, bad.
2) not have temp variable global (node in case), makes code hard read
3) not remove physics body, remove category.
func make(applyeffectto: skspritenode, ball: skspritenode) { ballnode = ball let blue = skaction.colorize(with skcolor.blue, colorblendfactor: 1.0, duration sec: 0) let white = skaction.colorize(with skcolor.white, colorblendfactor: 1.0, duration sec: 0) let wait = skaction.wait(for:0.6) let turnonphysics = skaction.run({applyeffectto.physicsbody?.categorybitmask = #######}) let turnoffphysics = skaction.run({applyeffectto.physicsbody?.categorybitmask = 0}) let seq = [blue, turnoffphysics,wait,white,turnonphysics,wait] let repeat = skaction.repeatforever(seq) applyeffectto.run(repeat, withkey:"flashing") }
note: have no idea categorybitmask
is, need fill in
Comments
Post a Comment