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はイノベーションと開発を加速し、金融業界のインテリジェンス化を支援します

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

推薦する

変革の第一歩: クラウドへの移行

[51CTO.com からのオリジナル記事] クラウドに移行するかどうかをまだ議論しているとしたら、...

新人からウェブサイト運用・保守最適化スーパーバイザーに転身し、いくつかのテクニックを学びました

ご存知のとおり、インターネットの発展に伴い、あらゆる業界が熾烈な競争に直面しています。ウェブサイト最...

オンラインマーケティングの旅をサポートする適切な事前サイト計画

中国におけるインターネットの台頭に伴い、多くの伝統的な企業がインターネット プラットフォームに目を向...

IoTとクラウドコンピューティングの潜在的な関係を明らかにする

今日、周りを見渡すと、モノのインターネット (IoT) が家庭でも職場でも私たちの日常生活に大きな変...

bluehost - ドメインの新規登録または移管に 5.99 ドル

Bluehost は EIG に買収されて以来大きな動きはなく、データセンターも以前ほど良くないよう...

事例分析:アニメーションウェブサイトの最適化の扱い方

昨日、あるグループの友人から、ウェブサイトの最適化を手伝ってほしいと頼まれました。今は春節が近づいて...

クラウドコンピューティング市場を拡大し強化するには、現実的でなければならない

近年、我が国の経済活動の焦点は経済全体の安定にあります。産業基盤の優位性を活かし、産業チェーンのアッ...

劉強東、大学生への性的暴行容疑でネットで暴露される:劉強東の逮捕写真が暴露されたが、王思聡は微博の投稿を削除したのか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますA5 St...

Kafkaの独創的な高性能設計の1つ

[[420235]]これは、Kafka に関するシリーズ「Mastering MQ」の 4 番目の記...

SaaS導入において顧客が直面する主な課題

[[425760]] SaaS ビジネス モデルは、2021 年の開発トレンドになりました。データ処...

アリババCTOチェン・リー:テクノロジーはビジネスと社会システムのより包括的かつ深い統合をもたらす

「クラウドを総合的かつ徹底的に活用する時代が到来します。」 2022年の天猫双十一技術共有会で、アリ...

マイクロソフトの Windows XP が無料ではない理由

概要: Windows XP が廃止された後、Microsoft はなぜ人気の「無料の付加価値サービ...

Sharktech Los Angeles の「パブリック クラウド ホスティング」の簡単なレビュー

SharkTech のパブリック クラウド サーバーがオンラインになってからレビューを書く時間がなか...

ウェブマスターネットワークニュース:Weiboは今夜上場、QvodはQvodサーバーをシャットダウン

1. 薛曼子:昔はただ楽しみたかっただけだったが、今は妻や子供たちと顔を合わせるのに恥ずかしい「これ...

Webmaster.com からの日報: チケット取得ブラウザは正常に使用可能、Facebook は終了へ

1. 本日より、大晦日の列車のチケットをオンラインで購入できます。チケットブラウザは引き続き通常通り...