見出し画像

【Godot】キャラが画面端を越えると反対側から出てくる動きの作り方【wrapf】

Godot3.23

今回はスーパーマリオUSAやドラクエの世界地図のような東西南北が繋がっているかのような挙動を作っていきます。

プレイヤーシーンを作成

画像2

Player:Area2Dノード
PlayerSprite:プロジェクトを作成したら入っているicon.png
CollisionShape2D:Inspectorタブ > Shapeで適当な当たり判定を設定

PlayerシーンにGDScriptをアタッチして、下記の通り記述

extends Area2D

# プレイヤーの移動速度
var speed = 300.0

func _process(delta):  
	# キーボードの矢印キーで移動 
	var direction = Vector2.ZERO  
	if Input.is_action_pressed("ui_right"):  
		direction.x += 1  
	if Input.is_action_pressed("ui_left"):  
		direction.x -= 1  
	if Input.is_action_pressed("ui_up"):  
		direction.y -= 1  
	if Input.is_action_pressed("ui_down"):  
		direction.y += 1
	 
	# 斜め移動の速度が上下左右のときと同じになるようにする 
	if direction.length() > 1:  
		direction = direction.normalized()
	
	# 移動する処理
	position += direction * speed * delta
	
	# 画面のサイズを参照する
	var screen_size = get_viewport_rect().size
	# プレイヤーの移動を画面サイズ内までにして、プレイヤーが端まで移動した場合は画面の反対側から現れるようにする
	global_position.x = wrapf(global_position.x, 0 - $PlayerSprite.texture.get_width()/2, screen_size.x + $PlayerSprite.texture.get_width()/2)
	global_position.y = wrapf(global_position.y, 0 - $PlayerSprite.texture.get_height()/2, screen_size.y + $PlayerSprite.texture.get_height()/2)

wrapf(数値, 下限値, 上限値)とは

数値が下限値から上限値の間で変動。下限値より下がると上限値になり、上限値を越えると下限値になる。
wrapfのこの性質を利用して、今回はプレイヤーのx座標とy座標を画面のxy座標内で変動させることで画面の反対から現れる動きを作っています。

画像2

$PlayerSprite.texture.get_width()/2は「プレイヤー画像の半分のサイズ」という意味で、これを下限値と上限値の計算に組み込んだことでプレイヤーが画面から見えなくなってから反対側へ移動するようにしています。
こうしなくても反対側から出てくるにはくるのですが、その場合(プレイヤーの座標が画像の中心なので)体が半分隠れた時点でパッと瞬間移動してしまうのでこうしました。


この記事が気に入ったらサポートをしてみませんか?