Godotで作ったものをAppStoreに出してみました。そしたら申請通っちゃった!

 

そしてこの記事を書く前にさらにアップデートしたv1.1も今朝通ってリリースされてました。

 

なお、今は亡きv1.0の初期版はこの状態でした。

  • 起動するとすぐ戦闘
  • 音無し
  • フォント無し
  • 戦闘が終わるとリトライできる
  • 味方も敵もランダムでHPと攻撃力は固定

今朝リリースされたv1.1はさらにゲームっぽくなってます!

 

まず、オープニング作りました。ちゃんと曲も流れるよ!

 

 

 

曲はMusMusさまからお借りしました。

フォントは沙奈さまからお借りしました。

今後出てくる戦闘の効果音はSpringin'さまからお借りしました。

 

そしてオープニングが終わると…本当はチュートリアル的なものと戦闘を考えているけど、それは次のバージョンかな。

基本画面となるホーム画面を作成しました。

 

クエスト押すとv1.0の時と同様の戦闘がいきなり始まります。

ここも今後はクエスト選択できるようにします。

 

編成とガチャは工事中を表示。←これでも審査通るんだなって思いました。

設定には今のところ取り急ぎお借りした素材の著作権表示をしています。

(関係者様、念のため利用規約を読んで使わせていただいているつもりですが、もし問題あればお知らせください!)

 

v1.1の紹介でした!

 

次回以降に書きたいと思っているネタこちらです。

  • Appleストア配請はこのようにやったよ
  • mp3のループ再生の仕方
  • シーン遷移で考えたこと
  • 汎用的なサウンドシナリオを作ったよ
  • 世界観を作ったら世界が広がったよ
  • ChatGPTと世界観を相談したよ
    • 楽しいアイデアは生まれるのか
    • かっこいい中二病ワードを作ったよ
  • シナリオを書いたよ
  • Geminiでキャデザイン、ゲーム素材を作ったよ
  • ChatGPTとGeminiの使い分け

AI便利ですよね。開発の補佐はChatGPTにお願いしているのですが、画像はGeminiにお願いしています。今のところ。

アイコン画像も作ってもらいました。

 

 

指で投げて敵を倒す系のイメージで作ってもらいました。

タップするとスプラッシュ画面も出ます。

 

こんなキャラにするのかは全く予定していませんがw

個人的にはもっとかわいいキャラにしたいです。

 

そしてすぐ戦闘です。

 

 

お気付きですか? 右上に"Wave 1"とあります。ターン表示するようにしました。

そしてダメージは中心に近いほどダメージが大きく、遠いと小さいです。

 

あと中心に近い場合はクリティカルヒットします。

 

いつか動画も上げようと思いますが、効果音も出てます。Criticalの方は強そうな音。

 

あと、画面端にぶつかったら回転して後々にダメージ少し受ける感じにする予定です。

 

敵のいない所に投げると"miss"となります。

 

BGMや効果音は後々に自分で作るかもですが、今のところは著作権表示させてもらってフリー素材を使わせていただきます。

 

敵が出て攻撃して倒してクリアという一連の流れができました。

 

 

初期画面はこんな感じで敵が出て、下の4体のキャラを選んで攻撃すると敵のHPゲージが減って。

 

 

全員倒すとクリアになる。

 

下の4体のキャラ見てもらうと分かるけど、ちゃんと1回攻撃すると次のキャラが補充される。

アニメーションとかはまだこれから…。

ChatGPTと一緒にGodotでゲームを作ってみる企画。

今まではコトダマンの文字検索アプリを作ってましたが、ようやくゲームっぽいものを作り始めました。

 

ゲームシステムはどんなものかですが、概要はこんな感じ。

  • アニメーションはあまり必要ないRPGゲーム
  • RPGと言いつつもドラクエのようなキャラ移動はなく基本的に与えられた面を戦闘して進めていくスタイル
  • デッキ組んで戦闘を有利にするようにする、属性、バフ、デバフ、などを考えたりする良くあるやつ
  • キャラは多く用意する、目標5000体 ←できるのか? ひとまずGeminiさんに手伝ってもらって20体くらいは用意しました。
  • キャラは配布とガチャ産がある
  • ガチャは強めのキャラがいる
  • 課金要素は無い、ただ、課金っぽい要素がある ←重要!!
  • リアルマネーは使わないが、「あなたは実際は○○円使いましたよ」と表示される仕組みにする = 「借金」システム
  • 「借金」は公開される
    • このユーザすごいなーと思いつつも、「なんだ結局金で解決しているのか」が分かるようにする
    • 無課金でも頑張れるモチベを作る
  • 運用はなるべく手間かけないようにしたいが、イベントも打ちたいな
    • 月毎に固定イベ & ガチャ とかでも良いのかも
    • そもそもユーザ数50人くらいいれば嬉しいくらいの目標
 
戦闘システムについてはあまり語りません!
結構面白いと思うけど…似たゲームあるのか調査もしていないけど、少なくとも僕がやってきたゲームでは存在しないので、オリジナルな戦闘システムだと思っている。公開した後に、これ○○と似てるじゃんって言われたら泣く。
 
キモになる戦闘システムから作っていこうとChatGPTに言われたので少しずつ作っていっているよ。
まだ開発1日目だけどこんな感じです。
 
 
下に味方キャラ、上に敵キャラです。背景付けたいな。
 
ゲームの名前は「ぽいすろ」(仮)です。

GoDotでゲームを作ってみるのコーナ。

 

今日も検索ツールの話です。

もう少し…もう少しでこのツールも完成するはず…!

そしたらゲームを作る。音楽RPGゲームを!!

 

という事で前回の最後に

  • メニュー追加
  • 文字フィルタのセットを作れるようにした
  • Aboutダイアログを表示して、著作権表示をしてみた
の3本立てですと言ったのですが、最初のメニューの件は廃止されました。
 
左上にメニュー出して
  • フィルタ
  • 読み込み
  • データクリア
  • このアプリについて
というメニューを用意してたのですが、ファイルダイアログがネイティブにならないし、UIがなんだかなぁという感じだったので、データ読み込み機能は廃止、MITライセンスの辞書データを拝借する事に。
そうすると、「フィルタ」と「アプリについて」のみとなってメニューにする必要性をあまり感じられなくなったのです。
 
そのため、上部バーはこのように変えました。
 
左のフィルタボタンでフィルタダイアログを表示。
右から2番目の情報ボタンでこのアプリについてと著作権表示に変えました。
 
そして、フィルタ機能を強化しました!!
まず、全文字ヒットするようにした場合がこちら。
「い??か」の場合、色々ヒットするんですね。
でもでも、例えば「いぬいか」とか、「ぬ」なんて持って行った事ある人いますか?!
コトダマン猛者であればもはや使いやすい文字なのかもですが、私は戯言戦とかでしか持って行ったことありません。
 
という事で、フィルタすると、こんな感じ。
うん、「いせいか」くらいかな。という判断ができます。
このフィルタは良く持っていく文字用フィルタで「1」番タブにセットしました。
 
ただ、これだともの足りない…そんな場合は文字を少し多くした「2」番タブ。
「いおうか」とかお世話になった記憶あります。
 
これがフィルタセット切り替え&自分でカスタマイズできる機能です。
変更すれば保存されるのでもちろん自分好みのフィルタを3つまでセットできます。
私は、全文字で調べる場合も欲しかったりするので、3番は全てONにしています。
 
さて、今回の機能紹介の最後、「このアプリについて」です。
「i」ボタンを押したらアプリ情報画面が表示されるってだけです。
これでやっとストア配信できそうなアプリっぽくなってきましたね。

GoDotでゲームを作ってみるのコーナ。

 

コトダマン検索ツールの旅はまだまだ続きます。

今日は機能紹介というよりはGoDot開発を進めてきた今の所の感想です。

 

良いなと思ったところ

  • すぐビルドして試せる
    • まだ小規模だからかもですがビルドして起動が早い
    • iPhone実機で試すのも30秒くらい
      • iOSでエクスポート → ipaファイルをAirDropで送る → 自動でインストールしてくれる
    • ちなみにAndroidではapkをGoogleDriveに入れて送っています、USBでつないでも良いんだけどね
  • UIパーツをマスス操作で直感的に配置できる
    • Button、Dialog、TabContainerなどUIパーツを画面に張り付けて配置できる
  • 8割はChatGPTがやり方を教えてくれる
  • GoDot本家のドキュメントがシンプルではあるけどしっかり書いてある
 

もう少しと思ったところ

自分の調べ方やスキルセットの問題があるかも知れない所は承知のうえで書くと、

  • 外部ドキュメントが少ない
    • GoDotのドキュメントはあるが、だいたい調べたいものってドキュメント外の内容でStackoverflowみたいなやつに挙がっている記事を期待するんだけど無い
  • ChatGPTが以前のバージョンでの書き方を提案する
    • 補佐的に使っているので大きな問題ではないけど、GoDot v3時代の書き方を提案してきて、v4では廃止されたりしている
    • ちなみにChatGPTって指摘しても、しれっと「そうなんだ! これはv4では廃止された書き方なんだ!」ってキリッと言うよねw そこが良いんだけど
  • 無料テーマが無い
    • フォームパーツの背景色、文字色、線色などの配色セットを例えばBootstrapライクにしたいとなった時に、無料でインポートできるテーマ集が無い
    • .tresファイルを配布していれば良いのに、メインサイトみたいのが無いのよね
  • UIパーツの色付けが手間
    • 無料テーマが無いに関連はするんだけど、無いので自分で作る、なのに作るのが結構手間
    • 今開発している検索アプリがほぼWebで作れる範囲だからより使いにくく感じるのかもだけど、例えばボタン、ダイアログのUI1つ取っても、配色テーマの指定が面倒
    • テーマエディタ使っているけど、ボタン1つでも押している時、ホバー時、通常時などの状態によってそれぞれ配色を決めないとで、そのあたりよろしくやってくれないものなのかと思ってしまう
    • 「ボタン」についてある程度配色作って別ファイルにエクスポートして、それを「ダイアログ」に読み込ませて追加で修正かけると、「ボタン」の方にも反映されてしまう、これ読み込ませた後は独自定義扱いにしてくれないか
  • ファイル読み込みダイアログがネイティブ使えない
    • iOSだとswiftの独自コード定義しないと使えないみたいで、「use_native」みたいなチェックボックスあるのに効かない
    • iOSだとデフォルト表示されるパスが多分権限エラーっぽいの出て使いものにならない
    • GoDot独自のファイルダイアログが多機能過ぎなのか項目がごちゃごちゃしている
  • ダイアログの上部バーのカスタムできない
    • これは絶対やり方があるんだろうけど力尽きた
 
ファイルダイアログのネイティブ使えない問題に直面してから、GoDotではなくメジャーなUnityにした方が良いんじゃないの…と思って少し調べたんだけど、この記事を読んで「もう少しGodotと付き合ってみようかな」と思いました。
 

https://www.reddit.com/r/godot/comments/14e2o4w/give_me_your_honest_thoughts_on_godot_vs_unity/

 

あれ、今さらだけど「GoDot」ではなく「Godot」なの? エディタも「Godot」だな。

 

テーマ設定、UIカスタマイズがいまいち、については"慣れ"なのかも知れないが現状の痒い所に手が届いていない部分の紹介をします!!

 

まず、初期画面。

各パーツの隙間のグレー、もう少し何とかしたいよね!?

上部もだし、下のタブバーのタブの後ろの背景色も気になるー。これどこでどうやるの?

というか、これも全部、できあいのテーマをインポートして終了! にしたい気分なんです。

別にデザインにはこれっぽっちもこだわり無いんです。あるもので良いんです。

 

次にダイアログ。

これだとあまり分からないか。×ボタンのバー狭くない!?

 

もっと大きいダイログ見るか。

これ、タイトルの背景色どうするの…!? マージンもいまいち。

 

ファイルダイアログなんて壊滅的だよ。

見てよこれ。

 

ファイルを開こうという気になれない。これでも表示項目を色々と減らしたんだけど元々はこれ。

情報量が多過ぎる。

 

それでも、少しずつ改良していったんです。テーマ当てて一発で解決したいなぁ。

ファイルダイアログの道のりは長そうだったので、本当は辞書ファイルを外部読み込みする形にしようと思いましたが止めました。

そのため、辞書データはMITライセンスで配布しているサイトを見付けたので、そちらをお借りする方向で考えています。

このあたり著作権的に問題ないのか気になって引き続き調べています。

 

コトダマンの辞書データをパブリックにみんなで作成しているコミュニティは無いのだろうか。

 

さて次回は、

  • メニュー追加
  • 文字フィルタのセットを作れるようにした
    • 「い」軸フィルタ、「う」軸フィルタ、などユーザ定義できる
  • Aboutダイアログを表示して、著作権表示をしてみた
の3本立てで行こうと思います!

GoDotでゲームを作ってみるのコーナ。

 

いつになったらゲーム作るんだw

という事で前回から引き続き「コトダマン検索アプリ」です。

 

今回のアップデートは

  1. ユーザ辞書登録機能
  2. フィルタ機能
  3. 文字グループまとめ機能
となります。
 

1. ユーザ辞書登録機能

初期辞書はあるものの登録されていない言葉が存在します。

これを登録できるようにしました。

 

右の「+」ボタンを押すと登録です。「登録しました」のメッセージは出してません。

 

多少のチェックは入れておきました。

 

 

これで登録した言葉も検索できるようになりました。

主な関連ソースはこんな感じ。

 

 

 

2. フィルタ機能

「ぬ」使わなくないですか? 「ぬ」がある文字は除外したいですよね?

「い?かい」で調べてみて「いぬかい」は作らん!! という時にこの機能ありです。

 

左の「フィルタ」アイコンを押すと中央右にフィルタダイアログが出て、検索対象から除外したい文字はOFFにします。

これだと「ぬ」がONなので、検索結果の一番下に「いぬかい」あります。

 

「ぬ」を外すと、結果検索からも除外されます。

 

全文字対象で「こう??う」とかで検索すると、たーくさん出ますが

 

良く使うものに絞るとスッキリ。

もちろん集計の方にも反映されるので、「しゅじょそ」あたりを持って行けば良いかなぁとなります。

 

1つ目の「?」、2つ目の「?」によってヒットする文字分布も分かると良いかもとも思っていますが、それはまた気が向いたら。

 

3. 文字グループまとめ機能

フィルタ機能の紹介でお気付きの方もいたかも知れません。

「し」=「じ」、「よ」=「ょ」、「は」=「ば」=「ぱ」は同じ文字として扱うようにしました。

コトダマンだと基本的に濁音、半濁音、拗音はセットになっているキャラが多いのでそのようにしました。

 

なので集計でもこのように、関連グループの文字を表示するようにしています。

「し」と「じ」で計4回なので合わせてしまっても良いかも知れません。ここは使いながら考えてみます。

ご意見あればコメントいただけたら検討材料にします!

 

さて、コトダマン検索アプリもだいたい欲しい機能作ったかなぁ。

あとは以下が今のところ思いつきますが、ゲームしながら考えようと思います。

  • 履歴機能
  • 登録した言葉削除機能
  • 集計時に文字グループをまとめた後にソートする機能
  • 初期の辞書ファイル読み込み機能
    • 今はWebから拾った辞書データを使っているが著作権的に分からないのでユーザ自信が入れる方式にする
    • 本当はコトダマンの辞書テキストファイル欲しい所だけど公開していないもんねきっと

GoDotでゲームを作ってみるのコーナ。

 

前回に続き今回もコトダマン検索アプリの開発状況報告です。

 

今回はテーマ。UIテーマです。

 

ドキュメントをろくに読まずに、ChatGPTさんと開発しているので全然まとまってないですよ。

ただ、GoDotってドキュメント少ない??

今さらなのですが2Dゲームでも無い今回のようなUIのアプリはWebで(私ならRailsで)ちゃっちゃか作った方が早かったのでは?と思いましたが、そのまま強行突破しようと思います!

cssで書けば一瞬のようなものをすごーく時間かけて結局分からない! とかなってます。

 

テーマ、スクリプトでごりごりソースコードで書く方法もあるのですが、色合いとか考えながらとなるとGUIの方が良いかなと思い、このテーマエディタたるものを利用しました。

 

  1. 左下にある「ファイルシステム」あたりで右クリック→[新規作成]→[リソース]
  2. "theme"で検索して"Theme"クラスを選ぶ
  3. 適当に名前付けて.tresファイルを作る
  4. ファイルをダブルクリックでテーマエディタが開く
  5. 色々と編集する ※後述
  6. [プロジェクト]→[プロジェクト設定]→[一般]→[GUI]→[テーマ]
  7. カスタムで.tresを指定
という流れです。
 
手順5の詳細。ここがねぇ、きっともっと良い方法あるんだろうけど良く分からないけど乱暴に書いてみます!
 
例としてボタンのUI変更方法を紹介します。
 
上の例だと青いボタンですが、こんな感じのパステル青とか (文字読めない!w)
 
かわいいピンクとかも作れます。
※どれもChatGPTさんに配色言われてやったやつ & 私はデザインセンスは0なのでそこは気にしない。
 
さて、説明をば。最初はこんな感じかと思います。
 
ここの"型"とかある横の「+」を押します。
 
"button"で検索して"Button"を選びます。ちなみに緑色のアイコンでないとこのテーマエディタに対応してない模様。継承クラスとかの関係なんでしょうねきっと。
 
Buttonが追加されます。
 
下に表示されているタブの中で右から2番目のカラフルなアイコンを選択。
ここが背景色、枠線などのスタイルを編集する場所になります。
(なお、フォント色は一番左、フォントサイズは左から3目番タブになります。)
 
ボタンの状態によってスタイル(背景色、線など)を指定できるのですが、"空"となっていない所が良く使うもので、normal=通常、pressed=押している時、押されっぱなしの時、hover=ホバー時を設定すれば良いです。
 
ここではnormalの横の「+」を押して右の「↓」プルダウンを押して、「StyleBoxFlat」を選びます。
 
次がめちゃくちゃ重要なのですが、先ほど選んだ「StyleBoxFlat」と表示されている箇所をクリックします。
これで、このスタイルを編集するモードになります。画像の"Style…"と表示されているエリアですね。
 
ここを選択すると右の「インスペクタ」の表示が変わります。
 
このスタイルの所を選択する事を忘れて編集作業していると例えばpressedの状態のスタイルを変えているつもりがnormalの状態を編集していた、とか何度もありました。必ず編集作業前にスタイルを選択する事を確認するが重要です。
 
そしたら、背景色を変えてみます。
インスペクタの方で色々と作業します。
"BG Color"の横のグレー箇所をクリックして色を変えてみてください。すると中央下のテーマエディタに表示されているボタンの色も連動して変わるので確認できますね。
 
こんな感じで「インスペクタ」を編集してボタンなどのUIパーツのスタイルを決めます。
私が良く使ったのは以下。
  • Border Width: 枠線の太さ、1px、2pxくらい
  • Border Color: 枠線の色
  • Corner Radius: 枠線の角を丸くするか、全部10pxくらい
  • Content Margins: 内部マージン、10pxくらい
このあたり設定するとこんな感じ。
 
面倒なのが、同様にpressed、hoverとかもやらないとサイズ感が違ってカクカクする動きになるので合わせましょう。
ほとんど同じ設定が面倒! と思ってスタイルを保存して読み込みとか試したのですが、読み込んでカスタムしちゃうと全部に反映されるんです。これも絶対ベストプラクティスあるんだろうけど、デザインなんて優先度低いので後回し! (←デザイナーに怒こられるやつ)
 
フォントが小さいよね。多分、2D画面を大きく使うからなんだよね。僕はスマホ2D画面のアプリ作るから60ptくらいにしています。
4番目タブの"font_size"の「+」を押して、"60"を入力。
 
ボタン系は大きくなったけど、テキストフィールドはそのままなのねw
このあたりは継承クラスに反映されるとかなんだろうな。
 
フォント色は1番目タブの"font_color"で同じ要領で設定できるよ。
 
最後は保存すれば.tresファイルに保存されます。※必要なかったかも。
 
これ結構大変な作業で、デフォルトの黒テイストで良かったのではとも思っています。
無料のテーマファイルが落ちてれば良いのだけれども、なんだかこれという感じの無いのよね。
Bootstrapっぽいので良いんだけれどなぁ。

GoDotでゲームを作ってみるのコーナ。

 

ゲーム作るつもりがずっとコトダマン言葉検索ツールを作っていますが、今回は前回書いたアップデート内容はどのように作ったかの紹介です!

 

まずはパーツの構成から。

  • MainContainer: 縦配置してくれるVBoxContainerを配置。
    • SearchArea: 横配置してくれるHBoxContainerを配置。
      • SearchButton: Button。検索ボタン。
      • InputField: 1行のテキストフィールドなのでLineEditを配置。
    • TabContainer: 配下のパーツをタブ表示して切り替えてくれるTabContainer。
      • 検索結果: 結果は長くなるのでScrollContainerを配置。
        • ResultList: 実際に検索結果を表示するItemListを配置。親がScrollContainerなのでスクロールしてくれる。
      • 文字集計: 上と同様。
        • SummaryList: 上と同様。
      • 文字集計(累計): VBoxContainer
        • ScrollContainer
          • TotalList: ItemList
        • リセット: 累計データをリセットするButton。
 
次にメインのスクリプト (main.gd)。

extends Control

@onready var input_field = $MainContainer/SearchArea/InputField
@onready var search_button = $MainContainer/SearchArea/SearchButton
@onready var result_list = $"MainContainer/TabContainer/検索結果/ResultList"
@onready var summary_list = $"MainContainer/TabContainer/文字集計/SummaryList"
@onready var total_list = $"MainContainer/TabContainer/文字集計(累計)/ScrollContainer/TotalList"
@onready var reset_button = $"MainContainer/TabContainer/文字集計(累計)/リセット"

var words = []
var total_char_count_list = {}

func _ready():
    var file = FileAccess.open("res://wordlist.txt", FileAccess.READ)
        
    while not file.eof_reached():
        var line = file.get_line().strip_edges()
        if line != "":
            words.append(line)
    file.close()

    search_button.pressed.connect(_on_search_pressed)
    reset_button.pressed.connect(_on_reset_button_preseed)
    
    var tab_bar = $MainContainer/TabContainer.get_tab_bar()
    tab_bar.add_theme_constant_override("tab_side_padding", 24)
    tab_bar.add_theme_constant_override("tab_vseparation", 40)
    tab_bar.add_theme_constant_override("hseparation", 30)
            
func _on_search_pressed():
    var query = input_field.text.strip_edges()
    var regex_pattern = convert_to_regex(query)
    var regex = RegEx.new()
    var regex_result = regex.compile(regex_pattern)
    
    if regex_result != OK:
        result_list.clear()
        result_list.add("エラー")

    var current_char_count_list := {}
    result_list.clear()
    summary_list.clear()
    total_list.clear()
    for w in words:
        var result = regex.search(w)
        if result:
            result_list.add_item(w)
            
            # ヒットした文字を取得
            for i in range(1, result.get_group_count() + 1):
                var hit_str = result.get_string(i)
                
                for char in hit_str:
                    if not current_char_count_list.has(char):
                        current_char_count_list[char] = 0
                    current_char_count_list[char] += 1
                    # 累計
                    if not total_char_count_list.has(char):
                        total_char_count_list[char] = 0
                    total_char_count_list[char] += 1
                
    # 今回の集計
    var sorted_keys := current_char_count_list.keys()
    sorted_keys.sort_custom(func(a, b): return current_char_count_list[a] > current_char_count_list[b])
    for k in sorted_keys:
        summary_list.add_item("%s : %d回" % [k, current_char_count_list[k]])
    
    # 累計
    var total_sorted_keys := total_char_count_list.keys()
    total_sorted_keys.sort_custom(func(a, b): return total_char_count_list[a] > total_char_count_list[b])
    for k in total_sorted_keys:
        total_list.add_item("%s : %d回" % [k, total_char_count_list[k]])

    
func convert_to_regex(query: String) -> String:
    var pattern = query
    # 「-」を任意の一文字に変換、?も対応
    pattern = pattern.replace("-", "(.)")
    pattern = pattern.replace("?", "(.)")
    pattern = pattern.replace("?", "(.)")
    pattern = pattern.replace("ー", "(.+)")
    # 「[]」はそのまま正規表現として使えるが、全角対応のため置換
    # (Godotの正規表現はUnicode対応なのでOK)
    return "^" + pattern + "$"
    
func _on_input_field_text_submitted(new_text: String) -> void:
    _on_search_pressed()

func _on_reset_button_preseed():
    total_char_count_list.clear()
    total_list.clear()
    total_list.add_item("※検索履歴をリセットしました")

 

MainContainerのスクリプト (main_container.gd) ※前回から変えていないよ

extends VBoxContainer

@onready var input_field = $SearchArea/InputField
var last_tap_time = 0.0
var double_tap_threshold = 0.3

func _gui_input(event):
    if event is InputEventScreenTouch and event.pressed:
        var current_time = Time.get_ticks_msec() / 1000.0
        if current_time - last_tap_time < double_tap_threshold:
            input_field.grab_focus()
            input_field.select_all()
        last_tap_time = current_time
 

 

 

 

次回はテーマを青にしてみた話をしようと思います。