godot4.xの覚書です。
ファイル設定
ゲーム実行
ゲームを実行する始めのシーンはメニュー>プロジェクトからメインシーンを指定します。
画面設定
サイズ
プロジェクト設定の場合
スクリプトの場合
スクリプトで画面表示を変更します。
extends Node
#var size = Vector2(600.0, 800.0)
#var size = Vector2(600.0, 800.0)
var size = Vector2(1800, 1380)
func _ready():
# 画面サイズを 1800x600 に設定します。
get_viewport().set_size(size)
キー入力
キー入力
キー入力は既定の設定でされているものを使用します。(名称をコード内に記入します)
インプット種類
is_action_just_pressed
キーを押した時に入力が発生します。
Input.is_action_just_pressed("キー設定"):
is_action_just_released
キーを離した時に入力が発生します。
フォント
作成したいものの雰囲気に合うようなフォントを設定します。フォントはさまざまなサイトで公開されています。
フォントの設定
グーグルフォントのサイトから「PressStart2P」をダウンロードします。ファイルを解凍して、ttfファイルをインポートします。
フォントスペースのサイトから「PixelMplus」
スクリプト GDScript
GDScriptは、PythonやJavaScriptのような構文を持つ、軽量で動的型の言語です。Godotの公式ドキュメントには、GDScriptの基本的な使い方から、より高度な機能まで解説するチュートリアルが用意されています。
godotリファレンス
for文
任意回数
for i in range(2):
pass
上記のrange(2)だとiには0と1の整数が入る。
時間
ゲーム内の時間
extends Node2D
var elapsed_time:float
var elapsed_time_ph:float
func _process(delta):
elapsed_time += delta
$elapsed_time.text = "経過時間"+"%7.1f" % elapsed_time
func _physics_process(delta):
elapsed_time_ph += delta
$elapsed_time_ph.text = "経過時間"+"%7.1f" % elapsed_time_ph
_processと_physics_processの違い
Godotでは、ノードの処理に関わる重要な2つのメソッドとして
_process
と_physics_process
が存在します。それぞれの役割と違いを理解することは、ゲームロジックを正しく実装するために重要です。_process
- 毎フレーム呼び出され、ゲームロジックの大部分を記述する場所
- 処理速度はCPU速度に依存し、フレームレートと同期していない
- 入力処理、キャラクターアニメーション、AI、ゲーム状態管理など、フレーム毎に更新が必要な処理を行う
- 処理速度が一定ではないため、時間経過に依存する処理には不向き
_physics_process
- 物理シミュレーションと同期して呼び出され、物理エンジンと連携する場所
- 処理速度は "Physics FPS" 設定によって固定され、フレームレートとは独立
- 物理オブジェクトの移動、衝突判定、力学計算など、物理シミュレーションに関わる処理を行う
- 処理速度が一定であるため、時間経過に依存する処理や正確な物理シミュレーションを実現するのに適している
まとめ
メソッド 役割 処理速度 同期 適した処理 _process
ゲームロジック CPU速度依存 フレームレート 入力処理、アニメーション、AI、状態管理 _physics_process
物理シミュレーション "Physics FPS" 設定 物理シミュレーション 物理オブジェクトの移動、衝突判定、力学計算 drive_spreadsheetGoogle スプレッドシートにエクスポート
例
- プレイヤーキャラクターの移動処理は
_process
で行う- 物理オブジェクトの落下処理は
_physics_process
で行う注意点
Geminiより
_process
と_physics_process
は互いに呼び出すことはできない_physics_process
は物理シミュレーションにのみ使用し、ゲームロジックは記述しない
Engine.set_time_scaleについて
ヒットストップモーションなどを実現させるため、タイムスケールを変更させる場合に使用します。
Engine.set_time_scale
は、ゲーム全体の時間の流れを調整する関数です。引数として渡した値によって、ゲームの速度を遅くしたり、速くしたりすることができます。使い方
Engine.set_time_scale(scale)
scale
: 時間スケール。1.0で通常速度、0.0で停止、2.0で2倍速など。例
- スローモーション効果を実現したい場合:
Engine.set_time_scale(0.5) # ゲーム速度を半減
- ゲームを早送りしたい場合:
Engine.set_time_scale(2.0) # ゲーム速度を2倍
注意点
geminiより
Engine.set_time_scale
は、物理シミュレーションにも影響を与えます。- 時間スケールを変更すると、ゲームの挙動がおかしくなる場合があるので、注意が必要です。
- 一部のノードは時間スケールの影響を受けない場合があります。
カラー
シーンのフォントや形状についてはインスペクターからもカラー設定ができます。
また、スクリプトでも設定できます。
カラーの指定はいくつか行えます。以下はhtmlのカラーコードです。
$Label.text = "shooter"
$Label.add_theme_font_size_override("font_size",30)
$Label.add_theme_color_override("font_color", Color.html("#ff0000"))
$Line2D.modulate = Color.html("#eae210")
カメラ
2D
extends Node2D
#時間の表示
var elapsed_time:float
var elapsed_time_ph:float
@onready var Camera = $Camera2D # カメラ.
#@export var speed = 5
var moveCam: float = 0
const moveTime = 0.5
func _process(delta):
elapsed_time += delta
$elapsed_time.text = "経過時間"+"%7.1f" % elapsed_time
var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
Camera.position.y -= 100*delta # moveup
if Input.is_action_pressed("ui_down"):
Camera.position.y += 100*delta # movedown
if Input.is_action_pressed("ui_left"):
Camera.position.x -= 100*delta # moveleft
if Input.is_action_pressed("ui_right"):
Camera.position.x += 100*delta # moveright
if Input.is_action_pressed(("ui_select"))|| Input.is_action_pressed(("start")):
# 画面揺らす
Camera.offset = Vector2.ZERO
moveCam -= delta
if moveCam < 0:
var rate = moveCam / moveTime
var vx = 64 * rate
var vy = 16 * rate
Camera.offset.x = randi_range(-vx, vx)
Camera.offset.y = randi_range(-vy, vy)
return
Camera.offset = Vector2.ZERO
moveCam = 0
func _physics_process(delta):
elapsed_time_ph += delta
$elapsed_time_ph.text = "経過時間"+"%7.1f" % elapsed_time_ph
3D
参考
ファイルの読み書き
テキストファイルの読み書きを行います。
設定の整理など表計算ソフトで行うと便利です。
extends Node2D
#import File
func _ready():
#ファイルの書込み
var string1 = "testLine1\ntestLine2"
var file1 = FileAccess.open("string.txt", FileAccess.WRITE)
file1.store_string(string1)
file1.close()
#ファイルの読み込み
var file2 = FileAccess.open("data.txt", FileAccess.READ)
var line = file2.get_csv_line()
while line.size() >= 3:
# 横方向の項目数が足りない場合は終了
print("colm1: %s" % line[0])
print("colm2: %s" % line[1])
print("colm3: %s" % line[2])
print("colm4: %s" % line[3])
line = file2.get_csv_line()
file2.close()
#テキストでの読み込み
var file = FileAccess.open("res://data.txt", FileAccess.READ)
var line2 = file.get_as_text()
#print(line.size())
print("line2:\n",line2)
var row1 = line2.split("\n") #行の取得
var colum1 = row1[0].split(",") #列の取得
print("row1:",row1[0])
print("colum1:",colum1[0])
file.close()
スプライトアニメーション
2コマで犬が歩くアニメーションです。
extends Area2D
func _ready() -> void:
position = Vector2(400,500)
func _process(delta: float) -> void:
$AnimatedSprite2D.animation = &"walk"
$AnimatedSprite2D.play()
以下の表題とリビジョンは対応します。
左に移動(r1)
extends Area2D
const SPEED := 15.0
func _ready() -> void:
position = Vector2(400,500)
scale = Vector2(2,2)
func _process(delta: float) -> void:
#$AnimatedSprite2D.animation = &"walk"
#$AnimatedSprite2D.play()
var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_left"):
velocity.x -= 1*delta
$AnimatedSprite2D.animation = &"walk"
$AnimatedSprite2D.flip_h = false
position += velocity.normalized() * SPEED
$AnimatedSprite2D.play()
上下左右に移動(r2)
上下左右のキーを設定して対応するアニメーションを呼ぶようにします。
extends Area2D
const SPEED := 15.0
func _ready() -> void:
position = Vector2(400,500)
scale = Vector2(2,2)
func _process(delta: float) -> void:
#$AnimatedSprite2D.animation = &"walk"
#$AnimatedSprite2D.play()
var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_left"):
velocity.x -= 1*delta
$AnimatedSprite2D.animation = &"walk"
$AnimatedSprite2D.flip_h = false
if Input.is_action_pressed("ui_right"):
velocity.x += 1*delta
$AnimatedSprite2D.animation = &"walk"
$AnimatedSprite2D.flip_h = true
if Input.is_action_pressed("ui_up"):
velocity.y -= 1*delta
$AnimatedSprite2D.animation = &"up"
if Input.is_action_pressed("ui_down"):
velocity.y += 1*delta
$AnimatedSprite2D.animation = &"down"
position += velocity.normalized() * SPEED
$AnimatedSprite2D.play()
干渉(Collision)
RigidBody2Dについて
解除する場合はfalse、適用する場合にはtrueにします。
<Rigid>.set_collision_layer_value(1, false)
<Rigid>.set_collision_mask_value(1, false)
コメント