2017-02-01 1 views
1

Ich baue diesen Popup-Countdown-Timer für ein Spiel. Das Problem ist, dass ich nicht herausfinden kann, wie ich das Animate aktualisieren kann, damit sich auch die Anzeige ändert. Es funktioniert so weit, aber Sie können die Zahlen nicht ändern sehen. Es fügt sich in die 00:00 ein. Ich bin mir ziemlich sicher, dass es bisher nur Probleme mit dieser Veränderung gibt. Dies geschieht mit grünen Schuhen. Irgendwelche Ideen, was ich hier falsch mache?Rubingrün Schuhe Timer

#Timer button used for creating a countdown timer for the game. 
    #Game ends when timer is zero. 
    flow width: 80, height: 0.2 do 
    button 'Timer', width: 1.0, height: 1.0 do 
     window do 
     def time_change! 
      @clock = '%02d:%02d' % [@second/60, @second % 60] 
      if(@second == 0) 
      alert "game is over" 
      @clock = '00:00' 
       close() 
      para @clock, size: 50, stroke: black 
      end 
     end 

     background whitesmoke 
     @clock = '00:00' 
     para @clock, size: 50, stroke: black 


     @second = 10 

     animate(1) do 
      @second -= 1 
      time_change! 
      para @clock, size: 50, stroke: black 

     end 
    end 
end 
+0

Haben Sie Referenzen, die das Definieren einer Methode in einem Fensterblock beschreiben? Ich bin mir bewusst, dass sich Defs an die aktuelle Klasse anhängen, und ich weiß, dass das Selbst innerhalb eines Fensterblocks das Fenster ist, aber es folgt nicht notwendigerweise, dass die aktuelle Klasse das Fenster ist, z. In einem 'instance_eval'-Block ist self der Aufrufer, während die aktuelle Klasse die Singleton-Klasse des Aufrufers ist. Auf der anderen Seite, in einer Klasse, sagen "Klasse Dog", aber außerhalb jeder Defs, self = Dog und die aktuelle Klasse ist auch Dog. Ihr Code wird ohne Fehler ausgeführt, also 'self = window = current_class'. – 7stud

+0

Ich bin eigentlich neu zu Ruby, also habe ich eine Vermutung darüber, und Sie haben recht, es läuft ohne Fehler. Die interessante Sache ist, dass ich am Ende Methodenfehler für @ p.text erhalte und Fehler segne, um zu versuchen, Instanzvariablen innerhalb eines para-Aufrufs aufzurufen. Traurig, grüne Schuhe sind ein wenig nutzlos im Vergleich zu aktuellen Schuhen, aber es ist das, das meine Gruppe zu verwenden. Ich werde diese Methode diesmal außerhalb des Blocks machen und sehen, ob sich das ändert – LogNIsGood

+0

Okay. Ich habe normale Schuhe (Walkabout) benutzt, um deine Frage zu beantworten, und es sieht in OSX schrecklich aus. Der Fenstertitel ist verschwommen, ebenso die Schaltflächen für Min, Max und Schließen. Es ist, als hätte jemand ein OSX-Fenster mit einem schrecklichen Handy aufgenommen, dann in ein .png konvertiert und dann ein Fenster dargestellt. Es gibt auch andere Probleme: Der Text in den Elementen title, subtitle und caption wird in der Baseline abgeschnitten. Vor vielen Jahren habe ich mit wxRuby herumgespielt, und es war ziemlich nett. Leider hat der Betreuer wxRuby aufgegeben. – 7stud

Antwort

0

Sie können den Text des aktuellen para ersetzen, die die Uhr zeigt:

Shoes.app do 
    flow do 
    button 'Timer', width: 100, height: 50 do 
     window width: 200, height: 100 do #Open a child window when the button is clicked 
     seconds = 3 
     tenths = 0 
     clock = '%02d:%02d' 

     flow do 
      @p = para clock % [seconds, tenths], #Assign the clock para to an instance variable, 
      size: 50,       #which will make the variable visible outside this block. 
      stroke: black 
     end 

     a = animate(10) do #Upate the clock every 1/10 of a second. 
      tenths -= 1 

      if tenths < 0 
      tenths = 9 
      seconds -= 1 
      end 

      @p.text = clock % [seconds, tenths] #Replace the clock text. 

      if seconds == 0 and tenths == 0 
      a.stop 
      alert("game over") 
      close #=>self.close where self is the window whose block contains this code 
      end 
     end #animate 

     end #window 
    end #button 
    end #flow 
end #app 

Um zu überprüfen, dass die Uhr actualy jedes Zeitinkrement angezeigt, können Sie die Dinge verlangsamen, indem animate(10) zu animate(1) Ändern .