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

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

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

HarmonyOS云開發(fā):舒爾特方格游戲

OpenHarmony技術(shù)社區(qū) ? 來源:OpenHarmony技術(shù)社區(qū) ? 2023-06-19 15:05 ? 次閱讀

舒爾特方格游戲-關系型數(shù)據(jù)庫版本,請移步到上一篇帖子查看,本篇帖子內(nèi)容還是舒爾特方格游戲,只是換了后宮_云數(shù)據(jù)庫。

此項目是用最新版 DevEco Studio 3.1 Release 并創(chuàng)建端云一體開發(fā),由于目前此版本不支持直接調(diào)用云數(shù)據(jù)庫,不過可以通過云函數(shù)調(diào)用云數(shù)據(jù)庫。

也就是在服務卡片業(yè)務邏輯里通過調(diào)用云函數(shù)來完成游戲數(shù)據(jù)保存到云數(shù)據(jù)庫,開發(fā)工具支持本地函數(shù)調(diào)用測試,大大方便了開發(fā)。

此貼重點講解云函數(shù)和云數(shù)據(jù)庫開發(fā),本地和遠端調(diào)用,從而進一步學習 Serverless 知識。

舒爾特方格游戲效果圖如下:92a74280-0da6-11ee-962d-dac502259ad0.gif ?

知識點

為豐富 HarmonyOS 對云端開發(fā)的支持、實現(xiàn) HarmonyOS 生態(tài)端云聯(lián)動,DevEco Studio 推出了云開發(fā)功能,開發(fā)者在創(chuàng)建工程時選擇云開發(fā)模板。

即可在 DevEco Studio 內(nèi)同時完成 HarmonyOS 應用/服務的端側(cè)與云側(cè)開發(fā),體驗端云一體化協(xié)同開發(fā)。

相比于傳統(tǒng)開發(fā)模式,云開發(fā)模式具備成本低、效率高、門檻低等優(yōu)勢,具體區(qū)別見下表。92c0bf30-0da6-11ee-962d-dac502259ad0.png

①開發(fā)流程

HarmonyOS 應用端云一體化開發(fā)流程如下圖所示:

92ca6ecc-0da6-11ee-962d-dac502259ad0.jpg

②創(chuàng)建端云一體化開發(fā)工程

新建原子化服務工程:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/agc-harmonyos-clouddev-createproject-0000001443369760-V3#section15198822192610
工程初始化配置:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/agc-harmonyos-clouddev-createproject-0000001443369760-V3#section1938317533494
端云一體化開發(fā)工程介紹:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/agc-harmonyos-clouddev-createproject-0000001443369760-V3#section20250910164411

③開發(fā)云工程

開發(fā)云函數(shù):
https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/agc-harmonyos-clouddev-cloudfunctions-0000001493089797-V3
開發(fā)云數(shù)據(jù)庫:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/agc-harmonyos-clouddev-clouddb-0000001443049860-V3

④部署云工程

部署云工程:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/agc-harmonyos-clouddev-deploy-0000001493209765-V3

小結(jié):了解這些端云一體化開發(fā)知識點后,下面圍繞舒爾特方格游戲,在云數(shù)據(jù)庫里設計卡片表結(jié)構(gòu)和成績表結(jié)構(gòu),然后再編寫相關云函數(shù),并在本地測試通過后,再測試遠程,最后在元服務業(yè)務邏輯調(diào)用云函數(shù)。

云數(shù)據(jù)庫開發(fā)講解

①objecttype 創(chuàng)建

展開 CloudProgram→clouddb→objecttype 右擊 objecttype 目錄,創(chuàng)建→Cloud DB Object Type 輸入 Object Type Name 為 t_form,點擊確認。

修改內(nèi)容如下:
{
"fields":[
{
"isNeedEncrypt":false,
"fieldName":"formId",
"notNull":true,
"belongPrimaryKey":true,
"fieldType":"String"
},
{
"isNeedEncrypt":false,
"fieldName":"formName",
"notNull":true,
"defaultValue":"",
"belongPrimaryKey":false,
"fieldType":"String"
},
{
"isNeedEncrypt":false,
"fieldName":"dimension",
"notNull":true,
"defaultValue":"0",
"belongPrimaryKey":false,
"fieldType":"Integer"
}
],
"indexes":[
{
"indexName":"formId",
"indexList":[{"fieldName":"formId","sortType":"ASC"}]
}
],
"objectTypeName":"t_form",
"permissions":[...]
}

展開 CloudProgram→clouddb→objecttype 右擊 objecttype 目錄,創(chuàng)建→Cloud DB Object Type 輸入 Object Type Name 為 t_score,點擊確認。

修改內(nèi)容如下:
{
"fields":[
{
"isNeedEncrypt":false,
"fieldName":"formId",
"notNull":true,
"belongPrimaryKey":true,
"fieldType":"String"
},
{
"isNeedEncrypt":false,
"fieldName":"matrixNum",
"notNull":true,
"defaultValue":"",
"belongPrimaryKey":false,
"fieldType":"String"
},
{
"isNeedEncrypt":false,
"fieldName":"bestScore",
"notNull":true,
"defaultValue":"0",
"belongPrimaryKey":false,
"fieldType":"Double"
}
],
"indexes":[
{
"indexName":"formId",
"indexList":[{"fieldName":"formId","sortType":"ASC"}]
}
],
"objectTypeName":"t_score",
"permissions":[...]
}

②dataentry 創(chuàng)建

展開 CloudProgram→clouddb→dataentry 右擊 dataentry 目錄,創(chuàng)建→Cloud DB Data Entry 這里先選擇上面創(chuàng)建的 Object Type 為 t_form,再輸入 Data Entry Name 為 form_data,點擊確認。

修改內(nèi)容如下:

{
"cloudDBZoneName":"widgetCard",
"objectTypeName":"t_form",
"objects":[
{
"formId":"x000001",
"formName":"卡片1",
"dimension":2
}
]
}
展開 CloudProgram→clouddb→dataentry 右擊 dataentry 目錄,創(chuàng)建→Cloud DB Data Entry 這里先選擇上面創(chuàng)建的 Object Type為t_score,再輸入 Data Entry Name 為 score_data,點擊確認。

修改內(nèi)容如下:

{
"cloudDBZoneName":"widgetCard",
"objectTypeName":"t_score",
"objects":[
{
"formId":"x000001",
"matrixNum":"3x3",
"bestScore":2.234
}
]
}
小結(jié):其實 dataentry 文件可以不創(chuàng)建,這里對兩個表都初始化了一條數(shù)據(jù),是方便下面的調(diào)用使用,云數(shù)據(jù)庫就是定義好表結(jié)構(gòu)、權(quán)限配置就可以,數(shù)據(jù)的添加、修改、刪除、查詢都可以通過云函數(shù)來完成。

云函數(shù)開發(fā)講解

①卡片云函數(shù)創(chuàng)建

展開 CloudProgram→cloudfunctions 右擊 cloudfunctions 目錄,創(chuàng)建→Cloud Function 輸入 Cloud Function Name 為 form-func,點擊確認。

卡片云函數(shù)里包含了增刪改查操作,所以在 form-func 下,創(chuàng)建不同的文件夾來區(qū)分,目錄結(jié)構(gòu)如下:

92d57470-0da6-11ee-962d-dac502259ad0.png首先說一下與云數(shù)據(jù)庫交互文件,t_form.js 對應的是云數(shù)據(jù)庫實體類,如各屬性的 get 和 set 方法,之前 FA 模式下的 DevEco Studio 端云一體化開發(fā),支持直接調(diào)用云數(shù)據(jù)庫。現(xiàn)在 Stage 模式下的 DevEco Studio 端云一體化開發(fā),還不支持直接調(diào)用云數(shù)據(jù)庫,通過云函數(shù)來調(diào)用。所以這里的云數(shù)據(jù)庫實體類,除了屬性的 get 和 set 方法外,還要手工添加一些方法。

如卡片實例體類:

classt_form{
getFieldTypeMap(){
letfieldTypeMap=newMap();
fieldTypeMap.set('formId','String');
fieldTypeMap.set('formName','String');
fieldTypeMap.set('dimension','Integer');
returnfieldTypeMap;
}

getClassName(){
return't_form';
}

getPrimaryKeyList(){
letprimaryKeyList=[];
primaryKeyList.push('formId');
returnprimaryKeyList;
}

getIndexList(){
letindexList=[];
returnindexList;
}

getEncryptedFieldList(){
letencryptedFieldList=[];
returnencryptedFieldList;
}

//setandget
setFormId(formId){this.formId=formId;}
getFormId(){returnthis.formId;}
setFormName(formName){this.formName=formName;}
getFormName(){returnthis.formName;}
setDimension(dimension){this.dimension=dimension;}
getDimension(){returnthis.dimension;}
}

module.exports={t_form}

CloudDBZoneWrapper 操作云數(shù)據(jù)庫,這里主要列舉構(gòu)造函數(shù)和增加方法內(nèi)容:

import*asclouddbfrom'@agconnect/database-server';
import{t_formasFormBean}from'./models/t_form';
import*asagconnectfrom'@agconnect/common-server';

constZONE_NAME="widgetCard";

exportclassCloudDBZoneWrapper{
logger;
cloudDbZone;

constructor(credential,logger){
this.logger=logger;
try{
//初始化AGCClient
letagcClient;
try{
agcClient=agconnect.AGCClient.getInstance();
}catch{
agconnect.AGCClient.initialize(credential);
agcClient=agconnect.AGCClient.getInstance();
}
//初始化AGConnectCloudDB實例
letcloudDbInstance;
try{
cloudDbInstance=clouddb.AGConnectCloudDB.getInstance(agcClient);
}catch{
clouddb.AGConnectCloudDB.initialize(agcClient);
cloudDbInstance=clouddb.AGConnectCloudDB.getInstance(agcClient);
}
//創(chuàng)建CloudDBZoneConfig配置對象,并設置云側(cè)CloudDBzone名稱,打開CloudDBzone實例
constcloudDBZoneConfig=newclouddb.CloudDBZoneConfig(ZONE_NAME);
this.cloudDbZone=cloudDbInstance.openCloudDBZone(cloudDBZoneConfig);
}catch(err){
logger.error("xx[form-func]CloudDBZoneWrapperinitCloudDBZoneWrappererror:"+err);
}
}

asyncinsert(addForm){
if(!this.cloudDbZone){
this.logger.error("xx[form-func]CloudDBZoneWrapper->insertCloudDBClientisnull,tryre-initializeit");
}

try{
letres=awaitthis.cloudDbZone.executeUpsert(addForm);
this.logger.info("xx[form-func]CloudDBZoneWrapper->insertInsert"+res+"recordssuccess");
}catch(error){
this.logger.error("xx[form-func]CloudDBZoneWrapper->insertexecuteInsertaddressRecordsfailed"+error);
}
}
}

新增卡片函數(shù) form-insert,關鍵代碼如下:

import{CloudDBZoneWrapper}from'../clouddb/CloudDBZoneWrapper.js';
import*asUtilsfrom'../utils/Utils.js';

exportconstmyHandler=asyncfunction(event,context,callback,logger){
constcredential=Utils.getCredential(context,logger);
try{
constcloudDBZoneWrapper=newCloudDBZoneWrapper(credential,logger);
letformObj=cloudDBZoneWrapper.getForm(event);
awaitcloudDBZoneWrapper.insert(formObj);

callback({
ret:{code:0,desc:"SUCCESS"},
});
}catch(err){
logger.error("xx[form-func]insertfuncerror:"+err.message+"stack:"+err.stack);
callback({
ret:{code:-1,desc:"ERROR"},
});
}
};

卡片云函數(shù)主入口,關鍵代碼如下:

letmyHandler=asyncfunction(event,context,callback,logger){
letoperation;
letparams;

logger.info("xxenterformfuncwithoperation"+event.operation);
operation=event.body?JSON.parse(event.body).operation:event.operation;
params=event.body?JSON.parse(event.body).params:event.params;

switch(operation){
case"query":
query.myHandler(params,context,callback,logger);
break;
case"queryById":
queryById.myHandler(params,context,callback,logger);
break;
case"insert":
insert.myHandler(params,context,callback,logger);
break;
case"update":
update.myHandler(params,context,callback,logger);
break;
case"delete":
deleteByObj.myHandler(params,context,callback,logger);
break;
default:
callback({
ret:{code:-1,desc:"nosuchfunction"},
});
}

};
module.exports.myHandler=myHandler;

②成績云函數(shù)創(chuàng)建

展開 CloudProgram→cloudfunctions 右擊 cloudfunctions 目錄,創(chuàng)建→Cloud Function 輸入 Cloud Function Name 為 score-func,點擊確認,。成績云函數(shù)里包含了增刪改查操作,所以在 score-func 下,創(chuàng)建不同的文件夾來區(qū)分。

目錄結(jié)構(gòu)如下:

92e34546-0da6-11ee-962d-dac502259ad0.png成績表云數(shù)據(jù)庫操作與卡片操作一樣,這里就不在重復了,可以參考一下上面卡片操作方法就可以。

云函數(shù)本地與遠程調(diào)試

①Run 模式啟動調(diào)試

右擊“cloudfunctions”目錄,選擇“Run Cloud Functions”。查看“Run”面板。如果出現(xiàn)“Cloud Functions loaded successfully”,表示所有函數(shù)已成功加載到本地運行的 HTTP Server 中,并生成對應的 POST URL。在菜單欄選擇“Tools > CloudDev > Cloud Functions Requestor”,使用 Cloud Functions Requestor 觸發(fā)函數(shù)調(diào)用。在彈出的“Cloud Functions Requestor”面板,填寫觸發(fā)事件參數(shù)。點擊“Save”,可保存當前觸發(fā)事件。

②Debug 模式啟動調(diào)試

右擊“cloudfunctions”目錄,選擇“Run Cloud Functions”。查看 Console 面板。如果出現(xiàn)“Cloud Functions loaded successfully”,表示函數(shù)成功加載到本地運行的 HTTP Server 中,并生成對應的 POST URL。如需設置斷點調(diào)試,在函數(shù)代碼中選定要設置斷點的有效代碼行,在行號后單擊鼠標左鍵設置斷點,設置斷點后,調(diào)試能夠在斷點處中斷,并高亮顯示該行。在菜單欄選擇“Tools > CloudDev > Cloud Functions Requestor”,使用 Cloud Functions Requestor 觸發(fā)函數(shù)調(diào)用。在彈出的“Cloud Functions Requestor”面板,填寫觸發(fā)事件參數(shù)。點擊“Save”,可保存當前觸發(fā)事件。

③自定義 Run/Debug 配置

在菜單欄選擇“Run > Edit Configurations”。在“Run/Debug Configurations”窗口,點擊+,選擇“Cloud Functions”,新增一個 Run/Debug 配置。

自定義 Run/Debug 配置,完成后點擊“OK”。

· Name:Run/Debug配置的名稱,如“functions-custom1”。
· Server Port:HTTP服務端監(jiān)聽端口。默認為“18090”,自定義端口號建議大于1024。勾選“Autoincrement”表示如當前端口被占用則端口號自動加“1”。
· Environment variables:函數(shù)運行的環(huán)境變量,為key-value形式。
點擊“Edit environment variables”按鈕,在“Environment Variables”彈窗中點擊“+”添加一個環(huán)境變量,然后點擊“OK”。添加成功后,您便可以將變量配置信息傳入到函數(shù)執(zhí)行環(huán)境中,用于函數(shù)運行時讀取。
選擇剛剛自定義的 Run/Debug 配置,分別點擊 Run 或 Debug。后續(xù)調(diào)試步驟與默認配置下的調(diào)試步驟一致,請分別參見Run 模式啟動調(diào)試Debug 模式啟動調(diào)試

④測試

實現(xiàn)云函數(shù)調(diào)用云數(shù)據(jù)庫,需要您先部署云工程,云端才會有相關數(shù)據(jù)及環(huán)境變量。同時,云函數(shù)為訪問云數(shù)據(jù)庫使用了“PROJECT_CREDENTIAL”環(huán)境變量,部署函數(shù)到 AGC 云端時,云端會自動配置好“PROJECT_CREDENTIAL”以運行環(huán)境變量。但在本地調(diào)試函數(shù)時,需要您手動將“PROJECT_CREDENTIAL”環(huán)境變量添加到 Run/Debug 配置中。

否則,函數(shù)調(diào)試代碼執(zhí)行會因獲取不到“PROJECT_CREDENTIAL”環(huán)境變量而中斷。

92ec2d1e-0da6-11ee-962d-dac502259ad0.png

從 AGC 獲取的“PROJECT_CREDENTIAL”環(huán)境變量添加到調(diào)試配置中。您也可以添加您需要的其他環(huán)境變量。

92fcb45e-0da6-11ee-962d-dac502259ad0.png

9306e578-0da6-11ee-962d-dac502259ad0.png

添加完環(huán)境變量后,啟動函數(shù),再點擊 Trigger,就可以看到成功返回數(shù)據(jù)了。

9312f3fe-0da6-11ee-962d-dac502259ad0.png

代碼講解

①云函數(shù)調(diào)用公共類

DatabaseUtils.ets 云函數(shù)操作類部分代碼如下:

exportclassDatabaseUtils{

asynccallWithParams(context,trigger,operation,params){
awaitgetAGConnect(context);
letbody={
"operation":operation,
"params":params
}

try{
letfunctionCallable=agconnect.function().wrap(trigger);
letfunctionResult=awaitfunctionCallable.call(body);
returnfunctionResult.getValue();
//returnfunctionResult.getValue().result;
}
catch(err){
return{
"ret":{"code":-1,"desc":"ERROR"}
}
}
}

asyncinvoke(context:any,trigger?:string,operation?:string,params?:object){
console.info(CommonConstants.DATABASE_TAG,'xxinvokeparams:'+JSON.stringify(params))
returnawaitthis.callWithParams(context,trigger,operation,params);
}

/**
*插入卡片數(shù)據(jù)。
*
*@param{Form}Form表單實體。
*@param{DataRdb.RdbStore}RDB存儲RDB數(shù)據(jù)庫。
*@return返回操作信息。
*/
asyncinsertForm(context:any,form:Form){
letres=awaitthis.invoke(context,Triggers.FormFunc,RequestType.Insert,form);
console.info(CommonConstants.DATABASE_TAG,'xxinsertFormresult:'+JSON.stringify(res));
}
......
}

②卡片 Ability 調(diào)用公共類

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;

//卡片信息
letform:Form=newForm();
form.formId=formId;
form.formName=formName;
form.dimension=dimensionFlag;

//保存卡片信息到數(shù)據(jù)庫
DatabaseUtils.insertForm(this.context,form);
//獲取最優(yōu)成績
getScoreById(this.context,dimensionFlag,formId);

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

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

③主界面調(diào)用公共類

@Entry
@Component
structIndex{
@StatescoreDataList:Array=[]

aboutToAppear(){
//請求通知欄權(quán)限
this.requestNotification();
//更新卡片信息
DatabaseUtils.updateForms(getContext(this));
//獲取成績歷史記錄
this.getScoreListData()
}
onPageShow(){
//更新卡片信息
DatabaseUtils.updateForms(getContext(this));
//獲取成績歷史記錄
this.getScoreListData()
}
//獲取成績歷史數(shù)據(jù)
getScoreListData(){
DatabaseUtils.getScoreListData(getContext(this))
.then((res)=>{
this.scoreDataList=res;
//發(fā)送通知
NotificationUtils.sendNotifications(this.scoreDataList[0].totalBestScore);
}).catch((error)=>{
console.error(CommonConstants.MAIN_PAGE_TAG,'xxaboutToAppearoronPageShowgetScoreListDataerror'+JSON.stringify(error));
});
}

build(){...}
}

總結(jié)

通過把之前小游戲元服務-關系型數(shù)據(jù)庫修改為使用 Serverless 云函數(shù)、云數(shù)據(jù)庫,學習到不少知識,開始時不懂得怎么使用云函數(shù)調(diào)用云數(shù)據(jù)庫,一邊參考官方商城模板,一邊測試,到使用到這個小游戲上,。總結(jié)這個項目用到以下知識點:
  • 使用 notification 發(fā)布通知。
  • 使用端云一體化開發(fā)、開發(fā)云函數(shù)、開發(fā)云數(shù)據(jù)庫。
  • 使用 FormExtensionAbility 創(chuàng)建、更新、刪除元服務卡片。

備注:資源文件是我在學習云函數(shù)調(diào)用云數(shù)據(jù)庫寫的一個簡單實例,有云函數(shù)調(diào)用云數(shù)據(jù)庫需求的小伙伴可以下載下來參考一下。


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

    關注

    7

    文章

    3733

    瀏覽量

    64169
  • 模板
    +關注

    關注

    0

    文章

    108

    瀏覽量

    20542
  • HarmonyOS
    +關注

    關注

    79

    文章

    1954

    瀏覽量

    29897

原文標題:HarmonyOS云開發(fā):舒爾特方格游戲

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

收藏 人收藏

    評論

    相關推薦

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

    方格游戲,是注意力訓練方法之一,可以幫助孩子糾正上課分心走神、回家做作業(yè)拖拉毛病,但不能貪玩哦,玩多了,對眼睛,視力不好。
    的頭像 發(fā)表于 06-06 09:27 ?944次閱讀
    <b class='flag-5'>HarmonyOS</b> 3.1上實現(xiàn)<b class='flag-5'>游戲</b>萬能卡片

    HarmonyOS應用兼容穩(wěn)定性測試

    ,使用華為開發(fā)者帳號進行登錄。 點擊界面上的“從這里開始”按鈕,進入到控制臺。 選擇或者創(chuàng)建一個項目,如果新創(chuàng)建一個項目,注意選擇 HarmonyOS。 進入項目空間,在左側(cè)導航欄中選擇 測試服務
    發(fā)表于 12-25 10:56

    HarmonyOS應用性能與功耗測試

    ,進入到控制臺。 選擇或者創(chuàng)建一個項目,如果新創(chuàng)建一個項目,注意選擇 HarmonyOS。 進入項目空間,在左側(cè)導航欄中選擇 測試服務 > HarmonyOS 測試 ,進入
    發(fā)表于 12-26 16:39

    36小時開發(fā)-辦公之便簽打印機

    辦公之便簽打印機》為例,告訴你他們是如何在短時間內(nèi)完成參賽項目的原型,大家為什么都鐘愛于機智,選擇機智完成智能硬件產(chǎn)品開發(fā)。這兩位好基友就是本次大賽的《辦公之便簽打印機》選手,是
    發(fā)表于 12-27 15:03

    從零開發(fā)HarmonyOS(鴻蒙)運動手表小游戲——數(shù)字華容道

    HarmonyOS(鴻蒙)運動手表第二個小游戲app——數(shù)字華容道前言概述正文創(chuàng)建項目實現(xiàn)開始界面的布局實現(xiàn)數(shù)字的隨機打亂和方格的移動實現(xiàn)計時器、重新開始和游戲成功心得體會結(jié)語源代碼前
    發(fā)表于 11-24 08:57

    HarmonyOS應用開發(fā)對角數(shù)字游戲練習

    一、效果與說明這是一個數(shù)字游戲項目,輸入1~9數(shù)字到方格中完成橫豎對角線相加之和都為15。如下圖 二、部分代碼展示jsexport default { data: {result: '將1~9數(shù)字
    發(fā)表于 06-07 14:36

    直播預告丨Hello HarmonyOS進階課程第三課——游戲開發(fā)實踐

    HarmonyOS進階系列應用篇第三課《游戲開發(fā)實踐》直播如約而至。本節(jié)課,華為HDE徐禮文老師將帶領大家探討HarmonyOS游戲場景,
    發(fā)表于 05-16 11:45

    【學習打卡】基于ArkUI框架的方格游戲

    項目開發(fā)介紹方格游戲有主界面和游戲界面兩個頁
    發(fā)表于 07-04 00:26

    每日推薦 | 基于RK2206的電子秤,OpenHarmony操作系統(tǒng)的智能停車場

    】基于ArkUI框架的方格游戲推薦理由:
    發(fā)表于 07-05 10:17

    HarmonyOS應用端一體化開發(fā)主要流程

    圖示 *附件:HarmonyOS應用端一體化開發(fā)主要流程.docx
    發(fā)表于 05-19 14:27

    超短波調(diào)頻廣播_吳

    電子發(fā)燒友網(wǎng)為大家免費提供吳編著的超短波調(diào)頻廣播,希望對大家有所幫助!
    發(fā)表于 11-29 16:48 ?0次下載
    超短波調(diào)頻廣播_吳<b class='flag-5'>云</b><b class='flag-5'>舒</b>

    HarmonyOS如何玩 3d 游戲

    總有網(wǎng)友期待 HarmonyOS 什么時候能出 3d 游戲,今天就教你寫一個能玩的 3d 游戲。
    的頭像 發(fā)表于 01-04 14:23 ?2172次閱讀

    行空板Python入門教程第七課:方格游戲

    方格訓練法,是全世界范圍內(nèi)最簡單,最有效也是最科學的注意力訓練方法之一。讓我們一起用DFRobot行空板設計一個
    的頭像 發(fā)表于 06-02 15:45 ?1930次閱讀
    行空板Python入門教程第七課:<b class='flag-5'>舒</b><b class='flag-5'>爾</b><b class='flag-5'>特</b><b class='flag-5'>方格</b>小<b class='flag-5'>游戲</b>

    HarmonyOS攜手庫洛游戲推動《戰(zhàn)雙帕彌什》鴻蒙原生應用開發(fā)

    4 月 22 日,華為宣布庫洛游戲的《戰(zhàn)雙帕彌什》正式啟動鴻蒙原生應用開發(fā)項目,與 HarmonyOS NEXT 鴻蒙星河版的方舟引擎展開深度合作,旨在提升游戲的運行流暢度,為玩家提供
    的頭像 發(fā)表于 04-22 15:21 ?432次閱讀

    SHUREPGX2無線話筒手持發(fā)射器原理圖

    SHURE ?PGX2無線話筒手持發(fā)射器原理圖附印制板圖
    發(fā)表于 10-14 11:40 ?0次下載