Hongmengは1024のプレイに焦点を当てたゲームを配布しました

Hongmengは1024のプレイに焦点を当てたゲームを配布しました

[[430078]]

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

I. はじめに

1024 Focus Together ゲームは、画面上に N x N の正方形 (4x4 など、合計 16 個) を描き、1 から順に生成された数字 (1 から 16 など、合計 16 個の数字) で正方形を埋めるゲームです。ゲームをプレイする際、プレイヤーは指を使って、小さい数字から大きい数字の順番(1 から 16 など)の位置を指し示す必要があります。すべての数字を押すと、使用した時間(秒単位)が表示されます。かかる時間が短いほど、集中力が高まります。注意力を集中、分散、制御する能力を養うことができます。視覚範囲を広げる;ビデオを高速化する。視覚の安定性、人物の識別、方向検索能力が向上します。このゲームは、注意力をトレーニングするための最もシンプルで効果的かつ科学的な方法です。目標数値を探すときは、細心の注意を払う必要があります。この短時間で高強度の集中プロセスを繰り返し練習することで、脳の集中機能が継続的に強化され、向上します。注目度はどんどん高まっています。

同時に、1024 Focus Together ゲームでは Hongmeng 分散コラボレーション テクノロジーが採用されています。子どもの集中力や持久力を鍛える際は、大人も一緒にトレーニングに付き添うことができます。 Hongmeng システムの携帯電話が 2 台、または携帯電話とタブレットがあれば、大人も子供も同時にゲームを楽しむことができます。たとえば、大人が携帯電話の 1 台でいくつかの小さな数字を押してから、分散コラボレーション アイコンをクリックして、もう一方の携帯電話で 1024 Focus Together ゲームを開きます。大人が押さなかった数字を子供は押し続けることができ、最後に使用した時間が表示されます。

2. 達成効果

開発ツール環境でのビデオ: https://www.bilibili.com/video/BV1B34y1m7M5?spm_id_from=333.999.0.0

携帯電話+携帯電話環境でのビデオ:https://www.bilibili.com/video/BV1kh411b7QM?spm_id_from=333.999.0.0

携帯電話 + タブレット環境でのビデオ: https://www.bilibili.com/video/BV1ov411M7sq?spm_id_from=333.999.0.0


3. プロジェクトを作成する

DevEco-Studio 開発ツールの最新バージョンがインストールされているものとします。 「ファイル」->「新規」->「新しいプロジェクト」をクリックすると、「HarmonyOS プロジェクトの作成」ウィンドウがポップアップ表示されます。ここでは、空の Java テンプレートを選択します。前のビデオ再生の例では、JS を使用してインターフェースを記述しました。このゲームインターフェースは Java で書かれています。 JS を使用すると、インターフェースの記述が速くなり、デバッグも速くなります。




4. メインインターフェースの開発

ソース コードを示す前に、まずどの JAVA コンポーネントが使用されているかを紹介します。

DirectionalLayout、TableLayout、DependentLayout、Button、Image、Text、ListContainer、CommonDialog など、Java UI リファレンス ドキュメントを参考にしてお好みのアプリケーションを作成できます。

まず、パブリック クラスの Java コードを紹介します。これらのパブリック クラスを使用すると、パブリック クラス ファイルを直接コピーし、将来同様の機能を備えたアプリケーションを作成するときに使用できます。

LogUtil ログ印刷クラス:

  1. パブリッククラスLogUtil {
  2. プライベート静的最終 HiLogLabel LABEL_LOG = 新しい HiLogLabel(3, 0xD000F00, "1024Game" );
  3. プライベート静的最終文字列 LOG_FORMAT = "%{public}s: %{public}s" ;
  4.  
  5. プライベートLogUtil() {
  6.  
  7. }
  8. 公共 静的voidデバッグ(Stringクラス名、Stringメッセージ) {
  9. HiLog.debug(LABEL_LOG、LOG_FORMAT、クラス名、メッセージ);
  10. }
  11. 公共 静的void情報(文字列クラス名、文字列メッセージ) {
  12. HiLog.info(LABEL_LOG、LOG_FORMAT、クラス名、メッセージ);
  13. }
  14. 公共 静的void info(Class<?> classType, final String format, Object... args) {
  15. 文字列 buffMsg = String.format(Locale.ROOT, format, args);
  16. HiLog.info(LABEL_LOG、LOG_FORMAT、classType == null ? "null" : classType.getSimpleName()、buffMsg);
  17. }
  18. 公共 静的voidエラー(文字列タグ、文字列メッセージ) {
  19. HiLog.error(LABEL_LOG、LOG_FORMAT、タグ、メッセージ);
  20. }
  21. }

SelectDeviceDialog デバイス選択ダイアログボックス:

  1. パブリッククラスSelectDeviceDialog{
  2. プライベート静的最終int DIALOG_WIDTH = 840;
  3. プライベート静的最終int DIALOG_HEIGHT = 900;
  4. プライベート CommonDialog commonDialog;
  5.  
  6. パブリックSelectDeviceDialog(Contextコンテキスト、List<DeviceInfo>デバイス、SelectResultListenerリスナー) {
  7. initView(コンテキスト、デバイス、リスナー);
  8. }
  9. プライベート void initView(Context コンテキスト、List<DeviceInfo> デバイス、SelectResultListener リスナー) {
  10. // 共通ダイアログボックスを作成する
  11. commonDialog = 新しい CommonDialog(コンテキスト);
  12. // 配置を中央に設定
  13. commonDialog.setAlignment(LayoutAlignment.CENTER);
  14. // ダイアログのサイズを設定する
  15. commonDialog.setSize(DIALOG_WIDTH, DIALOG_HEIGHT);
  16. // ダイアログボックスを自動的に閉じるように設定する
  17. commonDialog.setAutoClosable( true );
  18. // XMLレイアウトファイルを読み込む
  19. コンポーネントダイアログレイアウト =
  20. LayoutScatter.getInstance(context).parse(ResourceTable.Layout_dialog_select_device, null false );
  21. // ダイアログの内容を設定する
  22. commonDialog.setContentCustomComponent(ダイアログレイアウト);
  23. // リストコンテナを見つける
  24. (dialogLayout.findComponentById(ResourceTable.Id_list_devices) のインスタンス ListContainer) {
  25. // リストコンテナオブジェクトを取得する
  26. ListContainer デバイスListContainer =
  27. (リストコンテナー) dialogLayout.findComponentById(ResourceTable.Id_list_devices);
  28. // デバイスリストアダプタ
  29. DevicesListAdapter devicesListAdapter = 新しい DevicesListAdapter(デバイス、コンテキスト);
  30. // デバイスリストコンテナアイテムプロバイダを設定する
  31. デバイスリストコンテナにアイテムプロバイダーを設定します。
  32. // デバイスリスト項目のクリックイベントを設定する
  33. devicesListContainer.setItemClickedListener((listContainer, コンポーネント, 位置, id) -> {
  34. //選択したデバイス情報をコールバックする
  35. リスナー.callBack(デバイス.get(位置));
  36. // ダイアログを閉じる
  37. 共通ダイアログを非表示にします。
  38. });
  39. }
  40. dialogLayout.findComponentById(ResourceTable.Id_cancel).setClickedListener(コンポーネント -> {
  41. // ダイアログを閉じる
  42. 共通ダイアログを非表示にします。
  43. });
  44. }
  45. //ダイアログを表示する
  46. パブリックボイドショー(){
  47. 共通ダイアログを表示します。
  48. }
  49. /**
  50. * 内部インターフェース、デバイス選択後のコールバックイベント
  51. */
  52. パブリックインターフェースSelectResultListener {
  53. void コールバック(デバイス情報デバイス情報);
  54. }
  55. }

DevicesListAdapter デバイス リスト アダプター:

  1. パブリッククラスDevicesListAdapterはBaseItemProviderを拡張します{
  2. // 0から添え字を始める
  3. プライベート静的最終int SUBSTRING_START = 0;
  4. // 終了添え字は4です
  5. プライベート静的最終int SUBSTRING_END = 4;
  6. //デバイス情報リスト
  7. プライベート List<DeviceInfo> deviceInfoList;
  8. // 現在のコンテキスト
  9. プライベートコンテキストコンテキスト;
  10.  
  11. // パラメータ付きコンストラクタ
  12. パブリックDevicesListAdapter(List<DeviceInfo> deviceInfoList、コンテキスト context) {
  13. this.deviceInfoList = デバイス情報リスト;
  14. this.context = コンテキスト;
  15. }
  16. @オーバーライド
  17. 公共 整数getCount() {
  18. deviceInfoList == nullを返しますか? 0 : デバイス情報リスト。サイズ();
  19. }
  20. @オーバーライド
  21. パブリックオブジェクトgetItem( int i) {
  22. 戻り値はオプションです。 (deviceInfoList.get(i))
  23. }
  24. @オーバーライド
  25. パブリックlong getItemId( int i) {
  26. iを返します
  27. }
  28. @オーバーライド
  29. パブリックコンポーネント getComponent( int i, コンポーネント コンポーネント, コンポーネントコンテナ コンポーネントコンテナ) {
  30. // デバイスビューの内部クラスを定義する
  31. ビューホルダー viewHolder = null ;
  32. // コンポーネントを定義する
  33. コンポーネント mComponent = コンポーネント;
  34. // コンポーネントが空の場合
  35. mComponent == null の場合{
  36. // デバイスリスト項目レイアウトXMLを見つける
  37. mComponent = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_device_list, null false );
  38. // デバイスビュークラスを初期化する
  39. ビューホルダー = 新しいビューホルダー();
  40. // コンポーネントレイアウトにデバイス名テキストコンポーネントが含まれているかどうかを判断します
  41. if (mComponent.findComponentById(ResourceTable.Id_device_name) インスタンスのテキスト) {
  42. // デバイス リスト項目レイアウト XML のデバイス名ファイル コンポーネントを取得し、それを内部クラス デバイス ビューのデバイス名属性キャッシュに割り当てます。
  43. viewHolder.devicesName = (テキスト) mComponent.findComponentById(ResourceTable.Id_device_name);
  44. }
  45. // コンポーネントレイアウトにデバイスIDテキストコンポーネントが含まれているかどうかを判断します
  46. if (mComponent.findComponentById(ResourceTable.Id_device_id) インスタンスのテキスト) {
  47. // デバイス リスト項目レイアウト XML のデバイス ID ファイル コンポーネントを取得し、それを内部クラス デバイス ビューのデバイス ID 属性キャッシュに割り当てます。
  48. viewHolder.devicesId = (テキスト) mComponent.findComponentById(ResourceTable.Id_device_id);
  49. }
  50. mComponent.setTag(viewHolder);
  51. }それ以外{
  52. // コンポーネントがnullでなく、タグに内部クラスデバイスビューが含まれている場合
  53. if (mComponent.getTag() インスタンスの ViewHolder) {
  54. // コンポーネントタグからデバイスビューを取得します
  55. viewHolder = (ViewHolder) mComponent.getTag();
  56. }
  57. }
  58. // デバイスビューが空でない場合
  59. ビューホルダーがnull場合
  60. // デバイス名の内容を設定する
  61. viewHolder.devicesName.setText(deviceInfoList.get(i).getDeviceName());
  62. 文字列デバイスID = deviceInfoList.get(i).getDeviceId();
  63. デバイスID = デバイスID。部分文字列(SUBSTRING_START, SUBSTRING_END) + "******"  
  64. +デバイスID.substring (デバイスID.length() - SUBSTRING_END);
  65. // デバイス名IDを設定する
  66. viewHolder.devicesId.setText(デバイスID);
  67. }
  68. mComponentを返します
  69. }
  70. /**
  71. * 内部クラス、デバイスビュー
  72. */
  73. プライベート静的クラス ViewHolder {
  74. //デバイス名
  75. プライベートテキストデバイス名;
  76. // デバイスID
  77. プライベートテキストデバイスID;
  78. }
  79. }

MainAbilitySlice メインインターフェース関数の説明:

メイン インターフェイスの主な機能は、テーブル レイアウトを使用して、3x3、4x4、5x5、6x6、7x7、8x8、9x9 の 7 つのボタンを生成することです。それらをクリックするとゲーム インターフェイスにジャンプし、対応する数字ボタンを初期化し、スライスを使用してジャンプしてパラメータを渡します。ソースコードには詳細なコメントがあります。興味のある方は gitee にアクセスしてソースコードを閲覧できます。

PlayAbilitySliceゲームインターフェース機能の説明:

ゲーム インターフェイスの主な機能は、テーブル レイアウトを使用して、対応するメイン インターフェイスから渡されるパラメーター ボタンを生成することです。数字はランダムな順序で表示され、GameServiceAbility ゲーム サービスは分散協調方式で呼び出されます。各数字ボタンをクリックすると、イベントをサブスクライブすることで現在の数字と関連する変数が受信され、対応するデータが更新されます。ソースコードには詳細な注釈が付いています。関心のあるパートナーは、gitee にアクセスしてソース コードを表示できます。

GameServiceAbilityゲームサービスの説明:

ゲーム サービスの主な機能は、リクエストがアビリティに対するものである場合、パラメータを受信した後、他のインターフェイスに流れてパラメータを渡すことです。その他のリクエストの場合は、パラメータを受け取った後、パブリック イベントを通じて公開され、このイベントをサブスクライブする Ability がデータを更新できるようになります。ソースコードには詳細なコメントがあります。関心のあるパートナーは、gitee にアクセスしてソース コードを表示できます。

今のところはこれですべてです。 config.json ファイルで権限を設定することを忘れないでください。モジュールの下に追加します。

  1. 「必要な権限」 : [
  2. {
  3. 「名前」 : 「ohos.permission.GET_DISTRIBUTED_DEVICE_INFO」  
  4. },
  5. {
  6. 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」  
  7. },
  8. {
  9. 「名前」 : 「ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE」  
  10. },
  11. {
  12. 「名前」 : 「ohos.permission.READ_USER_STORAGE」  
  13. },
  14. {
  15. 「名前」 : 「ohos.permission.WRITE_USER_STORAGE」  
  16. },
  17. {
  18. 「名前」 : 「ohos.permission.GET_BUNDLE_INFO」  
  19. }
  20. ]

同時に、ゲーム インターフェースの入り口でも動的な認証が必要です。

  1. プライベート静的void grantPermission(コンテキストコンテキスト) {
  2. LogUtil.info(TAG, "grantPermission" );
  3. (context.verifySelfPermission(DISTRIBUTED_DATASYNC) != IBundleManager.PERMISSION_GRANTED) の場合 {
  4. コンテキストがDISTRIBUTED_DATASYNCである場合には、
  5. context.requestPermissionsFromUser(新しい文字列[] {DISTRIBUTED_DATASYNC}、PERMISSION_CODE);
  6. }
  7. }
  8. }

V. 結論

興味のある方はソースコードをダウンロードして確認してみてください。プロジェクトコードは基本的にコメント化されています。ゲームのルールはとても簡単です。インターフェース上の数字を順番にクリックするだけです。時間が短いほど、注意力が集中します。ソースコードはgiteeコードクラウドに同期されます。

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

<<:  HUAWEI CLOUDはイノベーションと開発を加速し、金融業界のインテリジェンス化を支援します

>>:  ついに誰かが分散システムアーキテクチャを明確に説明した

推薦する

優れたWeiboプロモーション記事の3つの特徴

記事を書いた後、Weibo プラットフォームで共有する予定です。自動プラグインを使用して同期しますか...

サイトのインクルードを通じてウェブサイトを体験し、レイアウトする

サイトは、当社のウェブマスターが最もよく使用するツールです。このツールを使用すると、当社のウェブサイ...

カスタム ISO VPS 販売業者: Windows のトラブルシューティングを可能にする安価な VPS

Hostcat は、多くの安価な VPS とカスタム ISO をサポートする多くの VPS を導入し...

ウォルマート テンセント クラウド サーバーレス アプリケーションを実践し、消費者のショッピング体験を完全に保証

小売業に携わるには、中国ほど適した場所はなく、今ほど適した時期もありません。 1996年、国際小売大...

真のプライベートクラウド ≒ パブリッククラウド

真のプライベートクラウドとプライベートクラウド「真のプライベート クラウド」と「プライベート クラウ...

SEO 引用の解釈: 詳細が成功と失敗を決定する方法

SEO 業界には、「コンテンツは王、外部リンクは皇帝」や「良質なコンテンツ、幅広い外部リンク」、「実...

Douyu Liveは本当に停滞しているのか?

ゲームライブストリーミング分野での長年にわたる深い開拓を経て、2大ゲームライブストリーミングプラット...

IoT、エッジコンピューティング、AIプロジェクトが企業にもたらす利益

[[385209]]ビル・ホームズは、象徴的なフェンダー・ストラトキャスターとテレキャスターのギター...

#推奨# BandwagonHost VPSはプライベートネットワーク機能を提供し、プライベートネットワークトラフィックは無料です

BandwagonHost は、同じコンピュータ ルーム内の VPS 間でイントラネットを確立できる...

初心者の SEO 担当者の皆さん、フォーラム署名の効果は本当にあなたが思っているほど良いのでしょうか?

1か月前にSEOを学び始めてから1か月以上が経ちました。私がやっていることは、ほとんどオリジナルの記...

周春良が新しいインフラストラクチャー、クラウドコンピューティングについて説明

参照:中国情報通信研究院が発表した「グローバルデジタルガバナンス白書(2020年)」、 「グローバル...

海外「独立サーバー」レンタルのススメ:安い・安い・もっとお得に!

この投稿は主に海外サーバー(海外の低価格サーバー、超格安サーバー)を収集しており、コアはより人気のあ...

マネージド サービス プロバイダーはクラウド コンピューティングのコストを削減できますか?

Cloud Solutions Architect は、特にクラウド コストの観点から、マネージド ...

インダストリアルクラウドがイノベーションの基盤を築く方法

クリーブランド クリニックの CIO である Matthew Kull 氏は、医療とマーケティングと...

オンライン実名制がSEO業界に与える影響

国務院:インターネット実名制は来年6月末までに実施されます! 一部の人々は依然として主要なフォーラム...