godot

L002 Godot tips


godot4.xの覚書です。

ファイル設定

ゲーム実行

ゲームを実行する始めのシーンはメニュー>プロジェクトからメインシーンを指定します。

画面設定

サイズ

プロジェクト設定の場合

v4.2.stable.official [46dc27791]

スクリプトの場合

スクリプトで画面表示を変更します。

global.gdを作成して既定として読み込んでいます。
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)

キー入力

キー入力

キー入力は既定の設定でされているものを使用します。(名称をコード内に記入します)

インプット種類

InputEvent
Inherits: Resource< RefCounted< Object Inherited By: InputEventAction, InputEventFromWindow, InputEventJoypadButton, Inp...

is_action_just_pressed

キーを押した時に入力が発生します。

Input.is_action_just_pressed("キー設定"):

is_action_just_released

キーを離した時に入力が発生します。

フォント

作成したいものの雰囲気に合うようなフォントを設定します。フォントはさまざまなサイトで公開されています。

Browse Fonts - Google Fonts
Making the web more beautiful, fast, and open through great typography
Free Fonts | 120,000+ Font Downloads | FontSpace
Free downloads of legally licensed fonts that are perfect for your design projects. The best place in the universe to se...

フォントの設定

グーグルフォントのサイトから「PressStart2P」をダウンロードします。ファイルを解凍して、ttfファイルをインポートします。

Labelノードに入力

フォントスペースのサイトから「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		
GitHub - WOCae/L002
Contribute to WOCae/L002 development by creating an account on GitHub.

_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 で行う

注意点

  • _process と _physics_process は互いに呼び出すことはできない
  • _physics_process は物理シミュレーションにのみ使用し、ゲームロジックは記述しない
Geminiより

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倍

注意点

  • Engine.set_time_scale は、物理シミュレーションにも影響を与えます。
  • 時間スケールを変更すると、ゲームの挙動がおかしくなる場合があるので、注意が必要です。
  • 一部のノードは時間スケールの影響を受けない場合があります。
geminiより

カラー

シーンのフォントや形状についてはインスペクターからもカラー設定ができます。
また、スクリプトでも設定できます。

カラーの指定はいくつか行えます。以下は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")

htmlのカラーコード取得

カメラ

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		
GitHub - WOCae/L002 at r1
Contribute to WOCae/L002 development by creating an account on GitHub.

3D

参考

L101 計算ツール1
godot4.2で計算ツールを作成してみました。 godotモデル git L101BeamBend-main.zip 同様のものは以下になります。 作成 プロジェクト設定 このモデルでは、画面サイズの設定をします。メニュー>プロジェクト>...

ファイルの読み書き

テキストファイルの読み書きを行います。
設定の整理など表計算ソフトで行うと便利です。

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()
GitHub - WOCae/L002 at r2
Contribute to WOCae/L002 development by creating an account on GitHub.

スプライトアニメーション

2コマで犬が歩くアニメーションです。

作業
extends Area2D

func _ready() -> void:
	position = Vector2(400,500)	


func _process(delta: float) -> void:	
	$AnimatedSprite2D.animation = &"walk"
	$AnimatedSprite2D.play()
GitHub - WOCae/dog
Contribute to WOCae/dog development by creating an account on GitHub.

以下の表題とリビジョンは対応します。

左に移動(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()
r2はアニメーションのupとdownを入れ替えてます。

干渉(Collision)

RigidBody2Dについて

解除する場合はfalse、適用する場合にはtrueにします。

		<Rigid>.set_collision_layer_value(1, false)
		<Rigid>.set_collision_mask_value(1, false)

コメント