成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

暴打七夕青蛙—HarmonyOS服務卡片小游戲

開發 OpenHarmony
七夕節,令我“幸福”的是,被熱心市民送來了七夕青蛙,聽取一天了蛙聲一片。吃飽了一整天的狗糧后,有點撐著,于是決定加班加點,用服務卡片實現了一個簡單的小游戲:暴打七夕青蛙!游戲雖簡單,但玩起來是真的爽!

[[419006]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

七夕節,令我“幸福”的是,被熱心市民送來了七夕青蛙,聽取一天了蛙聲一片。吃飽了一整天的狗糧后,有點撐著,于是決定加班加點,用服務卡片實現了一個簡單的小游戲:暴打七夕青蛙!游戲雖簡單,但玩起來是真的爽!

效果展示視頻

效果視頻

效果圖

暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區
暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區

編寫過程

更改程序標簽和程序的圖標

在resources文件下的zh.element中的string.json中修改如下,就把應用的名字修改為“七夕青蛙”,而主頁面也會從“Hello World!” 變成 “GoodBye World!”

暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區

在config.json文件修改icon的值,引用到media里面的青蛙。

暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區

創建JS卡片

編寫卡片的樣式

游戲卡片的結構非常非常非常非常簡單,就是一個div容器,通過設置div容器的背景圖來實現游戲效果。playGame卡片的hml代碼如下:

  1. <div style="width:100100%;" > 
  2.     <div style="flex_direction:column;width:100%;height:100%;background-image:{{background}} ;"onclick="messageEvent" > 
  3.     </div> 
  4. </div> 

GamePanel的樣式稍微復雜一點,但是其實也很簡單。需要設置兩個變量,得分score和倒計時countdown,其中得分設置成一個上下結構。hml代碼如下:

  1. <div> 
  2.     <div class="normal_container"
  3.         <div class="pic_title_container" onclick="settings"  > 
  4.             <div style="flex-direction: row;" > 
  5.             <!-- 得分 --> 
  6.                 <div style="flex-direction: column;width: 50%;margin-top: 20px;" > 
  7.                     <text style="text-align: center;width: 100%;font-size: 25px;"
  8.                         SCORE 
  9.                     </text> 
  10.                     <text style="text-align: center;width: 100%;font-size: 35px;color: ghostwhite;"
  11.                         {{ score }} 
  12.                     </text> 
  13.                 </div> 
  14.             <!-- 倒計時 --> 
  15.                 <text style="text-align: center;width: 40%;font-size: 60px;color: brown;" > 
  16.                     {{ countDown }} 
  17.                 </text> 
  18.             </div> 
  19.             <div style="margin-right: 10px;" > 
  20.                 <button onclick="start" type="capsule" style="opacity: 0.5;margin-right: 40px;text-align: center;width: 40%;">開始</button> 
  21.                 <button onclick="stop" type="capsule" style="opacity: 0.5;margin-right: 40px;text-align: center;width: 40%;">停止</button> 
  22.             </div> 
  23.         </div> 
  24.     </div> 
  25. </div> 

給變量賦初值

在playGame卡片的index.json文件中,修改“data”如下圖,默認一開始是沒有青蛙出現的。

暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區

在GamePanel卡片的index.json文件中,修改“data”如下圖

暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區

設置卡片的動作事件

“actions”數組是所有事件的集合,下面跟著每個事件的名稱,名稱里面又包含事件的類型“action”和攜帶的參數“params”。

在playGame卡片的index.json文件中,修改“actions”如下圖

暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區

在GamePanel卡片的index.json文件中,修改“actions”如下圖

暴打七夕青蛙——HarmonyOS服務卡片小游戲-鴻蒙HarmonyOS技術社區

編寫游戲部分

七夕青蛙的隨機出現

七夕青蛙的出現上文提到過是通過設置div容器的背景圖片來實現,所以可以通過產生一個隨機數的方式來隨機地設置div容器的背景來實現游戲過程,因此需要把div的背景設置成變量,并添加一個onclick標簽。

  1. //兩種背景圖的路徑 
  2. private static final String frog="url(\"/common/frog1.png\")"
  3. private static final String hole="url(\"/common/hole.png\")"
  4. public String rand_bg() 
  5.    { 
  6.        String bg; 
  7.        double randnumber=Math.random(); 
  8.        if(randnumber>0.65)//隨機數大于0.65時把返回的字符串對應青蛙圖,這個數值可以自行設定 
  9.            bg=frog; 
  10.        else 
  11.            bg=hole; 
  12.        return bg; 
  13.    } 

創建一個數據體來存儲卡片的信息,并使用MAP將其存儲起來

不同卡片的回調事件都是共用一個回調方法的,所以想要區分到底是哪一種,哪一個卡片發出的回調,就需要把卡片的信息:卡片的名稱,卡片的ID,卡片的相關參數等記錄下來。這里采用編寫一個卡片數據類來存儲1*2格式的卡片的信息。

  1. public class GameWigetData 
  2.     public String background; 
  3.     public long FormId; 
  4.     public GameWigetData()  
  5.     { 
  6.         super(); 
  7.     } 
  1. public static Map<Long, GameWigetData> gameWidgetDataMap=new HashMap<>()//鍵是FormId,值是數據體 

修改onCreateForm()方法

onCreateForm()方法在兩種情況被調用。第一種是上滑呼出卡片的時候,這時候上滑卡片是哪一種卡片,就會調用一次onCreateForm()方法生成一張該種卡片;

第二種情形是長按應用,然后點擊"服務卡片",此時會顯示應用的所有卡片,并每一張卡片都會回調一次onCreateForm()方法并生成一個卡片,當選擇了其中某一張卡片添加到桌面之后,其他卡片回調onDeleteForm()方法來刪除卡片。所有卡片都是調用同一個方法一起生成的,所以需要對卡片的名稱進行一次判斷,以確定卡片的種類。在onCreateForm()中添加如下代碼:

  1. if(formName.equals("GamePanel"))//如果是游戲控制面板卡片,則有如下操作 
  2.         { 
  3.             if(gamePanelFormId==0) 
  4.             {//如果放置了兩個,那么只有放置的第一個有作用,應該游戲控制面板只需要一個 
  5.                 gamePanelFormId=formId; 
  6.             } 
  7.         } 
  8. //如果是游戲卡片,那么創建一個數據體實例,并把它的卡片id和數據體實例一同傳入Map中 
  9.         else if(formName.equals("playGame")) 
  10.         { 
  11.             GameWigetData gameWidgetData = new GameWigetData(); 
  12.             gameWigetDataMap.put(formId, gameWidgetData); 
  13.            // System.out.println("formID->"+formId); 
  14.         } 

修改onDeleteForm()方法

在onDeleteForm()方法中,要補充兩種卡片刪除時的設置,這里很重要,一開始我沒有對游戲卡片進行設置,結果運行會拋出沒有對應的FormId的錯誤,查看卡片的時候所有卡片都會調用onCreateForm()方法,然后所有12卡片的ID都寫入Map里面,但是當其中一個卡片放置到桌面,而其他卡片回調onDeleteForm()進行刪除的時候,12卡片的信息并沒有從Map中移除。這就會導致并不是每一個Map中的FormId都有對應的卡片。

  1. if(gamePanelFormId==formId){ 
  2.            gamePanelFormId=0; 
  3.        } 
  4. else
  5.            gameWigetDataMap.remove(formId); 
  6.  
  7.        

編寫變量的更新方法

由于后面的操作需要頻繁地用到更新,修改卡片上的變量的操作,所以在進行下面的操作之前,我們先編寫一個修改變量的方法。

  1. //更新值是字符串時 
  2.  private void updateWidget(long formId,String key, String value) { 
  3.         try { 
  4.             ZSONObject zsonObject = new ZSONObject(); 
  5.             zsonObject.put(key, value); 
  6.             FormBindingData formBindingData = new FormBindingData(zsonObject); 
  7.             updateForm(formId, formBindingData); 
  8.         } catch (Exception e) { 
  9.             System.out.println(e.getMessage()); 
  10.         } 
  11.     } 
  12. //更新值是整數時 
  13.     public void updateWidget(long formId,String keyint value) { 
  14.         updateWidget(formId, key, String.valueOf(value)); 
  15.  
  16.     } 

修改onTriggerFormEvent()方法

在這個游戲中,總共有三個點擊事件需要響應:開始鍵,停止鍵,打青蛙。同樣的,這三個事件共用一個回調方法,因此需要通過事件所攜帶的參數來判斷到底是哪一個事件回調了方法。在onTriggerFormEvent()中添加如下代碼:

  1. //接受事件傳遞的參數 
  2.  ZSONObject zsonObject=ZSONObject.stringToZSON(message); 
  3.  String message1=zsonObject.getString("message"); 
  4.  
  5. //如果是開始鍵觸發的事件,則把開始標志設置為真 
  6.         if (message1.equals("start")) 
  7.         { 
  8.             startFlag=true
  9.             System.out.println("start"); 
  10.         } 
  11. //如果是停止鍵觸發的事件,則把開始標志設置為假,并重置面板上的數據 
  12.         else if (message1.equals("stop")) 
  13.         { 
  14.             startFlag = false
  15.             score = 0; 
  16.             countdown1 = 60; 
  17.             updateWidget(gamePanelFormId,"score",score); 
  18.             updateWidget(gamePanelFormId,"countdown",countdown1); 
  19.         } 
  20. //如果是“打青蛙”事件 
  21.         else 
  22.         { 
  23.             if(startFlag)//如果游戲在進行中 
  24.             { 
  25.                 //判斷現在面板中是不是青蛙 
  26.                 GameWigetData gameFormData=gameWigetDataMap.get(formId); 
  27.                 if(gameFormData.background.equals(frog)) 
  28.                 { 
  29.                     score =score+10;//達到一個加十分 
  30.                     System.out.println("現在的分數是"+score); 
  31.                     gameFormData.background=hole;//打完重新設置為洞 
  32.                     updateWidget(gamePanelFormId,"score",score); 
  33.                     updateWidget(formId,"background",gameFormData.background); 
  34.                 } 
  35.             } 
  36.             else 
  37.                 System.out.println("游戲已經結束了"); 
  38.         } 

編寫游戲線程

在onStart()方法中添加游戲線程如下:

  1. if(gameThread==null
  2.         {//如果還未創建游戲線程,則創建游戲線程 
  3.             gameThread=new Thread(() -> { 
  4.                 while(true
  5.                 { 
  6.                     try { 
  7.                         Thread.sleep(50); 
  8.                         if(startFlag) 
  9.                         { 
  10.                             //對所有的卡片都隨機地設置背景 
  11.                             for(GameWigetData gameWigetData:gameWigetDataMap.values()) 
  12.                             { 
  13.                                 gameWigetData.background=tool.rand_bg(); 
  14.                             } 
  15.                             //對所有的1*2卡片進行更新 
  16.                             for(long gameWigetFormId:gameWigetDataMap.keySet()) 
  17.                             { 
  18.                                 GameWigetData gameWigetData=gameWigetDataMap.get(gameWigetFormId); 
  19.                                 updateWidget(gameWigetFormId,"background",gameWigetData.background); 
  20.                             } 
  21.                         } 
  22.                         Thread.sleep(750); 
  23.                     }catch (Exception e) 
  24.                     { 
  25.                         System.out.println(e.getMessage()); 
  26.                         startFlag=false
  27.                     } 
  28.                 } 
  29.             }); 
  30.             gameThread.start(); 
  31.         } 

編寫倒計時線程

在onStart()方法中編寫倒計時線程如下:

  1. if(countDownThread==null
  2.         { 
  3.             countDownThread=new Thread(new Runnable() 
  4.             { 
  5.                 public void run() 
  6.                 { 
  7.                     while(true
  8.                     { 
  9.                         try{ 
  10.                             Thread.sleep(50); 
  11.                             if(startFlag) 
  12.                             { 
  13.                                 if(countdown1>0) 
  14.                                 { 
  15.                                     updateWidget(gamePanelFormId,"countdown",countdown1); 
  16.                                     countdown1--; 
  17.                                     System.out.println("現在剩余的時間是"+countdown1); 
  18.                                 } 
  19.                                 else//countdown==0的時候,復位 
  20.                                 { 
  21.                                     updateWidget(gamePanelFormId,"countdown",0); 
  22.                                     startFlag=false
  23.                                     countdown1=60; 
  24.                                     System.out.println("游戲結束!"); 
  25.                                 } 
  26.                             } 
  27.                         Thread.sleep(1000); 
  28.                         }catch (Exception e) 
  29.                         { 
  30.                             System.out.println(e.getMessage()); 
  31.                         } 
  32.                     } 
  33.                 } 
  34.             }); 
  35.             countDownThread.start(); 
  36.         } 

項目踩的小坑

1.score要設置成靜態變量,否則被釋放,導致盡管打中很多次都只能到10分,而不能夠往上累積。

2.onDeleteForm()方法要記得從Map中remove掉已經刪除掉的卡片的ID

最后

最后祝有情人終成眷屬啦,祝單身狗早日脫單!還有就是感謝我那群為我瞎操心的朋友們!(文后附上脫單壓縮包)

Card_Game_the_frog.zip

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-08-20 14:26:17

鴻蒙HarmonyOS應用

2012-08-24 10:49:51

備份恢復

2015-08-21 17:10:03

云安全

2018-08-19 14:30:42

女性分析網站

2023-08-22 21:39:25

2020-08-26 06:04:25

信息泄露密鑰加密信息安全

2022-10-19 15:27:36

數獨Sudoku鴻蒙

2021-08-25 09:54:51

鴻蒙HarmonyOS應用

2021-08-23 10:49:02

鴻蒙HarmonyOS應用

2011-08-06 23:25:49

筆記本導購

2021-08-13 10:38:23

人工智能AI深度學習

2018-08-17 16:30:20

2021-08-15 19:00:14

算法floydDijkstra

2019-08-07 17:17:54

華為

2009-08-25 21:17:09

2012-08-23 13:37:04

傲游瀏覽器

2017-08-23 10:01:00

搜狗

2013-08-13 09:24:25

程序員七夕節

2014-07-21 17:16:08

2014-07-29 15:19:22

傲游瀏覽器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日皮视频免费 | 国产精品久久久久久模特 | 中文字字幕一区二区三区四区五区 | 国产香蕉视频 | 欧美亚洲视频在线观看 | 亚洲日韩欧美一区二区在线 | 欧美999| 国产一区二区三区精品久久久 | 久久久久国产精品免费免费搜索 | 国产91亚洲精品一区二区三区 | 亚洲一区亚洲二区 | 国产精品18hdxxxⅹ在线 | 欧美精品三区 | 国产精品自拍啪啪 | 亚洲精品久久久久久久久久久 | 先锋资源吧 | 欧美 日韩 国产 成人 在线 | 国内自拍第一页 | 欧美精品福利 | 亚洲国产一区视频 | 久久婷婷色 | 在线视频亚洲 | 国产精品久久久久久妇女 | 中文字幕乱码一区二区三区 | 91精品国产高清久久久久久久久 | 毛片在线视频 | 午夜激情影院 | 欧美日韩综合一区 | 成人做爰9片免费看网站 | 国产在线观看网站 | 日本黄色一级片视频 | 伊人免费在线观看高清 | 亚洲精品久久久一区二区三区 | 日本亚洲精品成人欧美一区 | 免费人成在线观看网站 | 97在线观视频免费观看 | 国产成人精品一区二区三区视频 | 在线免费观看毛片 | 国产成人99久久亚洲综合精品 | 亚洲精品在线看 | www.日韩系列 |