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

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

推薦する

優れたオンライン顧客サービスに必要な 8 つの基本的な特性

入札プロモーションのコストがますます高くなるにつれて、優れたオンラインカスタマーサービスがますます重...

3Wコーヒーで学べること: 広告費ゼロで強力なブランドを構築する方法

みなさんこんにちは。私は徐丹丹です。今日は口コミによるマーケティング手法をいくつか紹介します。3W ...

SEO初心者が知っておくべきこと:降格したウェブサイトを素早く復元する方法

これは古い質問ですが、答えは新しくなっています。SEOの世界では時代遅れではありません。結局のところ...

バーチャルオペレーター:現状、問題点、解決策

概要: ライセンスが発行されてから半年以上が経ち、仮想オペレーターのモバイル再販ビジネスは、萌芽から...

SEOロングテールキーワードについてどれくらい知っていますか

みなさんこんにちは、warsion です。今日は SEO トラフィックを増やす上で重要な要素であるロ...

電子商取引ウェブサイトのSEOを行う際に考慮すべき3つの要素について簡単に説明します。

検索エンジン最適化の継続的な発展により、インターネット上のさまざまな業界、企業、個人などが検索エンジ...

ウェブサイトをテストする際に注意すべき4つのポイント

1. サーバー応答コード301、302、404 など、SEO に影響を与える可能性のあるサーバー応答...

VMware のコンテナの将来を予測: VIC と Pivotal

コンテナ技術は数年前から存在しており、その原理はよく理解されています。コンテナは低コスト、高速、導入...

新旧のオンライン商人がオンラインで医薬品の購入に殺到。開心人は数千万ドルの資金を受け取る

半年にわたる静かな準備期間を経て、その高い収益性から新旧のオンライン小売業者から長い間切望されてきた...

ステージの設定方法とマイクロブログマーケティングの実行方法

私の周りの友人たちもどんどんインターネット起業家軍団に加わり、その多くがWeiboマーケティングの機...

調査によると、クラウドコンピューティングの移行コストは高くなる可能性がある

マッキンゼー・コンサルティングは最近、大企業がすべてのコンピューティングをクラウドコンピューティング...

Ban Kui: モバイル インターネット SEO がウェブマスターにもたらすチャンス

最新の統計によると、モバイルインターネットの発展速度は非常に驚異的です。スマートフォンの継続的な普及...

IaaS 向け初のクエリ言語「ZStack クエリ言語 (ZQL)」を発表

UI 作業を簡素化し、運用および保守担当者により柔軟なリソース クエリ方法を提供するために、ZSta...

エッジコンピューティングの台頭:データストレージをどう変えるか

エッジ コンピューティングは、データ転送コストと損失を削減することで、企業が効率的で信頼性の高いスト...

30日間でキーワードランキング1位を獲得した方法

私たち中小企業は、SEO を行う際に、特にウェブサイトを構築したばかりの最初の数か月間は非常に悩むこ...