GodotEngineゲームエンジンでのプラットフォーマー実装の仕組み

こんにちは、私はGodot Engineでゲームを開発して約2年になります。そこで、基本的なプラットフォームの仕組みを実装するためのプログラムコードのコレクションを作成することにしました。このコレクションは、Godotエンジンを使用する新規ユーザー向けに設計されています。



そして、はい、後続の記事へのさらなるリンクが提供されます。



ベースコード



キャラクターが物理学に従うためには、_process()または_physics_process()メソッドでmove_and_slide()を呼び出す必要があります。



次のコードでは、静的型付けを使用します。



extends KinematicBody2D
#     gdscript   ,    python

var velocity: Vector2 = Vector2.ZERO 	#   .
					#     
					#   

func _physics_process(_delta: float) -> void:
	#     
	
	
	self.velocity = self.move_and_slide(self.velocity, Vector2(0, -1)) 
	#        .
	#   -  ,    .
	#      .


このコードは、他のオブジェクトとの衝突に応じてKinematicBody2Dオブジェクトを移動させるのに十分ですが、このオブジェクトを制御することはできません。特にプラットフォーマーでは、このオブジェクトはまだ落下できません。オブジェクトが落下し始めるには、self.velocity.yの値を正の値だけ増やす必要があります。実際、Godot Engineは、2Dモードで左上隅から右下隅までの両方の座標を計算します。オブジェクトが落下するためには、加速に何かを追加する必要があります。私は通常、プログラムの最初に与えられるGRAVITY定数を使用します。次に、オブジェクトが落下するようにコードに変更が加えられます。



extends KinematicBody2D

const GRAVITY: int = 40
#    40   ,     


var velocity: Vector2 = Vector2.ZERO 	#  


func _physics_process(_delta: float) -> void:
	#     

	#     
	self.velocity.y += GRAVITY
	#   _delta  ,     self.move_and collide
	self.velocity = self.move_and_slide(self.velocity, Vector2(0, -1))
	#  ,      .    .


1つのメソッドを複雑にしすぎないように、移動制御は別のメソッドで実装する必要があります。さらに、1つの記事で同じコードが33回繰り返されることに誰も耐えられません。



引っ越し



私は最近、キャラクターを制御する興味深い方法を学びました。これは、私が習得した最初の方法の代替となりました。次に、両方の方法を示します。



  • 私にとって最初の新しい方法
  • func move_character() -> void:
    	var direction: float = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left") 
    	#         
    	#  (+  x,  0  1)  (-  x,  0  1).
    	#   = 0,   < 0  ,     
    	# ,    .
    	self.velocity.x = direction * MOVE_SPEED #   .
    #  const MOVE_SPEED = #      const GRAVITY
    
  • 2番目の方法
  • func move_character() -> void: #  
    	var direction: float = 0
    	if Input.is_action_pressed("ui_left"):
    		direction = -1
    	elif Input.is_action_pressed("ui_right"):
    		direction = 1
    	else:
    		direction = 0
    	self.velocity.x = direction * MOVE_SPEED
    #  const MOVE_SPEED = #   #  const GRAVITY
    


跳ねる、弾む



ジャンプは、最初の移動方法とほぼ同じくらい簡単かつ明確に実現されます。これを行うには、最初の移動速度としてジャンプ力定数を作成し、重力の値よりも大きい値を設定する必要があります。プログラムコードに直接行きましょう:



func jump() -> void:
	if self.is_on_floor(): # ,    .
	#     ,      
		if Input.is_action_pressed("ui_jump"): #    
				#  ui_jump      .
				#   "ui_up"
			self.velocity.y -= JUMP_POWER
# const JUMP_POWER...          


マップを描いたり、メインコードに直接関係のない衝突などを追加したりするだけで、ゲームキャラクターの場合、最終的に場所を通過するように調整することができますが、これまでのところ、他のコードフラグメントをより正確に説明する方法がわからないため、これについてはまた別の機会です。 、これはメッセージの範囲を超えています。



All Articles