<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>モバイルゲーム：サークルジャンプ on Godot 4 レシピ</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/index.html</link><description>Recent content in モバイルゲーム：サークルジャンプ on Godot 4 レシピ</description><generator>Hugo -- gohugo.io</generator><language>ja</language><atom:link href="https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/index.xml" rel="self" type="application/rss+xml"/><item><title>プロジェクトの設定</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_01/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_01/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;どこから始めればよいでしょうか？ゲームの種類やアイデアの具体性によって、答えは大きく異なります。この場合、事前にプロトタイプを作成し、さらにアイデアを固めておいたため、若干有利でした。とはいえ、当初の構想からは多少逸脱してしまいましたし、この連載も同様になるかもしれません。結果は時が経ってみないと分かりません。&lt;/p&gt;
&lt;p&gt;大きなプロジェクトの場合、まず&lt;strong&gt;設計書&lt;/strong&gt;から始めるのが一般的です。これは、簡単なメモ1枚程度のものから、ゲーム世界・ストーリー・メカニクスの詳細を網羅した500ページに及ぶ大作まで様々です。ここではそこまで複雑なものは必要ありませんので、まずは大まかな企画内容をご説明します。&lt;/p&gt;
&lt;h2 id="ゲームプラン"&gt;ゲームプラン&lt;/h2&gt;
&lt;p&gt;このゲームでは、プレイヤーは「キャラクター」を操作し、円形のフィールドから別の円形へジャンプしていきます。ジャンプはクリックまたはタップで開始され、次のサークルに着地できなければゲームオーバーとなります。スコアは生存時間に応じて加算され、難易度は徐々に上昇していきます - 移動するサークルや、サイズが小さくなるサークル、さらには消滅するサークルが登場するためです。コンセプトは、スピード感あふれる短時間で遊べる、「もっと上を目指せ」という感覚を刺激するゲームプレイです。可能な限り、アートスタイルはシンプルでクリーンなデザインを維持し、視覚効果やオーディオエフェクトを駆使して魅力を高めていきます。&lt;/p&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;まずはGLES3を使用して開始します。これがどのような影響を及ぼすかはまだ明確ではありません。モバイルテストフェーズに移行した時点で、GLES2への移行が必要かどうかを検討します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;また、このプロジェクトを&lt;a href="https://github.com/kidscancode/circle_jump" target="_blank"&gt;&lt;i class="fab fa-github"&gt;&lt;/i&gt; GitHubでフォローする&lt;/a&gt;こともできます。&lt;/p&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;まず、プロジェクト設定から始めてください。画面サイズと動作仕様を定義が必要です。モバイルゲームとして開発するので、縦向き表示が必須となり、さまざまな端末の画面解像度に対応できるようが必要です。スマートフォンには数多くの画面解像度が存在するためです。&lt;/p&gt;
&lt;p&gt;プロジェクト設定を開き、［表示／ウィンドウ］セクションに移動します。画面サイズを &lt;code&gt;(480, 854)&lt;/code&gt; に、［携帯端末／向き］を「縦」に、［伸縮／モード］を「2D」に、そして［伸縮／アスペクト比］を「維持」にそれぞれ設定してください。&lt;/p&gt;
&lt;p&gt;次に、［入力デバイス／ポインティング］セクションで「マウスからタッチ操作をエミュレート」を有効にしてください。これにより、画面のタッチイベントのみを使用してコードを入力できる上に、PCプラットフォームではマウスを使ったプレイも可能になります。&lt;/p&gt;
&lt;h3 id="プロジェクト管理体制"&gt;プロジェクト管理体制&lt;/h3&gt;
&lt;p&gt;整理整頓のため、ゲームオブジェクト用のフォルダ（&lt;code&gt;objects&lt;/code&gt;）とUI専用フォルダ（&lt;code&gt;gui&lt;/code&gt;）を作成します。画像や音声などのゲームアセットは&lt;code&gt;assets&lt;/code&gt;フォルダに格納してください。開始時点で使用するアセットはこちらからダウンロードできます。&lt;/p&gt;
&lt;div class="box notices cstyle note"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-circle"&gt;&lt;/i&gt; メモ&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;プロジェクトファイルをこちらからダウンロードしてください: &lt;a href="https://kamera25.github.io/godot_recipes/4.x/ja/files/circle_jump_assets.zip"&gt;circle_jump_assets.zip&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;フォルダ構造とアセットの準備が整ったら、いよいよコーディング開始です！&lt;/p&gt;
&lt;h2 id="ゲームオブジェクト"&gt;ゲームオブジェクト&lt;/h2&gt;
&lt;p&gt;作成するゲームオブジェクトは2つあります。プレイヤー（「ジャンパー」）と円形オブジェクトです。&lt;/p&gt;
&lt;h3 id="ジャンパーjumper"&gt;ジャンパー（Jumper）&lt;/h3&gt;
&lt;p&gt;移動と衝突判定には、&lt;code&gt;Area2D&lt;/code&gt;を使用することにします。公平を期すために言えば、ここでは&lt;code&gt;CharacterBody2D&lt;/code&gt;を使用しても問題ありませんし、同様に機能します。ただし、このゲームでは厳密な衝突検出は必要なく、ジャンパーが円に接触したかどうかだけを把握できれば十分です。以下のノードを追加しましょう：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Area2D&lt;/code&gt; (&amp;ldquo;Jumper&amp;rdquo;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Sprite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CollisionPolygon2D&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VisibilityNotifier2D&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;シーンを &lt;code&gt;res://objects/&lt;/code&gt; に保存し、円の画像ファイル（&lt;code&gt;res://assets/images/jumper.png&lt;/code&gt;）をスプライトの &lt;em&gt;Texture&lt;/em&gt; にドラッグします。すべてのゲーム画像は初期設定では白色になっていますので、後で動的に色付けする際に作業がしやすくなります。&lt;/p&gt;
&lt;p&gt;アートワークが上向きに描かれているため、&lt;code&gt;Sprite2D&lt;/code&gt;の［回転］プロパティを&lt;code&gt;90&lt;/code&gt;に設定してください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CollisionPolygon2D&lt;/code&gt; を選択し、ジャンパーの三角形形状をカバーするように3点を追加してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-afb89ea12dd4e87086b035468254eddc" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_01_01.png?width=200" alt="alt" style="height: auto; width: 200;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-afb89ea12dd4e87086b035468254eddc"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_01_01.png?width=200" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;では、ボディ部分にスクリプトを追加し、その動作をコーディングしていきます。&lt;/p&gt;
&lt;p&gt;まず、シグナルと変数について：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Area2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; velocity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;100&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# start value for testing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; jump_speed &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; target &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;null&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# if we&amp;#39;re on a circle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、画面タッチを検知し、円形オブジェクト上にいる場合はジャンプ処理を実行します。&lt;/p&gt;</description></item><item><title>サークルをスポーンさせる</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_02/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_02/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;前回のパートでは、ゲームの中核をなす&lt;code&gt;ジャンパー&lt;/code&gt;オブジェクトと&lt;code&gt;サークル&lt;/code&gt;オブジェクトを作成しました。次に、プレイヤーがミスするまで連続して出現するサークルの進行システムを追加する必要があります。&lt;/p&gt;
&lt;h2 id="メインシーンの拡張"&gt;メインシーンの拡張&lt;/h2&gt;
&lt;p&gt;メイン・ノードにさらにノードを追加してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Marker2D (&amp;ldquo;StartPosition&amp;rdquo;)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;このゲームの開始位置をマークします。画面中央下部付近に置いてください。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;カメラ 2D&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;カメラはプレイヤーの動きに合わせて追従します。&lt;/p&gt;
&lt;p&gt;カメラの設定も行います。 &lt;em&gt;オフセット&lt;/em&gt; を &lt;code&gt;(0, -200)&lt;/code&gt; に設定してください。これにより、前方の世界をより広く確認できるようになります。また、カレントモードは「オン」に設定してください。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="メインシーンのスクリプト化"&gt;メインシーンのスクリプト化&lt;/h2&gt;
&lt;p&gt;手動で作成したジャンパーと円のインスタンスを削除します。今後はコード内で追加するようにします。&lt;/p&gt;
&lt;p&gt;以下を&lt;code&gt;Jumper.gd&lt;/code&gt;に追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;signal&lt;/span&gt; captured
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ジャンパーが円に接触した時に、このシグナルを発生させます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_on_Jumper_area_entered&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;area&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; area
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; velocity &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Vector2&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;ZERO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;emit_signal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;captured&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; area&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、円の &lt;code&gt;init()&lt;/code&gt; 関数を修正して、位置も受け取れるようにしてください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;init&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;_position&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; _radius&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;radius&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; position &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; _position
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それでは、&lt;code&gt;Main&lt;/code&gt; シーンにスクリプトを追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; Circle &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;preload&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;res://objects/Circle.tscn&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; Jumper &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;preload&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;res://objects/Jumper.tscn&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; player
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;需要が発生した際にインスタンス化できるよう、両方のオブジェクトに対する参照が必要となります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_ready&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;randomize&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;new_game&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは一時的なものです。後で新規ゲーム機能を呼び出すスタートボタンを備えたUIを実装する予定です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;new_game&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Camera2D&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $StartPosition&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; player &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; Jumper&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;instantiate&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; player&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $StartPosition&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;add_child&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;player&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; player&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;connect&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;captured&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;_on_Jumper_captured&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;spawn_circle&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;$StartPosition&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;new_game()&lt;/code&gt;関数は、プレイヤーと円を開始位置にスポーンさせ、カメラを設定することでゲームを初期化します。&lt;/p&gt;</description></item><item><title>限定サークル</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_03/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_03/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最初の2部で基本ゲームプレイは完成しました。ここからは、サークルに様々なモードを追加していきます。&lt;/p&gt;
&lt;h2 id="サークルモードについて"&gt;サークルモードについて&lt;/h2&gt;
&lt;p&gt;最終的には様々なモードを実装する予定ですが、まずは「制限モード」から始めてください。このモードでは、円は特定回数の周回後に消滅します。まず、残りの周回数を表示する &lt;code&gt;Label&lt;/code&gt; ノードを追加してください。テキストフィールドに数値（例：&lt;code&gt;1&lt;/code&gt;）を入力して、表示方法を確認してみてください。&lt;/p&gt;
&lt;p&gt;[カスタムフォント] セクションで、新しい &lt;code&gt;DynamicFont&lt;/code&gt; を追加し、アセットフォルダから &lt;em&gt;フォントデータ&lt;/em&gt; を読み込み、 &lt;em&gt;サイズ&lt;/em&gt; を &lt;code&gt;64&lt;/code&gt; に設定します。ラベルの位置を中央配置するには、「レイアウト」メニューから「中央揃え」を選択します。&lt;/p&gt;
&lt;p&gt;以下の新しい変数を &lt;code&gt;Circle.gd&lt;/code&gt; ファイルの先頭に追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;enum&lt;/span&gt; MODES &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;STATIC&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; LIMITED&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; mode &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; MODES&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;STATIC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; num_orbits &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# Number of orbits until the circle disappears&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; current_orbits &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# Number of orbits the jumper has completed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; orbit_start &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;null&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;# Where the orbits started&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、モードを設定する方法が必要です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;set_mode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;_mode&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mode &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; _mode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;match&lt;/span&gt; mode&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MODES&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;STATIC&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;hide&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MODES&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;LIMITED&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; current_orbits &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; num_orbits
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;text &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;str&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;orbits_left&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Label&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;show&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;現在はこれら2つのモードが定義されていますが、後でさらに追加される予定です。&lt;/p&gt;</description></item><item><title>メニュー</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_04/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_04/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;基本ゲームプレイが完成したので、次はUIの実装に取り掛かります。タイトル画面、設定画面、そしてゲームオーバー時用のメニュー画面が必要になります。&lt;/p&gt;
&lt;h2 id="メニュー画面"&gt;メニュー画面&lt;/h2&gt;
&lt;p&gt;3つの画面は共通のレイアウトと一部機能を共有するため、まずは全てがこのシーンを継承できる基本シーンから始めてください。新しいシーンでは、まず &lt;code&gt;CanvasLayer&lt;/code&gt; を作成し、名前を &lt;code&gt;BaseScreen&lt;/code&gt; とします。作成したこのシーンは「UI」フォルダに保存してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CanvasLayer&lt;/code&gt; (&amp;ldquo;BaseScreen&amp;rdquo;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MarginContainer&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VBoxContainer&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Label&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HBoxContainer&lt;/code&gt; (&amp;ldquo;Buttons&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tween&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;MarginContainer&lt;/code&gt;「マージンコンテナ」を使用すると、UI要素が画面端に近づきすぎるのを防止できます。4つの &lt;em&gt;Custom Constants&lt;/em&gt; プロパティをすべて&lt;code&gt;20&lt;/code&gt;に設定してください。&lt;/p&gt;
&lt;p&gt;次に使用するのはメイン要素を整理するための&lt;code&gt;VBoxContainer&lt;/code&gt;です。このコンテナの［カスタム定数／間隔］設定を&lt;code&gt;150&lt;/code&gt;に設定してください。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Label&lt;/code&gt;ノードは画面のタイトルを表示します。［テキスト］フィールドに「タイトル」と入力し、円と同じフォントリソースを読み込みます。&lt;/p&gt;
&lt;p&gt;最後に、「ボタン」という名前の &lt;code&gt;HBoxContainer&lt;/code&gt; を追加してください。このコンテナには、後でスクリーンに追加するボタンが格納されます。その &lt;em&gt;間隔&lt;/em&gt; を &lt;code&gt;75&lt;/code&gt; に設定します。次にノードを複製して、もう1列分のボタンを作成します。&lt;/p&gt;
&lt;p&gt;スクリーンは画面外に表示開始されるので、ルートノードの &lt;em&gt;オフセット値&lt;/em&gt; を &lt;code&gt;(500, 0)&lt;/code&gt; に設定してください。その後、シーンにスクリプトを追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;CanvasLayer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@onready&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; tween &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $Tween
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;appear&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;interpolate_property&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;offset:x&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;500&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b48ead"&gt;0.5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;TRANS_BACK&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;EASE_IN_OUT&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;start&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;disappear&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;interpolate_property&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;offset:x&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;500&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b48ead"&gt;0.4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;TRANS_BACK&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;EASE_IN_OUT&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;start&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このスクリプトでは、画面の表示／非表示を切り替えるためのアニメーション設定します。&lt;/p&gt;
&lt;p&gt;これで3つの継承されたシーンを作成できます。それぞれについて：ルートノードに名前を付け、ラベルテキストを変更し、「Buttons」コンテナに&lt;code&gt;TextureButton&lt;/code&gt;を追加してください。各ボタンのノーマルテクスチャには、アセットフォルダ内の画像を使いましょう。各ボタンにはその機能に応じた名前を付けてください（例：「再生」「設定」など）。そしてこれらをすべてグループ「buttons」に追加してください。&lt;/p&gt;
&lt;p&gt;以下は、指定されたボタン名を使用した3つのシーンの外観例です。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-7db365c9e29e58956721c00dd60c14c0" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_04_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-7db365c9e29e58956721c00dd60c14c0"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_04_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;</description></item><item><title>スコアとHUD</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_05/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_05/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最終部分では、ゲームの開始と設定するためのメニュー形式のUIを実装しました。また、スコアなどのゲーム内情報を表示するためのUIも必要です。&lt;/p&gt;
&lt;h2 id="hudシーン"&gt;HUDシーン&lt;/h2&gt;
&lt;p&gt;HUDとして使用する&lt;code&gt;CanvasLayer&lt;/code&gt;をルートとする新しいシーンを追加してください。以下の2つの子要素を持たせます。「ScoreBox」という名前の&lt;code&gt;MarginContainer&lt;/code&gt;と、「メッセージ」という名前の&lt;code&gt;Label&lt;/code&gt;です。&lt;/p&gt;
&lt;p&gt;Scene treeは以下のようになっている必要があります。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-9fff305a9095dac46479b0c1d8b79d4f" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_05_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-9fff305a9095dac46479b0c1d8b79d4f"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_05_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下の設定を行ってください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ScoreBox&lt;/code&gt; のレイアウトを「下部ワイド」に設定&lt;/li&gt;
&lt;li&gt;すべてのカスタム定数値を&lt;code&gt;20&lt;/code&gt;に設定&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HBoxContainer&lt;/code&gt; 子要素を追加し、その下に2つの &lt;code&gt;Label&lt;/code&gt;ノードを配置&lt;/li&gt;
&lt;li&gt;2番目のラベルに「スコア」という名前を付け、 &lt;em&gt;Text&lt;/em&gt; プロパティに &lt;code&gt;100&lt;/code&gt; を入力&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HBoxContainer&lt;/code&gt; の &lt;em&gt;Alignment&lt;/em&gt; を「End」に設定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同じ&lt;code&gt;DynamicFont&lt;/code&gt;リソースを両方のラベルに追加しますが、最初のラベルでは「ユニークにする」を選択し、そのサイズを &lt;code&gt;32&lt;/code&gt; に設定します。_Text_プロパティには「スコア」と入力してください。その &lt;em&gt;Size Flags/Vertical&lt;/em&gt; で「塗りつぶし」を設定します。レイアウトは以下のようになります。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-51082ffa2cb4113242078f1824adb22e" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_05_02.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-51082ffa2cb4113242078f1824adb22e"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_05_02.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;次に、&lt;code&gt;Message&lt;/code&gt;ノードの処理に移ります。まずフォントを読み込み、 &lt;em&gt;Text&lt;/em&gt; プロパティに「メッセージ」を設定します。こうすることで表示内容が確認できるようになります。さらに、フォントリソースで「ユニーク化」（Make Unique）を選択してください（この理由は次のセクションで説明します）。 &lt;em&gt;Align&lt;/em&gt; と &lt;em&gt;Valign&lt;/em&gt; は「中央」に設定し、 &lt;em&gt;Clip Text&lt;/em&gt; は「オン」にしてください。レイアウトに関しては「ワイド・センタリング」を選択します。また、_Grow Direction/Vertical_を「両方」に設定します。&lt;/p&gt;
&lt;h2 id="メッセージアニメーション"&gt;メッセージアニメーション&lt;/h2&gt;
&lt;p&gt;このゲーム中に表示されるメッセージです（レベルアップ時の通知やボーナス表示など）。アニメーション付きで表示させ、フェードアウト効果を加えたいと思います。シーンに &lt;code&gt;AnimationPlayer&lt;/code&gt; を追加してください。&lt;/p&gt;
&lt;p&gt;以下の2つのアニメーションを作成します。初期値を設定するものと、メッセージ表示をアニメーションさせるものです。まず最初のアニメーション「init」を追加し、「ページ読み込み時に自動再生」ボタンをクリックします。持続時間は&lt;code&gt;0.1&lt;/code&gt;に設定してください。&lt;/p&gt;
&lt;p&gt;時刻 &lt;code&gt;0&lt;/code&gt; に &lt;em&gt;フォント/サイズ&lt;/em&gt; (&lt;code&gt;64&lt;/code&gt;) のキーフレームを追加し、&lt;em&gt;表示&lt;/em&gt; を「オフ」に設定するキーフレームも追加してください。&lt;/p&gt;
&lt;p&gt;2番目のアニメーション「show_message」を追加してください。長さを &lt;code&gt;0.75&lt;/code&gt; に、キーフレームの透明度設定を『オン』に設定してください。&lt;/p&gt;</description></item><item><title>サウンドとカラー設定</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_06/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_06/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="設定シングルトン"&gt;設定シングルトン&lt;/h2&gt;
&lt;p&gt;まず、スクリプトタブで［ファイル］→［新規スクリプト］を選択して新しいスクリプトを追加してください。スクリプト名は &lt;code&gt;settings.gd&lt;/code&gt; とします。&lt;/p&gt;
&lt;p&gt;このスクリプトでは、ゲームの設定パラメーターを配置します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; enable_sound &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; enable_music &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; circles_per_level &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;スクリプトを 自動読み込み に登録するには、「プロジェクト設定」を開き、「自動読み込み」タブを選択してください。ロードしたいスクリプトのフォルダをクリックし、その後「追加」をクリックします。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-e1fc012d251352854236aff8a0ca0f08" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_06_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-e1fc012d251352854236aff8a0ca0f08"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_06_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="サウンドの追加方法"&gt;サウンドの追加方法&lt;/h2&gt;
&lt;p&gt;サウンドを再生するために、複数の&lt;code&gt;AudioStreamPlayer&lt;/code&gt;ノードを異なるシーンに追加してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まず &lt;code&gt;Main&lt;/code&gt; シーンに「Music」という名前を追加してください。&lt;em&gt;Stream&lt;/em&gt; プロパティには &lt;code&gt;res://assets/audio/Music_Light-Puzzles.ogg&lt;/code&gt; を使いましょう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Screens&lt;/code&gt; シーンに新たに「Click(クリック)」という画面を追加してください。ボタンをタップした際にこの画面が表示されるようにします。アセットフォルダから&lt;code&gt;menu_click.wav&lt;/code&gt;を使用します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Circle&lt;/code&gt;シーンに、名前を『Beep』としたオーディオプレイヤーを追加し、&lt;code&gt;89.ogg&lt;/code&gt;サウンドファイルを使用します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最後にジャンパー部では、「ジャンプ」と「キャプチャー」の2種類の効果音が必要です。それぞれ&lt;code&gt;70.ogg&lt;/code&gt;と&lt;code&gt;88.ogg&lt;/code&gt;を使いましょう。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;サウンドを再生するには、それぞれの &lt;code&gt;play()&lt;/code&gt; メソッドを呼び出すだけです。&lt;code&gt;Main.new_game()&lt;/code&gt; にこれを追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; settings&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;enable_music&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Music&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;play&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;および &lt;code&gt;Main._on_Jumper_died()&lt;/code&gt; 関数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; settings&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;enable_music&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Music&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;stop&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Screens.gd&lt;/code&gt; ファイルの &lt;code&gt;_on_button_pressed()&lt;/code&gt; 関数に以下を追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; settings&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;enable_sound&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Click&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;play&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;円軌道において、限定された円（制限軌道）が1周完了した際に&lt;code&gt;ビープ音&lt;/code&gt;を再生したいです。これは&lt;code&gt;check_orbits()&lt;/code&gt;関数内で実装します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;current_orbits &lt;span style="color:#81a1c1"&gt;-=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; settings&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;enable_sound&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Beep&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;play&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして &lt;code&gt;Jumper.gd&lt;/code&gt; に、次のようにサウンドを追加します:&lt;/p&gt;</description></item><item><title>動く円</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_07/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_07/index.html</guid><description>&lt;h2 id="バグ修正について"&gt;バグ修正について&lt;/h2&gt;
&lt;p&gt;まず最初に取り組むべきは、メニューシステムの不具合修正です。「スタート」ボタンを押すと新しいゲームが開始されますが、画面が切り替わる途中で再びボタンを押せる状態になってしまいます。試しに「連打」してみてください。大変なことになりますよ！&lt;/p&gt;
&lt;p&gt;この問題は、画面遷移中にボタンを無効化することで解決できます。すべてのボタンが「buttons」グループに属しているため、&lt;code&gt;call_group()&lt;/code&gt; 関数を使えば簡単に実装できます。&lt;/p&gt;
&lt;p&gt;以下に更新済みの &lt;code&gt;BaseScreen.gd&lt;/code&gt; を示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;CanvasLayer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#d08770"&gt;@onready&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; tween &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; $Tween
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;appear&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;get_tree&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;call_group&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;buttons&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;set_disabled&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;interpolate_property&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;offset:x&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;500&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b48ead"&gt;0.5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;TRANS_BACK&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;EASE_IN_OUT&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;start&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;disappear&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;get_tree&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;call_group&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;buttons&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;set_disabled&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;interpolate_property&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;offset:x&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;500&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#b48ead"&gt;0.5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;TRANS_BACK&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;Tween&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;EASE_IN_OUT&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tween&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;start&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スコアとレベルについて"&gt;スコアとレベルについて&lt;/h2&gt;
&lt;p&gt;スコアが上がるにつれ、ゲームの難易度も適切に上昇させる必要があります。つまり、得点を獲得した際には一定の閾値（&lt;code&gt;circles_per_level&lt;/code&gt;）に達したかどうかを確認する必要が生じます。また、ジャンプで円に乗る以外にも、得点を獲得する手段が存在するかもしれません。これを管理しやすくするため、メインスクリプト内でスコア変数に&lt;code&gt;setget&lt;/code&gt;メソッドを定義します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; score &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; setget set_score
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; level &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、&lt;code&gt;new_game()&lt;/code&gt;関数でそのメソッドを使用するよう更新してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;new_game&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;score &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; level &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同じように&lt;code&gt;_on_Jumper_captured()&lt;/code&gt;内のスコア変更処理も修正し、HUD更新ロジックを新規メソッド&lt;code&gt;set_score()&lt;/code&gt;に移動させます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;_on_Jumper_captured&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;object&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $Camera2D&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; object&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;position
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; object&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;capture&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;player&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;call_deferred&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;spawn_circle&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;score &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;set_score&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $HUD&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;update_score&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;score&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; score &lt;span style="color:#81a1c1"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;and&lt;/span&gt; score &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; settings&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;circles_per_level &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; level &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $HUD&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;show_message&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Level &lt;/span&gt;&lt;span style="color:#a3be8c"&gt;%s&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;str&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;level&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このゲームを試してみると、5ポイントに達した時点で画面に「レベル2」のメッセージが表示されるはずです。&lt;/p&gt;
&lt;h2 id="移動する円"&gt;移動する円&lt;/h2&gt;
&lt;p&gt;レベルアップに伴う難易度上昇の仕組みとして、サークルの動きを変化させる方法を採用します。既に静的タイプと限定的移動可能なタイプという複数のサークル種類が存在していますが、これらはいずれも動的な動きを可能にするべき機能を備えているため、新たなタイプを追加するわけではありません。むしろ、これは任意のサークルに付与できるプロパティとして実装されます。&lt;/p&gt;
&lt;p&gt;シーン&lt;code&gt;Circle&lt;/code&gt;を開き、&lt;code&gt;Tween&lt;/code&gt;ノードを「MoveTween」という名前で追加してください。これをサークルスクリプトの先頭に追加してください。&lt;/p&gt;</description></item><item><title>モバイル広告</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_11/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_11/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="広告について"&gt;広告について&lt;/h2&gt;
&lt;p&gt;無料プレイ型モバイルゲームを開発する際、収益化手段としてアプリ内課金と広告の2つの選択肢があります。本記事では、モバイル広告プラットフォーム（AdMob）をゲームに統合する方法について解説します。&lt;/p&gt;
&lt;p&gt;広告は必ずしも好まれるものではなく、その導入の有無は個々のゲーム開発者が判断すべき事項です。本チュートリアルではメリット・デメリットの検討には踏み込みません。ここでは「もし広告を実装したい」と考えている方向けに、その方法を丁寧に解説します。&lt;/p&gt;
&lt;h2 id="admobの設定する"&gt;AdMobの設定する&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.admob.com/" target="_blank"&gt;AdMob&lt;/a&gt;に移動してアカウントを作成してください。&lt;/p&gt;
&lt;p&gt;アドモブマネージャーで新しいアプリを作成します - アプリは「サークルジャンプ」というタイトルです - そして「Android」プラットフォームを指定します（iOSについては後ほど説明します）。&lt;/p&gt;
&lt;p&gt;「Circle Jump」アプリでは、「広告ユニット」を3種類作成が必要です。これらはゲーム内で表示可能な各種広告形式です。今回のチュートリアルでは、「バナー広告」と「インタースティシャル広告」が必要になります。各広告ユニットには「Ad Unit ID」という文字列が割り当てられます（これは後でゲーム内で使用します）。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-cb5708a099c32b3e52e6a88dad08cd18" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_11_01.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-cb5708a099c32b3e52e6a88dad08cd18"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_11_01.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="godotモジュールの使用について"&gt;Godotモジュールの使用について&lt;/h2&gt;
&lt;p&gt;Godot はデフォルトでは広告サービスをサポートしていないため、この機能を追加するにはエンジンモジュールまたはプラグインを使用が必要です。使用するモジュールはこちらから確認できます。 &lt;a href="https://github.com/kloder-games/godot-admob" target="_blank"&gt;godot-admob&lt;/a&gt;。
このページには、プラグインが提供するメソッドの一覧が記載されています。&lt;/p&gt;
&lt;p&gt;カスタムエンジンモジュールを使用するには、エンジンの再コンパイルが必要です。モバイルプラットフォームの場合、デフォルトでダウンロードしたエクスポートテンプレートは本モジュールに対応した形でコンパイルされていないため、それらも再コンパイルが必要です。&lt;/p&gt;
&lt;p&gt;エクスポートテンプレートのコンパイルは難しくありませんが、コンピュータ上にビルド環境を設定する必要があります。これには、Godotをビルドするために必要なプログラムやライブラリをダウンロードすることが含まれます。この概念に慣れておらず詳しく知りたい場合は、公式ドキュメントの [コンパイル] セクションを参照してください &lt;a href="https://docs.godotengine.org/ja/latest/development/compiling/introduction_to_the_buildsystem.html" target="_blank"&gt;Compiling&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;幸いなことに、カスタムエクスポートテンプレートの作成は既に完了しています。&lt;a href="https://github.com/Shin-NiL/godot-custom-mobile-template" target="_blank"&gt;godot-custom-mobile-templates&lt;/a&gt; GitHubリポジトリに移動してください。「リリース」タブを開き、自分の使用しているGodotバージョンに対応したエクスポートテンプレートをダウンロードします。&lt;/p&gt;
&lt;div class="box notices cstyle warning"&gt;
&lt;div class="box-label"&gt;&lt;i class="fa-fw fas fa-exclamation-triangle"&gt;&lt;/i&gt; 警告&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;エクスポートテンプレートのバージョンは&lt;strong&gt;必ず&lt;/strong&gt;Godotエディタのバージョンと一致している必要があります。カスタムビルド版のエディタを使用している場合は、同じコードブランチからテンプレートも構築が必要です。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;テンプレートをコンピュータの任意の場所に解凍してください（Circle Jumpプロジェクトフォルダには入れないでください）。&lt;/p&gt;
&lt;h2 id="エクスポートの設定"&gt;エクスポートの設定&lt;/h2&gt;
&lt;p&gt;Godot エディターに戻って、エクスポート設定に変更を加える必要があります。まず、&lt;em&gt;プロジェクト -&amp;gt; プロジェクト設定&lt;/em&gt; を開き、「Android」セクションを見つけてください。&lt;em&gt;モジュール&lt;/em&gt; プロパティには、コードで使用するモジュールをリストします。モジュール名は &lt;code&gt;godot-admob&lt;/code&gt; ページに記載されています。&amp;ldquo;org/godotengine/godot/GodotAdMob&amp;rdquo;。使用するモジュールが複数ある場合は、カンマで区切ってください。&lt;/p&gt;
&lt;p&gt;_プロジェクト設定 -&amp;gt; エクスポートメニューでは、ダウンロードしたカスタムテンプレートを使用するようにGodotに指示が必要です。これらは［カスタムパッケージ］セクションで設定します。フォルダアイコンをクリックして、テンプレートを解凍したディレクトリに移動してください。「デバッグ」と「リリース」両方のテンプレートを必ず追加してください。&lt;/p&gt;
&lt;p&gt;
&lt;a href="#image-f9ccaaba587d07042217b66db208a9b4" class="lightbox-link"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_11_02.png" alt="alt" style="height: auto; width: auto;" loading="lazy"&gt;
&lt;/a&gt;
&lt;a href="javascript:history.back();" class="lightbox" id="image-f9ccaaba587d07042217b66db208a9b4"&gt;
&lt;img src="https://kamera25.github.io/godot_recipes/4.x/img/cj_11_02.png" alt="alt" class="lightbox-image" loading="lazy"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="コード例"&gt;コード例&lt;/h2&gt;
&lt;p&gt;現在ゲームを実行すると（Android端末上で）、指定したモジュールが読み込まれるようになります。これはエンジンのシングルトン経由でアクセスできます。&lt;code&gt;settings.gd&lt;/code&gt;ファイルを開いて、以下の内容を追加してください。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; admob &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; real_ads &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; banner_top &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# Fill these from your AdMob account:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; ad_banner_id &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; ad_interstitial_id &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; enable_ads &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これはモジュール用の設定変数です。&lt;code&gt;real_ads&lt;/code&gt; を &lt;code&gt;false&lt;/code&gt; に設定すると「テスト広告」モードになります。ゲームリリース準備が整うまでは、これを &lt;code&gt;true&lt;/code&gt; に変更しないでください。&lt;code&gt;banner_top&lt;/code&gt; は、バナー広告を画面上部に表示するか下部に表示するかを切り替えるトグルです。&lt;/p&gt;</description></item><item><title>設定を保存しよう</title><link>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_12/index.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kamera25.github.io/godot_recipes/4.x/ja/games/circle_jump/circle_jump_12/index.html</guid><description>&lt;div class="box notices cstyle tips"&gt;
&lt;div class="box-label"&gt;ℹ️ 留意事項&lt;/div&gt;
&lt;div class="box-content"&gt;
&lt;p&gt;この記事は Godot 3から Godot 4 へ内容の書き換え中です。
Godot4では存在しない変数、関数が含まれている場合があります。もしその場合はリポジトリの&lt;a href="https://github.com/kamera25/godot_recipes/issues" target="_blank"&gt;Issues&lt;/a&gt;までご報告ください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="設定の保存について"&gt;設定の保存について&lt;/h2&gt;
&lt;p&gt;ゲームに追加した3つの切り替え可能プロパティは正常に動作していますが、アプリケーションを終了すると設定が保存されません。次回起動時にも同じ設定値が保持されるよう、これらを設定が必要です。&lt;/p&gt;
&lt;p&gt;まず、設定ファイル &lt;code&gt;res://settings.gd&lt;/code&gt; で定義を行います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; settings_file &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;user://settings.save&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、保存したい3つのゲーム設定について、保存／読み込み機能を追加していきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript" data-lang="gdscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;save_settings&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; f &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; File&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;new&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;open&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;settings_file&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; File&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;WRITE&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;store_var&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;enable_sound&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;store_var&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;enable_music&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;store_var&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;enable_ads&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;close&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;load_settings&lt;/span&gt;&lt;span style="color:#eceff4"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; f &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; File&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;new&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;file_exists&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;settings_file&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;open&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;settings_file&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; File&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;READ&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable_sound &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_var&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable_music &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_var&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;self&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;enable_ads &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;get_var&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;close&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;load_settings()&lt;/code&gt; を呼び出すタイミングを次のように変更してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;set_enable_ads()&lt;/code&gt; の終了時に &lt;code&gt;_ready()&lt;/code&gt; 内で呼び出す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;save_settings()&lt;/code&gt; の終了時にも同じく &lt;code&gt;_ready()&lt;/code&gt; 内で呼び出す
さらに、&lt;code&gt;Screens.gd&lt;/code&gt; ファイルでは、サウンド/音楽設定が変更された際に状態を保持する必要があるため、match 文内の各ケース部分に &lt;code&gt;settings.save_settings()&lt;/code&gt; を追加が必要です。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;別の課題として、ゲーム起動時に設定メニューのアイコンが保存ファイルから読み込んだ状態を反映しない問題があります。これは&lt;code&gt;register_buttons()&lt;/code&gt;関数で対処できます。すでにこの関数は全てのボタンをループ処理してシグナル接続を行っています。&lt;/p&gt;</description></item></channel></rss>