JS非同步編程四:Jscex+jQ打造遊戲力度條(1)

來源:互聯網
上載者:User

如果大家玩過桌球類遊戲的話,對力度條的概念一定不會陌生,如:

還有豎直方向上的力度條,如:

其實,類似的條條無處不在!比如進遊戲時候的進度條、魔獸世界裡法師施法過程中讀的條等等。

引入jquery ui,我們可以輕鬆得到下面這個靜止的力度條:

html:

 
  1. <div class="progressbar" style="width: 20%"></div> 

js:

 
  1. $(function () {  
  2.     $(".progressbar").progressbar({  
  3.         value: 37  
  4.     });  

加入Jscex讓它動起來:

 
  1. <script type="text/javascript">  
  2.     $(function () {  
  3.         $(".progressbar").progressbar({  
  4.             value: 5  
  5.         });  
  6.     });  
  7.     var executeAsync = eval(Jscex.compile("async", function (proceedValues) {  
  8.         while (proceedValues < 100) {  
  9.             proceedValues++;  
  10.             $await(Jscex.Async.sleep(50));  
  11.             $(".progressbar").progressbar({  
  12.                 value: proceedValues  
  13.             });  
  14.         }  
  15.     }));  
  16.     function btnExecuteAsync_onclick() {  
  17.         executeAsync(5).start();  
  18.     }  
  19. </script>  
  20. <div class="progressbar" style="width: 20%">  
  21. </div>  
  22. <input id="btnExecuteAsync" type="button" value="開始" onclick="return btnExecuteAsync_onclick()" /> 

但是通常情況下,我們需要它往返無限迴圈下去,那麼我們應該這麼實現:

 
  1. var executeAsync = eval(Jscex.compile("async", function (proceedValues) {  
  2.         while (true) {  
  3.             while (proceedValues < 100) {  
  4.                 proceedValues++;  
  5.                 $await(Jscex.Async.sleep(10));  
  6.                 $(".progressbar").progressbar({  
  7.                     value: proceedValues  
  8.                 });  
  9.             }  
  10.             if (proceedValues == 100) {  
  11.                 while (proceedValues > 0) {  
  12.                     proceedValues--;  
  13.                     $await(Jscex.Async.sleep(10));  
  14.                     $(".progressbar").progressbar({  
  15.                         value: proceedValues  
  16.                     });  
  17.                 }  
  18.             }  
  19.         }  
  20.     })); 

就在這個時候,我一不小心,把if (proceedValues == 100) { } 注釋掉了,代碼變成這個樣子:

 
  1. var executeAsync2 = eval(Jscex.compile("async", function (proceedValues) {  
  2.         while (true) {  
  3.             while (proceedValues < 100) {  
  4.                 proceedValues++;  
  5.                 $await(Jscex.Async.sleep(10));  
  6.                 $(".progressbar3").progressbar({  
  7.                     value: proceedValues  
  8.                 });  
  9.             }  
  10.             //if (proceedValues == 100) {  
  11.             while (proceedValues > 0) {  
  12.                 proceedValues--;  
  13.                 $await(Jscex.Async.sleep(10));  
  14.                 $(".progressbar3").progressbar({  
  15.                     value: proceedValues  
  16.                 });  
  17.             }  
  18.             //}  
  19.         }  
  20.  })); 

效果上面一模一樣,不會錯!

可以看得出來,內部的兩個while不是同時執行的,而是非常線性,它們之間會相互等待,而且最開始的執行順序是從上至下,內部的while執行完了,再跳到最外層的while重新執行。

這種設計方式,無疑是優雅的!!

上面那種三個while的方式語意性很好,從剛剛分析得出,代碼還可以這樣寫


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.