ميكانيكا تنفيذ المنصات على محرك لعبة GodotEngine

مرحبًا ، لقد طورت ألعابًا على Godot Engine لمدة عامين تقريبًا ، لذلك قررت إنشاء مجموعة من كود البرنامج لتنفيذ آليات platforming الأساسية. تم تصميم هذه المجموعة للمستخدمين الجدد الذين يستخدمون محرك Godot.



ونعم ، سيتم توفير روابط إضافية للمقالات اللاحقة.



الكود الأساسي



لكي تطيع الشخصية الفيزياء ، تحتاج إلى استدعاء move_and_slide () في طريقة _process () أو _physics_process ().



خلال الكود التالي ، سأستخدم الكتابة الثابتة.



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 يحسب كلا الإحداثيين من الزاوية اليسرى العليا إلى أسفل اليمين في الوضع ثنائي الأبعاد. لكي يسقط الجسم ، عليك إضافة شيء ما إلى التسارع. عادةً ما أستخدم ثابت 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))
	#  ,      .    .


يجب تنفيذ التحكم في الحركة بطريقة منفصلة ، حتى لا يتم تعقيد طريقة واحدة كثيرًا. علاوة على ذلك ، لا أحد يستطيع تحمل تكرار نفس الرمز في مادة واحدة 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
    
  • الطريقة الثانية
  • 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