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

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

推薦する

外部リンクの開発履歴を振り返り、外部リンクの今後の開発方向を期待する

外部リンクは、ウェブサイトのキーワードランキングに影響を与える最も重要な要素の 1 つです。現在、ほ...

草の根フォーラム: オンライン採用がなぜすべての人を惹きつけるのか

インターネットはプラットフォームです。さまざまなリソースがそこに流入し、ネットワーク プラットフォー...

タレントステーションの経営戦略に関する考察

最近、A5のウェブサイトでタレントステーションに焦点を当てた記事をたくさん見ていて、とても嬉しいです...

新しく立ち上げたウェブサイトを最適化する方法

多くの新しいウェブマスターは、オンラインになった後にウェブサイトを最適化する方法を知らず、混乱し、困...

raksmartクラウドサーバーはどうですか?サンノゼ国際BGPラインクラウドサーバー評価

raksmartはどうですか? raksmartクラウドサーバーはどうですか? raksmart S...

商人は必ず読むべき:ダイヤモンドブース制作の秘密

店舗運営の鍵はトラフィックであることは誰もが知っています。日常生活に関わるトラフィックの大部分は、自...

詳細記事 | UCloud データベース製品の進化

先日、「UCloud User Open Day」の最新イベントが無事に開催されました。 UClou...

エッジコンピューティングが業務に与える影響

エッジ コンピューティングが運用と保守に与える影響は相互に関連しており、次のようにまとめることができ...

王通: SEOを素早く学んでお金を稼ぐ方法

SEO は自慢ではなく実践にかかっているので、2 年前に私は 100 を超える Web サイトを最適...

ミニプログラムインサイトレポート: ミニゲーム、ライフサービス、ショッピングのミニプログラムが爆発的な成長期に突入

ミニプログラムは昨年の発売以来、各方面から賞賛され、Apple からは禁止され、早期導入者からは批判...

ウェブマスターデイリーレポート:GoDaddyが攻撃され、オンラインビデオの価格が制限される

1. プログラミングコードホスティングウェブサイトから新たなオープンソース熱が生まれるソースコードは...

技術概要: 分散システムにおける一般的な同期メカニズム

高いデータ可用性を確保するには、分散システムでデータの複数のコピーを保存する必要があります。次の疑問...

CUVIP という名前は非科学的です。CUVIP≠China Unicom Premium Network ではありません。

目次1CUVIP は一般的にどのように理解されていますか? 2実際のCUVIPはどのようになっている...

有料ランキングについての考察

2011年全国人民代表大会と中国人民政治協商会議において、政治協商会議の委員がインターネット検索マー...

購入者を引き付けるキーワードを選択する

キーワードの調査と選択は、検索エンジン マーケティングの重要なステップです。ご存知のように、ほとんど...