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

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -