godot

L002_1 Godot tips


godot4.x(2)の覚書です。

カメラ

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.

プレイヤーに固定

カメラをプレイヤーに固定します。(参考:L011 ゲーム構成 プレイヤー

プレイヤー(紫)を作成して、Cameraを子に設置します。

CameraのノードをPlayerの子にしたので、スクリプトをそのように変更します。
スクリプトの変更箇所は、以前はCameraノードを操作するようにしていた箇所を、
playerのノードへ切り替えます。

@onready var Camera = $Player/Camera2D # カメラ.
@onready var Player = $Player # プレイヤー        #追加
#@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
		Player.position.y -= 100*delta                   #追加
	if Input.is_action_pressed("ui_down"):
		#Camera.position.y += 100*delta # movedown
		Player.position.y += 100*delta                   #追加
	if Input.is_action_pressed("ui_left"):
		#Camera.position.x -= 100*delta # moveleft
		Player.position.x -= 100*delta                   #追加
	if Input.is_action_pressed("ui_right"):
		#Camera.position.x += 100*delta # moveright
		Player.position.x += 100*delta                   #追加
	if Input.is_action_pressed(("ui_select"))|| Input.is_action_pressed(("start")):
	# 画面揺らす
		Camera.offset = Vector2.ZERO
		moveCam -= delta
		if moveCam < 0:
GitHub - WOCae/L002 at r3
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)

Area2D

PlayerはCharacterBody2Dシーン
mobはRigidBody2Dシーン
それぞれのシーンにArea2Dを設定して、干渉した場合を出力します。

GitHub - WOCae/L202
Contribute to WOCae/L202 development by creating an account on GitHub.

サンプルは、コリジョンとパスを表示設定します。

シグナル

干渉物があった場合、クラス名で処理を行います。
クラス名は、それぞれのシーンで宣言しておきます。

コードによる切り替え

1階と2階があるような構造で、階層を接触で表現する場合の切り替え。

RigidBody2Dについて

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

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

タイルマップ

TileMapシーンを追加、タイルのサイズを32x32に、干渉のレイヤーを設定。
タイルマップ画像(32x32を3行7列)を設定。
任意で一つを選択して、干渉領域を設定します。

タイルマップの編集です。
領域を選択して、Ctrl+C、Ctrl+V、delateで操作できます。

乱数

整数

以下は0から3までの整数をランダムに返します。
配列の引き当てなどに使用します。

randi_range(0,3)

コメント