0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS 3.1上實現(xiàn)游戲萬能卡片

OpenHarmony技術社區(qū) ? 來源:OST開源開發(fā)者 ? 作者:OST開源開發(fā)者 ? 2023-06-06 09:27 ? 次閱讀

舒爾特方格游戲,是注意力訓練方法之一,可以幫助孩子糾正上課分心走神、回家做作業(yè)拖拉毛病,但不能貪玩哦,玩多了,對眼睛,視力不好。

①消息通知欄,通知用戶當前最優(yōu)成績,也就是當前最快時間。

②元服務卡片,在桌面上添加 2x2 或 2x4 或 2x4 規(guī)格元服務卡片,能看到不同布局隨機數(shù)字,根據(jù)左上角紅色字提示,快速完成點擊,用時最少為最優(yōu)成績。

③1x2 規(guī)格元服務卡片,只顯示當前最優(yōu)成績,點擊可以查看 2x2 或 2x4 或 2x4 規(guī)格元服務卡片最快用時游戲記錄。

關系型數(shù)據(jù)庫,用于查詢,添加,更新,刪除元服務卡片信息和各卡片游戲用時成績數(shù)據(jù)。

效果圖如下: 489ae7de-0408-11ee-90ce-dac502259ad0.gif

知識點

消息通知:提供通知管理的能力,包括發(fā)布、取消發(fā)布通知,創(chuàng)建、獲取、移除通知通道,訂閱、取消訂閱通知,獲取通知的使能狀態(tài)、角標使能狀態(tài),獲取通知的相關信息等。 關系型數(shù)據(jù)庫:關系型數(shù)據(jù)庫基于 SQLite 組件提供了一套完整的對本地數(shù)據(jù)庫進行管理的機制,對外提供了一系列的增、刪、改、查等接口,也可以直接運行用戶輸入的 SQL 語句來滿足復雜的場景需要。 元服務卡片開發(fā):卡片是一種界面展示形式,可以將應用的重要信息或操作前置到卡片,以達到服務直達、減少體驗層級的目的。 卡片提供方:顯示卡片內(nèi)容,控制卡片布局以及控件點擊事件。 卡片使用方:顯示卡片內(nèi)容的宿主應用,控制卡片在宿主中展示的位置。 卡片管理服務:用于管理系統(tǒng)中所添加卡片的常駐代理服務,包括卡片對象的管理與使用,以及卡片周期性刷新等。

軟件要求:

DevEco Studio 版本:DevEco Studio 3.1 Release 及以上版本。

HarmonyOS SDK 版本:API version 9 及以上版本。

硬件要求:

設備類型:華為手機 3.1 系統(tǒng)或運行在 DevEco Studio 上的遠程模擬器API9。

HarmonyOS 系統(tǒng):3.1.0 Developer Release 及以上版本。

卡片講解

1x2 卡片主要顯示所有卡片最優(yōu)成績,也就是用時最少的,同時點擊卡片,跳轉到主界面,查看卡片游戲記錄。

48e15a0c-0408-11ee-90ce-dac502259ad0.jpg

2x2 卡片顯示的是 3x3 布局隨機生成 1~9 數(shù)字,正上方標題顯示挑戰(zhàn)成功或失敗提示,左上角紅色字提示下一個要點擊的數(shù)字按鈕,右上角顯示當次完成后用時和此卡片用時最少成績。

當此次的用時少于最好用時,挑戰(zhàn)成功,并更新數(shù)據(jù)庫此卡片記錄,如果此次用時大于最好用時,提示挑戰(zhàn)失敗,不用更新數(shù)據(jù)庫。

48f1e0d4-0408-11ee-90ce-dac502259ad0.jpg

2x4 卡片顯示的是 7x2 布局隨機生成 1~14 數(shù)字,顯示內(nèi)容和游戲規(guī)則與 2x2 卡片一樣。

490776c4-0408-11ee-90ce-dac502259ad0.jpg

4x4 卡片顯示的是 6x6 布局隨機生成 1~36 數(shù)字,顯示內(nèi)容和游戲規(guī)則與 2x2 卡片一樣。

491924dc-0408-11ee-90ce-dac502259ad0.jpg

首次啟動或點擊 1x2 卡片進入到主界面,主界面顯示各卡片游戲成績記錄。

49306872-0408-11ee-90ce-dac502259ad0.jpg

通知顯示效果:

49507040-0408-11ee-90ce-dac502259ad0.jpg

代碼講解

數(shù)據(jù)庫操作后端項目結構圖:

49659092-0408-11ee-90ce-dac502259ad0.png

FormData.ets 實體類代碼如下:

exportdefaultclassFormData{
//卡片ID
formId:string;
//距陣數(shù)3x3
matrixNum:string;
//最優(yōu)成績
bestScore:number;
//總最優(yōu)成績
totalBestScore:number;
}

Form.ets 數(shù)據(jù)庫卡片表如下:

exportdefaultclassForm{
//卡片ID
formId:string;
//卡片名稱
formName:string;
//卡片描述
dimension:number;
/**
*封裝卡片數(shù)據(jù)
*@returns
*/
toValuesBucket(){
return{
'formId':this.formId,
'formName':this.formName,
'dimension':this.dimension
};
}
}

ScoreData.ets 游戲記錄成績表如下:

exportdefaultclassScoreData{
//卡片
formId:string;
//距陣數(shù)3x3
matrixNum:string;
//最優(yōu)成績
bestScore:number;
/**
*獲取插入成績記錄數(shù)
*@returns
*/
toValuesBucket(){
return{
'formId':this.formId,
'matrixNum':this.matrixNum,
'bestScore':this.bestScore
};
}
}

DatabaseUtils.ets 數(shù)據(jù)庫操作類部分代碼如下:

exportclassDatabaseUtils{

/**
*創(chuàng)建RDB數(shù)據(jù)庫
*
*@param{context}上下文
*@return{globalThis.rdbStore}returnrdbStoreRDB數(shù)據(jù)庫
*/
asynccreateRdbStore(context:Context){
console.info(CommonConstants.DATABASE_TAG,'xxDatabaseUtils-createRdbStore開始...')
//如果全局變量rdbStore不存在,創(chuàng)建
if(!globalThis.rdbStore){
console.info(CommonConstants.DATABASE_TAG,'xx DatabaseUtils-createRdbStore 新創(chuàng)建!')

awaitDataRdb.getRdbStore(context,CommonConstants.RDB_STORE_CONFIG)
.then((rdbStore)=>{
console.info(CommonConstants.DATABASE_TAG,'xxRDBStore回調(diào)')
if(rdbStore){
//創(chuàng)建卡片表
rdbStore.executeSql(CommonConstants.CREATE_TABLE_FORM).catch((error)=>{
console.error(CommonConstants.DATABASE_TAG,'xx DatabaseUtils 創(chuàng)建卡片表失敗:'+JSON.stringify(error))
Logger.error(CommonConstants.DATABASE_TAG,'executeSqlFormerror'+JSON.stringify(error));
});
//創(chuàng)建成績表
rdbStore.executeSql(CommonConstants.CREATE_TABLE_SCORE_DATA).catch((error)=>{
console.error(CommonConstants.DATABASE_TAG,'xx DatabaseUtils 創(chuàng)建成績表失?。?+JSON.stringify(error))
Logger.error(CommonConstants.DATABASE_TAG,'executeSqlSensorerror'+JSON.stringify(error));
});
//存儲RDBStore到全局變量
globalThis.rdbStore=rdbStore;
console.info(CommonConstants.DATABASE_TAG,'xx DatabaseUtils-createRdbStore 創(chuàng)建成功!')
}
}).catch((error)=>{
console.error(CommonConstants.DATABASE_TAG,'xx DatabaseUtils 創(chuàng)建RDB數(shù)據(jù)庫失?。?+JSON.stringify(error))
Logger.error(CommonConstants.DATABASE_TAG,'createRdbStoreerror'+JSON.stringify(error));
});
}else{
console.info(CommonConstants.DATABASE_TAG,'xx DatabaseUtils-createRdbStore 已經(jīng)存在!')
}

console.info(CommonConstants.DATABASE_TAG,'xxDatabaseUtils-createRdbStore結束...')
returnglobalThis.rdbStore;
}

/**
*插入卡片數(shù)據(jù)。
*
*@param{Form}Form表單實體。
*@param{DataRdb.RdbStore}RDB存儲RDB數(shù)據(jù)庫。
*@return返回操作信息。
*/
insertForm(form:Form,rdbStore:DataRdb.RdbStore){
rdbStore.insert(CommonConstants.TABLE_FORM,form.toValuesBucket()).catch((error)=>{
Logger.error(CommonConstants.DATABASE_TAG,'insertFormerror'+JSON.stringify(error));
});
}

/**
*將成績插入數(shù)據(jù)庫。
*
*@param{ScoreData}scoreData。
*@param{DataRdb.RdbStore}RDB存儲RDB數(shù)據(jù)庫。
*/
insertValues(scoreData:ScoreData,rdbStore:DataRdb.RdbStore){
rdbStore.insert(CommonConstants.TABLE_SCORE,scoreData.toValuesBucket()).catch((error)=>{
Logger.error(CommonConstants.DATABASE_TAG,'insertValueserror'+JSON.stringify(error));
});
}

/**
*更新成績到數(shù)據(jù)庫
*@paramscoreData
*@paramrdbStore
*/
updateValues(scoreData:ScoreData,rdbStore:DataRdb.RdbStore){}

/**
*刪除卡片數(shù)據(jù)。
*
*@param{string}formId表單ID。
*@param{DataRdb.RdbStore}RDB存儲RDB數(shù)據(jù)庫。
*/
deleteFormData(formId:string,rdbStore:DataRdb.RdbStore){}

/**
*更新卡片
*
*@param{DataRdb.RdbStore}RDB存儲RDB數(shù)據(jù)庫。
*/
updateForms(rdbStore:DataRdb.RdbStore){}

/**
*發(fā)送通知
*
*@param{string}Steps顯示的值步數(shù)。
*/
asyncsendNotifications(score:number){}

}

卡片前端項目結構圖:

49800ada-0408-11ee-90ce-dac502259ad0.png

EntryAbility.ets 程序入口初始化數(shù)據(jù)庫代碼如下:

onCreate(want,launchParam){
//數(shù)據(jù)庫初始化
globalThis.abilityWant=want;
globalThis.abilityParam=launchParam;
console.info(CommonConstants.ENTRY_ABILITY_TAG,'xxonCreate創(chuàng)建RDB數(shù)據(jù)庫')
//創(chuàng)建RDB數(shù)據(jù)庫
DatabaseUtils.createRdbStore(this.context).then((rdbStore)=>{
console.info(CommonConstants.ENTRY_ABILITY_TAG,'xxonCreateRDB成功')
}).catch((error)=>{
console.error(CommonConstants.ENTRY_ABILITY_TAG,'xx onCreate 創(chuàng)建數(shù)據(jù)庫失?。?+JSON.stringify(error))
Logger.error(CommonConstants.ENTRY_ABILITY_TAG,'onCreaterdberror'+JSON.stringify(error));
});
}

EntryFormAbility.ets 卡片生命周期代碼如下:

onAddForm(want){
//獲取卡片ID:ohos.extra.param.key.form_identity
letformId:string=want.parameters[CommonConstants.FORM_PARAM_IDENTITY_KEY]asstring;
//獲取卡片名稱:ohos.extra.param.key.form_name
letformName:string=want.parameters[CommonConstants.FORM_PARAM_NAME_KEY]asstring;
//獲取卡片規(guī)格:ohos.extra.param.key.form_dimension
letdimensionFlag:number=want.parameters[CommonConstants.FORM_PARAM_DIMENSION_KEY]asnumber;

console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG,`xx 添加卡片是:${formId}${dimensionFlag}${dimensionFlag}`)
DatabaseUtils.createRdbStore(this.context).then((rdbStore)=>{
//卡片信息
letform:Form=newForm();
form.formId=formId;
form.formName=formName;
form.dimension=dimensionFlag;
console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG,'xx onAddForm 新增卡片信息:'+JSON.stringify(form))
//保存卡片信息到數(shù)據(jù)庫
DatabaseUtils.insertForm(form,rdbStore);
//獲取最優(yōu)成績
getBestScore(rdbStore,dimensionFlag,formId);
}).catch((error)=>{
console.error(CommonConstants.ENTRY_FORM_ABILITY_TAG,'xx onAddForm 添加卡片失敗:'+JSON.stringify(error))
Logger.error(CommonConstants.ENTRY_FORM_ABILITY_TAG,'onAddFormrdberror'+JSON.stringify(error));
});

//每五分鐘刷新一次
formProvider.setFormNextRefreshTime(formId,CommonConstants.FORM_NEXT_REFRESH_TIME,(error,data)=>{
if(error){
console.error(CommonConstants.ENTRY_FORM_ABILITY_TAG,'xx onAddForm 更新卡片失?。?+JSON.stringify(error))
Logger.error(CommonConstants.ENTRY_FORM_ABILITY_TAG,'refreshTime,error:'+JSON.stringify(error));
}else{
console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG,'xxonAddForm更新卡片成功')
Logger.info(CommonConstants.ENTRY_FORM_ABILITY_TAG,'refreshTimesuccess'+JSON.stringify(data));
}
});

//返回初始化卡片數(shù)據(jù)
letformData:FormData=newFormData();
formData.formId=formId;
formData.bestScore=0;
formData.matrixNum='1x1';
formData.totalBestScore=0;
returnformBindingData.createFormBindingData(formData);
}

卡片頁面部分代碼,這里就顯示 2x2 卡片代碼如下:

build(){
Column(){
Text(this.message)
.width('100%')
.fontSize(12)
.textAlign(TextAlign.Center)
.fontWeight(700)
.margin({top:6,bottom:6})
Row(){
Text(`下一個:${this.flagNum==0?1:this.flagNum}`)
.fontSize(10).fontWeight(400)
.fontColor(Color.Red)
Row(){
Text(`此次:${this.currentScore}`)
.fontSize(10).fontWeight(400)
Text(`最好:${this.bestScore}`)
.fontSize(10).fontWeight(400)
}
}
.width('100%')
.padding({left:10,right:10})
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.SpaceBetween)

Flex({justifyContent:FlexAlign.Center,alignItems:ItemAlign.Center,wrap:FlexWrap.Wrap}){
//循環(huán)顯示數(shù)字按鈕
ForEach(this.numArray,(day:string)=>{
Button(day,{type:ButtonType.Circle,stateEffect:true})
.width(40)
.height(40)
.padding(1)
.margin(4)
.fontSize(12)
.backgroundColor(Color.Gray)
.stateStyles({
normal:this.normalStyles,
pressed:this.pressedStyles
})
.onClick(()=>{this.startGame(Number(day))})
},day=>day)
}
.width('100%')
.height('100%')
.padding({top:2,left:5,right:5})
}
.width('100%')
.height('100%')
}

總結

通過開發(fā)這個小游戲元服務,學習到不少知識,其實我有嘗試過把數(shù)據(jù)庫操作類寫到動態(tài)共享包里,這樣元服務打包后不就更小了,然而啟動后白屏了,進步問題,等華為相關技術人員回復,想學習動態(tài)共享包的,可以參考關系型數(shù)據(jù)庫-動態(tài)共享包開發(fā)。 總結這個項目用到以下知識點:

使用 notification 發(fā)布通知。

使用關系型數(shù)據(jù)庫插入、更新、刪除卡片數(shù)據(jù)。

使用 FormExtensionAbility 創(chuàng)建、更新、刪除元服務卡片。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 華為
    +關注

    關注

    215

    文章

    34258

    瀏覽量

    250989
  • 游戲
    +關注

    關注

    2

    文章

    733

    瀏覽量

    26261
  • 數(shù)據(jù)庫

    關注

    7

    文章

    3752

    瀏覽量

    64233
  • HarmonyOS
    +關注

    關注

    79

    文章

    1966

    瀏覽量

    29962
  • OpenHarmony
    +關注

    關注

    25

    文章

    3635

    瀏覽量

    16061

原文標題:HarmonyOS 3.1上實現(xiàn)“游戲萬能卡片”

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HarmonyOS服務卡片跑AIGC

    我們認為基于 AIGC 能力類型的 HarmonyOS 元服務萬能卡片應該通過 API 方式調(diào)用合規(guī)訓練后的各具特色的模型與角色來服務用戶,通過萬能
    的頭像 發(fā)表于 04-25 09:40 ?2232次閱讀
    <b class='flag-5'>HarmonyOS</b>服務<b class='flag-5'>卡片</b>跑AIGC

    萬能總線怎么焊接

    萬能總線怎么焊接
    發(fā)表于 03-24 14:40

    HarmonyOS萬能服務卡片開發(fā)嘗試歷程(一)

    本系列帖子,會將我們對服務卡片的一個探索的過程進行總結,很多不完善的地方,歡迎批評討論。非常早期的嘗試,微、小、中、大卡整套,統(tǒng)一的色彩,純圖片的形式,純圖片的方式比較容易固定和兼容手機、平板和折疊屏;想通過萬能服務卡片的方式,
    發(fā)表于 09-07 15:15

    李洋:手把手教你開發(fā)一個元服務萬能卡片

    萬能卡片概念與優(yōu)勢元服務基于HarmonyOS API開發(fā),秉承著HarmonyOS系統(tǒng)一次開發(fā)多端部署、可分可合自由流轉、統(tǒng)一生態(tài)原生智能的三大應用與服務開發(fā)理念,支持運行在1+8
    發(fā)表于 03-20 14:37

    HarmonyOS元服務萬能卡片訓練一下文心一言的AIGC能力

    服務與萬能卡片。我們認為基于AIGC能力類型的HarmonyOS元服務萬能卡片應該通過API方式調(diào)用合規(guī)訓練后的各具特色的模型與角色來服務用
    發(fā)表于 04-18 10:31

    HarmonyOS元服務開發(fā)實踐:桌面卡片字典

    等功能。 二、元服務效果 萬能卡片效果 2.元服務內(nèi)頁 三、項目開發(fā) 環(huán)境搭建 軟件要求: DevEco Studio版本:DevEco Studio 3.1 Release及以上版本
    發(fā)表于 08-24 16:55

    HarmonyOS/OpenHarmony原生應用-ArkTS萬能卡片組件Stack

    (Alignment.Top) }.width(\'100%\').height(150).margin({ top: 5 }) } } 四、效果展示 五、場景 卡片實現(xiàn)堆疊的場景使用。 本文根據(jù)
    發(fā)表于 10-09 14:29

    HarmonyOS/OpenHarmony原生應用-ArkTS萬能卡片組件Radio

    ) }) } }.padding({ top: 30 }) } } 復制 五、效果 六、場景 適合卡片直接操作單選項的場景。 本文根據(jù)HarmonyOS官方文檔整理。
    發(fā)表于 10-13 17:21

    HarmonyOS開發(fā)案例分享:萬能卡片也能用來玩游戲

    直接在桌面上玩游戲嗎? 通過對萬能卡片相關文檔的閱讀,我認為想要實現(xiàn)一些簡單的游戲應該沒有問題,思考再三,我決定做一個井字棋小
    發(fā)表于 12-01 09:35

    KMS8_V3.1oem系統(tǒng)的萬能激活工具

    電子發(fā)燒友網(wǎng)站提供《KMS8_V3.1oem系統(tǒng)的萬能激活工具.exe》資料免費下載
    發(fā)表于 08-17 15:57 ?3次下載

    帶你探究萬能卡片的一些用處

    剛剛升級HarmonyOS 2的朋友 會注意到桌面不少APP圖標下多了小橫條比如相機、日歷、微博、京東等 在好奇心的驅使下 如果你不小心向上滑動了這些APP圖標 那你就解鎖了全新功能——萬能卡片
    的頭像 發(fā)表于 08-16 09:16 ?3240次閱讀

    華為開發(fā)者大會2021智能硬件開發(fā)— 萬能卡片的全新升級

    華為開發(fā)者大會2021智能硬件開發(fā)— 萬能卡片的全新升級 2021年10月22日~24日,華為將在中國松山湖舉行2021華為開發(fā)者大會,聚焦鴻蒙系統(tǒng)、智能家居、智慧辦公、HMS Core 等熱門話題
    的頭像 發(fā)表于 10-23 10:32 ?1575次閱讀
    華為開發(fā)者大會2021智能硬件開發(fā)— <b class='flag-5'>萬能</b><b class='flag-5'>卡片</b>的全新升級

    HarmonyOS 3.1實現(xiàn)計步卡片

    本篇帖子是參考 Codelab 基于 Stage 模型 JS 服務卡片,使用最新 ArkTS 元服務開發(fā)的,實現(xiàn)帶有卡片的計步應用,用于介紹卡片的開發(fā)及生命周期
    的頭像 發(fā)表于 05-29 11:10 ?757次閱讀

    【開發(fā)者說】開發(fā)案例分享:萬能卡片也能用來玩游戲

    】,即可獲得投稿渠道。期待你們的分享~ 一 前言 作為一名開發(fā)愛好者,從大了講,我學習并進行HarmonyOS相關開發(fā)是為了能為鴻蒙生態(tài)建設盡一份綿薄之力,從小了講,就是為了自己的興趣。 而萬能卡片是一個讓我非常感興趣的東西。
    的頭像 發(fā)表于 11-30 21:15 ?480次閱讀
    【開發(fā)者說】開發(fā)案例分享:<b class='flag-5'>萬能</b><b class='flag-5'>卡片</b>也能用來玩<b class='flag-5'>游戲</b>

    開發(fā)案例分享:萬能卡片也能用來玩游戲

    ,我學習并進行HarmonyOS相關開發(fā)是為了能為鴻蒙生態(tài)建設盡一份綿薄之力,從小了講,就是為了自己的興趣。 而萬能卡片是一個讓我非常感興趣的東西。 很多時候我跟別人解釋什么是萬能
    的頭像 發(fā)表于 12-15 16:35 ?531次閱讀
    開發(fā)案例分享:<b class='flag-5'>萬能</b><b class='flag-5'>卡片</b>也能用來玩<b class='flag-5'>游戲</b>