<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x635;&#x646;&#x627;&#x639;&#x629; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628;</title><link>https://academy.hsoub.com/programming/game-development/page/4/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x635;&#x646;&#x627;&#x639;&#x629; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628;</description><language>ar</language><item><title>&#x627;&#x644;&#x627;&#x633;&#x62A;&#x645;&#x627;&#x639; &#x644;&#x645;&#x62F;&#x62E;&#x644;&#x627;&#x62A; &#x627;&#x644;&#x644;&#x627;&#x639;&#x628; &#x641;&#x64A; &#x62C;&#x648;&#x62F;&#x648; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B9-%D9%84%D9%85%D8%AF%D8%AE%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%84%D8%A7%D8%B9%D8%A8-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2384/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_08/-----Godot.png.1ac00eca8f71c67fe0a44ead8305cd76.png" /></p>
<p>
	نشرح في مقال اليوم كيفية إضافة ميزة مهمة لأي لعبة بناء على <a href="https://academy.hsoub.com/programming/game-development/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D9%88%D8%AF%D9%88-godot-r2382/" rel="">المقال السابق </a>الذي أنشأنا فيه سكربت للعبة بسيطة لتحريك أيقونة جودو Godot في مسارات دائرية، ألا وهي إعطاء التحكم بالحركة للاعب، ولذلك نحتاج لتعديل الكود البرمجي الذي كتبناة في ملف <code>sprite_2d.gd</code>.
</p>

<p style="text-align: center;">
	<img alt="1" class="ipsImage ipsImage_thumbnailed" data-fileid="155400" data-ratio="62.40" data-unique="53l1mwan2" style="width: 500px; height: auto;" width="782" src="https://academy.hsoub.com/uploads/monthly_2024_08/1.gif.fbb2c799e4ca29e11a9aa7955686fcf3.gif"><a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="155400" href="https://academy.hsoub.com/uploads/monthly_2024_08/1.gif.fbb2c799e4ca29e11a9aa7955686fcf3.gif" rel=""> </a>
</p>

<p>
	لدينا أداتان رئيسيتان لمعالجة مدخلات اللاعب في جودو هما:
</p>

<ul>
	<li>
		دوال رد نداء الدخل المضمّنة في جودو built-in input callbacks، وبالأخص الدالة <code>_unhandled_input()‎_</code> التي تستدعى لمعالجة الأحداث التي لم يتم التعامل معها بواسطة العقد الأخرى والدالة <code>‎_process()‎</code> وهي دالة افتراضية مضمنّة تستدعيها جودو كل مرة يضغط فيها اللاعب على مفتاح وتُستخدم للتفاعل مع الأحداث التي لا تحصل في كل إطار بشكل مستمر مثل الضغط على <code>Space</code> للقفز، راجع <a href="https://docs.godotengine.org/en/stable/tutorials/inputs/inputevent.html#doc-inputevent" rel="external nofollow">استخدام InputEvent للمزيد عن استرجاع استدعاءات المدخلات</a>
	</li>
	<li>
		الكائن المتفرّد <code>Input</code>، إن الكائنات المتفردة Singelton هي عبارة عن كائنات يمكن الوصول إليها بشكل عام، وتقدم جودو الوصول للعديد منها في السكربتات، إنها الأداة الأفضل لتفقد المدخلات في كل إطار.
	</li>
</ul>

<p>
	سنستخدم الكائن<code>Input</code> لأننا نريد أن نعرف إذا ما كان يريد اللاعب التحرك أو الدوران في كل إطار.
</p>

<p>
	يجب استخدام المتغير الجديد <code>direction</code> من أجل الدوران، استبدل السطر <code>rotation += angular_speed * delta</code> في دالة <code>‎_process()‎</code> بالشيفرة التالية:
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7050_7" style=""><span class="pln">var direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"ui_left"</span><span class="pun">):</span><span class="pln">
    direction </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"ui_right"</span><span class="pun">):</span><span class="pln">
    direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">

rotation </span><span class="pun">+=</span><span class="pln"> angular_speed </span><span class="pun">*</span><span class="pln"> direction </span><span class="pun">*</span><span class="pln"> delta</span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7050_9" style=""><span class="pln">var direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Input</span><span class="pun">.</span><span class="typ">IsActionPressed</span><span class="pun">(</span><span class="str">"ui_left"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    direction </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Input</span><span class="pun">.</span><span class="typ">IsActionPressed</span><span class="pun">(</span><span class="str">"ui_right"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">Rotation</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> _angularSpeed </span><span class="pun">*</span><span class="pln"> direction </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">delta</span><span class="pun">;</span></pre>

<p>
	إن المتغير المحلي <code>direction</code> هو مُضَاعف multiplier يمثل الاتجاه الذي يريد اللاعب الدوران نحوه وزيادته تضخّم مقدار الدوران، وتمثل القيمة <code>0</code> أن اللاعب لم يضغط على مفتاح السهم اليميني أو اليساري، والقيمة <code>1</code> تعني أن اللاعب يريد الدوران نحو اليمين، و<code>‎‎-1</code> تعني أنه يريد الدوران نحو اليسار.
</p>

<p>
	يجب التصريح عن مجموعة شروط واستخدام <code>Input</code> لإنتاج هذه القيم، نبدأ الشرط بالكلمة المفتاحية <code>if</code> في GDScript وننهيها بنقطتين، ويكون الشرط هو التعبير بين الكلمة المفتاحية ونهاية السطر.
</p>

<p>
	نستدعي <code>Input.is_action_pressed()‎</code> للتحقق فيما إذا كان المفتاح مضغوطًا ضمن هذا الإطار، إذ يأخذ التابع سلسلة نصية تمثل المدخلات ويعيد <code>true</code> إذا كان المفتاح قد ضُغط وإلا يعيد <code>false</code>.
</p>

<p>
	إن الفعلين المستخدمين سابقًا "ui<em>left" و "ui</em>right" مُعرفين مسبقًا في جودو، إذ يُفعّلان عندما يضغط اللاعب السهمين اليميني واليساري على لوحة المفاتيح أو الزرين اليمين واليسار على قبضة التحكم.
</p>

<p data-gramm="false">
	<strong>ملاحظة</strong>: يمكن مشاهدة وتعديل المدخلات في المشروع الخاص بك بالذهاب إلى "إعدادات المشروع Project settings" والنقر على تبويبة "خريطة الإدخال Input Map". أخيرًا نستخدم <code>direction</code> كمُضاعف عند تحديث زاوية الدوران <code>rotation</code> الخاص بالعقدة:<br>
	 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2325_7" style=""><span class="pln"> rotation </span><span class="pun">+=</span><span class="pln"> angular_speed </span><span class="pun">*</span><span class="pln"> direction </span><span class="pun">*</span><span class="pln"> delta</span></pre>

<p>
	يجب أن تتحرك الأيقونة عند الضغط على <code>Left</code> و <code>Right</code> عند تشغيل المشهد بهذه الشيفرة.
</p>

<h2 id="up">
	التحرك عند الضغط على Up
</h2>

<p>
	نحتاج لتعديل الشيفرة التي تحسب السرعة velocity من أجل التحرك عند الضغط فقط، بدّل السطر الذي يبدأ بـ <code>var velocity</code> بالشيفرة التالية:
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7050_11" style=""><span class="pln">var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">ZERO
</span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"ui_up"</span><span class="pun">):</span><span class="pln">
    velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">UP</span><span class="pun">.</span><span class="pln">rotated</span><span class="pun">(</span><span class="pln">rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> speed</span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7050_13" style=""><span class="pln">var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="typ">Zero</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Input</span><span class="pun">.</span><span class="typ">IsActionPressed</span><span class="pun">(</span><span class="str">"ui_up"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="typ">Up</span><span class="pun">.</span><span class="typ">Rotated</span><span class="pun">(</span><span class="typ">Rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> _speed</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هيئنا متجه السرعة <code>velocity</code> بالقيمة <code>Vector2.ZERO</code> وهو ثابت مضمّن في نوع <code>Vector</code> يمثل متجه ثنائي الأبعاد بطول 0.
</p>

<p>
	إذا ضغط اللاعب "ui_up" نحدث قيمة السرعة وتتحرك الشخصية إلى الأمام.
</p>

<p style="text-align: center;">
	<img alt="2.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="155401" data-ratio="62.40" data-unique="0tel52clu" style="width: 500px; height: auto;" width="782" src="https://academy.hsoub.com/uploads/monthly_2024_08/2.gif.5c3446e95e11d56e9ff915939786d8ec.gif">
</p>

<h2 id="">
	البرنامج الكامل
</h2>

<p>
	التالي هو الملف الكامل <code>sprite_2d.gd</code> كمرجع.
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7050_15" style=""><span class="pln">extends </span><span class="typ">Sprite2D</span><span class="pln">

var speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">400</span><span class="pln">
var angular_speed </span><span class="pun">=</span><span class="pln"> PI


func _process</span><span class="pun">(</span><span class="pln">delta</span><span class="pun">):</span><span class="pln">
    var direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"ui_left"</span><span class="pun">):</span><span class="pln">
        direction </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"ui_right"</span><span class="pun">):</span><span class="pln">
        direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">

    rotation </span><span class="pun">+=</span><span class="pln"> angular_speed </span><span class="pun">*</span><span class="pln"> direction </span><span class="pun">*</span><span class="pln"> delta

    var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">ZERO
    </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"ui_up"</span><span class="pun">):</span><span class="pln">
        velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">UP</span><span class="pun">.</span><span class="pln">rotated</span><span class="pun">(</span><span class="pln">rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> speed

    position </span><span class="pun">+=</span><span class="pln"> velocity </span><span class="pun">*</span><span class="pln"> delta</span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7050_17" style=""><span class="kwd">using</span><span class="pln"> </span><span class="typ">Godot</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> partial </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MySprite2D</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Sprite2D</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">float</span><span class="pln"> _speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">400</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">float</span><span class="pln"> _angularSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Mathf</span><span class="pun">.</span><span class="typ">Pi</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">_Process</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        var direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Input</span><span class="pun">.</span><span class="typ">IsActionPressed</span><span class="pun">(</span><span class="str">"ui_left"</span><span class="pun">))</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            direction </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Input</span><span class="pun">.</span><span class="typ">IsActionPressed</span><span class="pun">(</span><span class="str">"ui_right"</span><span class="pun">))</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            direction </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="typ">Rotation</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> _angularSpeed </span><span class="pun">*</span><span class="pln"> direction </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">delta</span><span class="pun">;</span><span class="pln">

        var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="typ">Zero</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Input</span><span class="pun">.</span><span class="typ">IsActionPressed</span><span class="pun">(</span><span class="str">"ui_up"</span><span class="pun">))</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="typ">Up</span><span class="pun">.</span><span class="typ">Rotated</span><span class="pun">(</span><span class="typ">Rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> _speed</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="typ">Position</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> velocity </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">delta</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تستطيع الآن الدوران باستخدام الأسهم يمين ويسار والتحرك للأمام عن طريق ضغط <code>Up</code> إذا شغّلت المشهد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="" rel=""> </a>
</p>

<h2 id="-1">
	الخلاصة
</h2>

<p>
	يمثل كل برنامج نصي في جودو صنفًا ويتوسع في الأصناف المضمّنة، إن أنواع العقد التي ترث منها الأصناف الخاص بك تعطيك وصولًا إلى خاصيًات مثل <code>rotation</code> و <code>position</code> كما في حالتنا، ويمكن أيضًا وراثة العديد من الدوال التي لم تُذكر في هذا المثال.
</p>

<p>
	إن المتغيرات التي تضعها في أول الملف بلغة GDScript هي خاصيات الصنف، التي تدعى متغيرات الأعضاء، ويمكن تعريف الدوال التي ستكون في أغلب الأحوال دوال الأصناف الخاصة بك.
</p>

<p>
	تقدم جودو العديد من التوابع الافتراضية التي يمكن تعريفها لتتصل مع الأصناف الخاصة بك مع المحرك، وتضم  الدال<code>ة‎_process()‎‎</code> لتطبيق التغييرات للعقدة في كل إطار، والدالة <code>‎‏‎‎‎‏unhandled_input()‎‎_‏‏‎‏‏‎</code> لاستقبال المدخلات مثل ضغط المفاتيح أو الأزرار من المستخدم، وهناك المزيد أيضًا. كما يسمح الصنف المتفرد <code>Input</code> بالتفاعل مع إدخالات اللاعب في أي مكان من الشيفرة الخاصة بك، وستستخدمها بالتحديد في حلقة <code>‏‏‏‎‏process()‎‎‎_</code>
</p>

<p>
	سنتعلم في الدرس التالي مفهوم الإشارات signals في محرك جودو، وتتمكن من بناء علاقات بين البرامج النصية والعقد عن طريق تشغيل العقد للشيفرات في السكريبتات بشكل يجعل الكود أكثر تنظيمًا وأسهل في الصيانة.
</p>

<p>
	ترجمة - وبتصرف - لقسم <a href="https://docs.godotengine.org/en/stable/getting_started/step_by_step/scripting_player_input.html" rel="external nofollow">Listening to player input</a> من توثيق جودو الرسمي.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D9%88%D8%AF%D9%88-godot-r2382/" rel="">كتابة برنامجك الأول باستخدام جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B9%D9%82%D8%AF-nodes-%D9%88%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%87%D8%AF-scenes-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2357/" rel="">العقد Nodes والمشاهد Scenes في جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sqlite-r2241/" rel="">إعداد محرك الألعاب جودو Godot للعمل مع قاعدة البيانات SQLite</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2384</guid><pubDate>Sun, 11 Aug 2024 15:06:05 +0000</pubDate></item><item><title>&#x643;&#x62A;&#x627;&#x628;&#x629; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C;&#x643; &#x627;&#x644;&#x623;&#x648;&#x644; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62C;&#x648;&#x62F;&#x648; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D9%88%D8%AF%D9%88-godot-r2382/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_08/-----Godot.png.74a5aa803002f7092944750dbd9e1045.png" /></p>
<p>
	في هذا المقال ستبرمج لعبتك الأولى لتحريك أيقونة جودو Godot في مسارات دائرية باستخدام لغة البرمجة GDScript. وسنفترض أنك على معرفة <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">بأساسيات البرمجة</a>، وتعرف ما هي <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%A7%D8%AD%D8%A9-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2371/" rel="">لغات البرمجة المتاحة في محرك الألعاب جودو</a> لتتمكن من تنفيذ برنامجك الأول الذي سيحرك الصورة في مسار دائري كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="155119" href="https://academy.hsoub.com/uploads/monthly_2024_08/1.gif.2e74c734d44a291c68d9d3edd26db575.gif" rel=""><img alt="1" class="ipsImage ipsImage_thumbnailed" data-fileid="155119" data-unique="ay7ze2o7m" src="https://academy.hsoub.com/uploads/monthly_2024_08/1.gif.2e74c734d44a291c68d9d3edd26db575.gif"> </a>
</p>

<h2 id="">
	إعداد المشروع
</h2>

<p>
	من الأفضل إنشاء مشروع جديد للبدء من الصفر، ويجب أن يحتوي مشروعك على صورة واحدة فقط هي أيقونة محرك الألعاب جودو التي تستخدم غالبًا في مجتمع المطورين لبناء النماذج الأولية.
</p>

<p>
	ستحتاج إلى إنشاء عقدة <code>Sprite2D</code> لعرضها في اللعبة، لذا عليك أن تنتقل للتبويب "مشهد Scene"، ثم تنقر فوق الزر"عقدة أخرى Other Node".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155120" href="https://academy.hsoub.com/uploads/monthly_2024_08/2.png.18c460728e22ba8afc37498b528bc5cd.png" rel=""><img alt="2" class="ipsImage ipsImage_thumbnailed" data-fileid="155120" data-unique="flfj8v3if" src="https://academy.hsoub.com/uploads/monthly_2024_08/2.png.18c460728e22ba8afc37498b528bc5cd.png"> </a>
</p>

<p>
	اكتب <code>Sprite2D</code> في شريط البحث لتصفية النتائج، ثم انقر نقرًا مزدوجًا على <code>Sprite2D</code> لإنشاء العقدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155121" href="https://academy.hsoub.com/uploads/monthly_2024_08/3.png.18e6f8e275ce7eee5360412873f0f5e1.png" rel=""><img alt="3" class="ipsImage ipsImage_thumbnailed" data-fileid="155121" data-unique="eggq6fzus" src="https://academy.hsoub.com/uploads/monthly_2024_08/3.png.18e6f8e275ce7eee5360412873f0f5e1.png"> </a>
</p>

<p>
	يُفترض أن تحوي علامة تبويب المشهد الآن على عقدة <code>Sprite2D</code> فقط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155122" href="https://academy.hsoub.com/uploads/monthly_2024_08/4.png.785c9dd3d43d877fcee0b79e1930c571.png" rel=""><img alt="4" class="ipsImage ipsImage_thumbnailed" data-fileid="155122" data-unique="abqp0k53l" src="https://academy.hsoub.com/uploads/monthly_2024_08/4.png.785c9dd3d43d877fcee0b79e1930c571.png"> </a>
</p>

<p>
	تحتاج عقدة <code>Sprite2D</code> إلى خلفية للعرض. وستلاحظ من قائمة "الفاحص" Inspector على اليمين أن خاصية Texture تشير إلى أنها فارغة، لعرض أيقونة جودو، انقر واسحب ملف الأيقونة <code>icon.svg</code> من قائمة نظام الملفات FileSystem إلى الخانة Texture
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155123" href="https://academy.hsoub.com/uploads/monthly_2024_08/5.png.c619dd1dc1c2f00170046005f063afa5.png" rel=""><img alt="5" class="ipsImage ipsImage_thumbnailed" data-fileid="155123" data-unique="v5ygb1qe8" src="https://academy.hsoub.com/uploads/monthly_2024_08/5.png.c619dd1dc1c2f00170046005f063afa5.png"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك إنشاء عقد <code>Sprite2D</code> تلقائيًا عن طريق سحب وإفلات الصور في نافذة العرض، ثم انقر واسحب الأيقونة في نافذة العرض لتثبيتها في وسط نافذة اللعبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155124" href="https://academy.hsoub.com/uploads/monthly_2024_08/6.png.c2900a027cc6363eecd25341d2d89ad2.png" rel=""><img alt="6" class="ipsImage ipsImage_thumbnailed" data-fileid="155124" data-unique="xe1q0zsd6" src="https://academy.hsoub.com/uploads/monthly_2024_08/6.thumb.png.a1456f86a501a45184f39421b800d6bb.png"> </a>
</p>

<h2 id="-1">
	إنشاء نص برمجي جديد
</h2>

<p>
	لإنشاء سكربت أو نص برمجي جديد وربطه بالعقدة، انقر بزر الفأرة الأيمن على <code>Sprite2D</code> في قائمة "المشهد Scene" وحدد خيار "إلحاق نص برمجي Attach Script" كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155125" href="https://academy.hsoub.com/uploads/monthly_2024_08/7.png.732695f6ab94ab6472080c79a2cf15a1.png" rel=""><img alt="7" class="ipsImage ipsImage_thumbnailed" data-fileid="155125" data-unique="m8niikmux" src="https://academy.hsoub.com/uploads/monthly_2024_08/7.png.732695f6ab94ab6472080c79a2cf15a1.png"> </a>
</p>

<p>
	ستظهر نافذة "إلحاق نص برمجي Attach Node Script"، حيث تتيح لك تحديد لغة النص البرمجي ومسار الملف من بين خيارات أخرى.
</p>

<p>
	غيّر حقل "القالب Template" من "Node: Default" (أي عقدة افتراضية) إلى "Object: Empty" (أي كائن فارغ) وذلك لبدء العمل بملف فارغ، ثم اترك الخيارات الأخرى على قيمها الافتراضية وانقر فوق الزر "أنشئ Create" لإنشاء النص البرمجي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155126" href="https://academy.hsoub.com/uploads/monthly_2024_08/8.png.329c61a710f7034d066b82e596b481cf.png" rel=""><img alt="8" class="ipsImage ipsImage_thumbnailed" data-fileid="155126" data-unique="4fx90r7nz" src="https://academy.hsoub.com/uploads/monthly_2024_08/8.png.329c61a710f7034d066b82e596b481cf.png"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: يجب أن تتطابق أسماء ملفات سكربت C#‎ مع اسم الصنف الذي تتبع له. في هذه الحالة، يجب تسمية الملف <code>MySprite2D.cs</code>
</p>

<p>
	من المفترض أن تظهر مساحة عمل لكتابة الكود البرمجي مع فتح ملف <code>sprite_2d.gd</code> الجديد وسطر الشيفرة البرمجية التالية:
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6242_17" style=""><span class="pln">extends </span><span class="typ">Sprite2D</span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6242_10" style=""><span class="kwd">using</span><span class="pln"> </span><span class="typ">Godot</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> partial </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MySprite2D</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Sprite2D</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كل ملف GDScript هو عبارة عن صنف class بشكل ضمني. وتُحدد الكلمة المفتاحية <code>extends</code> الصنف الذي يرثه أو يوسعه هذا الكود  البرمجي. في هذه الحالة الصنف هو <code>Sprite2D</code>، مما يعني أن الكود البرمجي سيصل إلى جميع خصائص ودوال عقدة <code>Sprite2D</code>، بما في ذلك الأصناف التي ترث منها هذه العقدة مثل <code>Node2D</code> و <code>CanvasItem</code> و <code>Node</code>
</p>

<p>
	ففي حالتنا هذه يرث الصنف Sprite2D يرث من Node2D، والذي بدوره يرث من CanvasItem. وبالتالي سيصل صنفك الجديد إلى خصائص ودوال كل من Sprite2D و Node2D و CanvasItem.
</p>

<p>
	<strong>ملاحظة</strong>: إذا أغفلت السطر الذي يحتوي على الكلمة المفتاحية <code>extends</code> في لغة GDScript سيمدّد الصنف تلقائيًا إلى عقدة <code>RefCounted</code>، أي سيصبح بشكل افتراضي صنفًا فرعيًا من RefCounted الذي يستخدمه <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك ألعاب</a> جودو لإدارة ذاكرة تطبيقك.
</p>

<p>
	يمكنك رؤية كافة الخصائص الموروثة في قائمة "الفاحص Inspector"، مثل خاصية <code>texture</code> الخاصة بالعقدة مما يسمح لك بتحريرها بسهولة داخل المحرر أو برمجيًا داخل النص البرمجي.
</p>

<p>
	<strong>ملاحظة</strong>: تعرض قائمة "الفاحص Inspector" خصائص العقدة في "حالة العنوان Title Case" افتراضيًا، مع كلمات بأحرف كبيرة ومنفصلة باستخدام مسافة. أما في شيفرة GDScript، فتكون هذه الخصائص مكتوبة بحالة الثعبان snake_case (أي بحالة الأحرف الصغيرة مع كلمات مفصولة عن بعضها باستخدام شرطة سفلية_).
</p>

<p>
	يمكنك التمرير فوق اسم أي خاصية في قائمة "الفاحص" Inspector لرؤية وصفها ومعرّفها في الشيفرة.
</p>

<h2 id="helloworld">
	تعليمة طباعة Hello World
</h2>

<p>
	لا ينفذ النص البرمجي حاليًا أي شيء. سنجعله يطبع النص Hello world في الخرج.
</p>

<p>
	أضف الشيفرة التالية إلى نصك البرمجي:
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6242_13" style=""><span class="pln">func _init</span><span class="pun">()</span><span class="pln"> </span><span class="pun">:</span><span class="pln">
       </span><span class="kwd">print</span><span class="pun">(“</span><span class="typ">Hello</span><span class="pun">,</span><span class="pln"> world</span><span class="pun">!”)</span><span class="pln"> </span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6242_15" style=""><span class="kwd">public</span><span class="pln"> </span><span class="typ">MySprite2D</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    GD</span><span class="pun">.</span><span class="typ">Print</span><span class="pun">(</span><span class="str">"Hello, world!"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	دعونا نشرح ما سبق. تُحدد الكلمة المفتاحية <code>func</code> دالة جديدة تسمى <code>‎_init‏‎</code> وهو اسم خاص لمنشئ أو باني الصنف لدينا. إذا عرّفت هذه الدالة، فسوف يستدعي جودو دالة <code>‎_init()‎</code> لكل كائن أو عقدة عند إنشائه في الذاكرة.
</p>

<p>
	<strong>ملاحظة</strong>: لغة البرمجة GDScript هي لغة تعتمد على المسافة البادئة، فالفراغ في بداية السطر الذي يحوي تعليمة الطباعة <code>()print</code> ضروري لعمل الشيفرة البرمجية، فإذا أغفلتها أو لم تضع مسافة بادئة في بداية السطر بشكل صحيح سينبهك المحرر عليها باللون الأحمر ويعرض رسالة الخطأ التالية: "مسافة بادئة مطلوبة".
</p>

<p>
	احفظ المشهد باسم sprite_2d.tscn إذا لم تكن قد فعلت ذلك بالفعل، ثم اضغط على F6<code>‎</code> ‏(<code>Cmd + R</code> على macOS) لتشغيله. انظر إلى اللوحة السفلية للخرج لترى النص Hello world
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155127" href="https://academy.hsoub.com/uploads/monthly_2024_08/9.png.3fa3036bd715078aa4b4e155b897fdd5.png" rel=""><img alt="9" class="ipsImage ipsImage_thumbnailed" data-fileid="155127" data-unique="ky34vmbfg" src="https://academy.hsoub.com/uploads/monthly_2024_08/9.png.3fa3036bd715078aa4b4e155b897fdd5.png"> </a>
</p>

<p>
	احذف الدالة <code>‎_init()‎</code>، بحيث يتبقى لديك فقط السطر <code>extends Sprite2D</code>.
</p>

<h2 id="-2">
	تدوير العقدة
</h2>

<p>
	حان الوقت لتحريك العقدة وتدويرها. لفعل بذلك، سنضيف متغيرين جديدين إلى النص البرمجي هما سرعة الحركة المقاسة بوحدة البكسل في الثانية، والسرعة الزاوية المقاسة بالراديان في الثانية. أضف التالي بعد السطر <code>extends Sprite2D</code>.
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6242_20" style=""><span class="pln">var speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">400</span><span class="pln">
var angular_speed </span><span class="pun">=</span><span class="pln"> PI</span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6242_22" style=""><span class="kwd">private</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> _speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">400</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">float</span><span class="pln"> _angularSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Mathf</span><span class="pun">.</span><span class="typ">Pi</span><span class="pun">;</span></pre>

<p>
	نكتب المتغيرات الجديدة بالقرب من بداية النص البرمجي، بعد الأسطر التي تحوي extends، وقبل الدوال. وستحتوي كل نسخة عقدة مرتبطة بهذا النص البرمجي على نسخة خاصة بها من خصائص <code>speed</code> و <code>angular_speed</code>.
</p>

<p>
	<strong>ملاحظة</strong>: تقاس الزوايا في محرك جودو بالراديان افتراضيًا، ولكن هناك دوال وخصائص مدمجة متاحة إذا كنت تفضل حساب الزوايا بالدرجات بدلاً من ذلك.
</p>

<p>
	لتحريك أيقونة جودو، نحتاج إلى تحديث موقعها وتدويرها في كل إطار ضمن حلقة اللعبة. يمكننا استخدام الدالة الافتراضية <code>‎_process()‎</code> الخاصة بالصنف <code>Node</code>. فإذا عرفتها في أي صنف يوسع الصنف <code>Node</code> مثل <code>Sprite2D</code> فسوف يستدعي جودو هذه الدالة في كل إطار ويمرر له قيمة باسم دلتا <code>delta</code> تمثل المدة الزمنية التي انقضت منذ الإطار الأخير.
</p>

<p>
	<strong>ملاحظة</strong>: تعمل الألعاب عن طريق عرض العديد من الصور في الثانية يطلق على كل منها إطار، ويتم ذلك بشكل حلقة متكررة. نقيس المعدل الذي تنتج فيه اللعبة الصور بمعدل الإطارات في الثانية (FPS). تهدف معظم الألعاب إلى 60 إطارًا في الثانية، على الرغم من أنك قد تجد أرقامًا مثل 30 إطارًا في الثانية على أجهزة الجوال الأبطأ أو أرقام بين 90 إلى 240 في ألعاب الواقع الافتراضي.
</p>

<p>
	يبذل المطورون قصارى جهدهم لتحديث عالم الألعاب وعرض الصور بفواصل زمنية ثابتة، لكن هناك دائمًا اختلافات بسيطة في أوقات عرض الإطارات. لهذا السبب يعطي جودو قيمة زمن دلتا <code>delta</code>، كي يجعل الحركة مستقلة عن معدل الإطارات.
</p>

<p>
	في نهاية الكود البرمجي، عرّف الدالة <code>‎_process()‎</code> كما يلي:
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6242_24" style=""><span class="pln">func _process</span><span class="pun">(</span><span class="pln">delta</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln">
       rotation </span><span class="pun">+=</span><span class="pln"> angular_speed </span><span class="pun">*</span><span class="pln"> delta</span></pre>

<p>
	تحدد الكلمة المفتاحية <code>func</code> في الكود السابق دالة جديدة. بعد ذلك علينا كتابة اسم الدالة والقيم التي تأخذها بين قوسين. وتنهي النقطتان <span>:</span> التعريف وتمثل الكتل التي تتبعها محتوى الدالة أو تعليماتها.
</p>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6242_26" style=""><span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">_Process</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Rotation</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> _angularSpeed </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">delta</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: لاحظ كيف أن الدالة <code>‎_process()‎</code> مثل الدالة <code>‎_init()‎</code> تبدأ بشرطة سفلية. ووفق العُرف المتبع، تبدأ جميع دوال جودو الافتراضية بشرطة سفلية وهي ذاتها الدوال المضمنة التي يمكنك تعريفها للتواصل مع جودو.
</p>

<p>
	يستخدم السطر <code>rotation +=‎‎ angular_speed * delta</code> داخل الدالة لتحديث دوران العقدة أو الصورة في كل إطار استنادًا إلى سرعة الدوران والمدة الزمنية المنقضية، حيث أن الخاصية <code>rotation</code> هي خاصية موروثة عن الصنف <code>Node2D</code> التي تمتد منها العقدة <code>Sprite2D</code> وهي تتحكم في دوران العقدة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		نصيحة: في محرر الشيفرة، يمكنك ضغط ctrl على أي خاصية أو دالة مدمجة مثل <code>position</code> أو <code>rotation</code> أو<code>‎_process</code> لفتح الوثائق المعنية في علامة تبويب جديدة.
	</p>
</blockquote>

<p>
	شغّل المشهد لمشاهدة أيقونة جودو تدور في مكانها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="155128" href="https://academy.hsoub.com/uploads/monthly_2024_08/10.gif.44ea736dedfadc8d490b1024f02c11af.gif" rel=""><img alt="10" class="ipsImage ipsImage_thumbnailed" data-fileid="155128" data-unique="zvpkoashq" src="https://academy.hsoub.com/uploads/monthly_2024_08/10.gif.44ea736dedfadc8d490b1024f02c11af.gif"> </a>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ملاحظة: لاحظ في لغة C#‎ كيف أن القيمة <code>delta</code> التي تأخذها الدالة <code>‎_Process()‎</code> من نوع <code>double</code>، لذلك يجب تحويلها إلى نوع <code>float</code> عند تطبيقها على الدوران.
	</p>
</blockquote>

<h2 id="-3">
	متابعة العمل على تحريك العقدة
</h2>

<p>
	دعنا الآن نجعل العقدة تتحرك في مسار دائري.
</p>

<p>
	أضف السطرين التاليين داخل دالة <code>‎_process()‎</code> مع التأكد من إضافة مسافة بادئة للسطرين الجديدين بنفس طريقة المسافة البادئة للسطر <code>rotation += angular_speed * delta</code> قبلهما.
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6242_28" style=""><span class="pln">var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">UP</span><span class="pun">.</span><span class="pln">rotated</span><span class="pun">(</span><span class="pln">rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> speed

position </span><span class="pun">+=</span><span class="pln"> velocity </span><span class="pun">*</span><span class="pln"> delta</span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6242_30" style=""><span class="pln">var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="typ">Up</span><span class="pun">.</span><span class="typ">Rotated</span><span class="pun">(</span><span class="typ">Rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> _speed</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Position</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> velocity </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">float</span><span class="pun">)</span><span class="pln">delta</span><span class="pun">;</span></pre>

<p>
	كما رأينا سابقًا، تحدد الكلمة المفتاحية <code>var</code> متغيرًا جديدًا. فإذا وضعته في بداية النص البرمجي، فإنه يُحدد خاصية الصنف. بينما إذا وضعته داخل الدالة، فإنه يُحدد متغيرًا محليًا يوجد ضمن نطاق الدالة نفسها فقط.
</p>

<p>
	نحدد متغيرًا محليًا يسمى <code>velocity</code> وهو متجه ثنائي الأبعاد يمثل الاتجاه والسرعة معًا. لتحريك العقدة للأمام، نبدأ من ثابت الصنف Vector2 وهو <code>Vector2.UP</code> يمثل متجه يشير لأعلى، ونديره عن طريق استدعاء طريقة Vector2 وهي <code>rotated()‎</code>.
</p>

<p>
	التعبير التالي <code>Vector2.UP.rotated(rotation)‎</code> هو شعاع يشير إلى الأمام بالنسبة إلى صورة الأيقونة مضروبًا بخاصية <code>speed</code>، حيث يعطينا سرعة يمكننا استخدامها لتحريك العقدة للأمام.
</p>

<p>
	نضيف <code>velocity * delta</code> إلى <code>psotion</code> العقدة لتحريكها. والموقع نفسه من نوع Vector2 وهو نوع مدمج في جودو يمثل متجه ثنائي الأبعاد.
</p>

<p>
	شغّل المشهد الآن لمشاهدة أيقونة جودو تتحرك في مسار دائري.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="155129" href="https://academy.hsoub.com/uploads/monthly_2024_08/11.gif.b1b1c37e31df9647c457c283f0c83049.gif" rel=""><img alt="11" class="ipsImage ipsImage_thumbnailed" data-fileid="155129" data-unique="dn2zg011l" src="https://academy.hsoub.com/uploads/monthly_2024_08/11.gif.b1b1c37e31df9647c457c283f0c83049.gif"> </a>
</p>

<p data-gramm="false">
	 
</p>

<p data-gramm="false">
	بهذا نكون انتهينا من كتابة كود برمجي لتحريك العقدة بمفردها في محرك ألعاب جودو. وستتعلّم في الدرس التالي كيفية الحصول على مدخلات من اللاعب واستخدامها للتحكم بالعقدة.
</p>

<h2 id="-4">
	النص البرمجي الكامل لتحريك العقدة
</h2>

<p>
	فيما يلي ملف <code>sprite_2d.gd</code> الكامل لاستخدامه كمرجع.
</p>

<p>
	بلغة GDScript:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6242_32" style=""><span class="pln">extends </span><span class="typ">Sprite2D</span><span class="pln">

var speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">400</span><span class="pln">
var angular_speed </span><span class="pun">=</span><span class="pln"> PI


func _process</span><span class="pun">(</span><span class="pln">delta</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln">
       rotation </span><span class="pun">+=</span><span class="pln"> angular_speed </span><span class="pun">*</span><span class="pln"> delta

       var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">UP</span><span class="pun">.</span><span class="pln">rotated</span><span class="pun">(</span><span class="pln">rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> speed

       position </span><span class="pun">+=</span><span class="pln"> velocity </span><span class="pun">*</span><span class="pln"> delta</span></pre>

<p>
	بلغة C#‎:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6242_34" style=""><span class="kwd">using</span><span class="pln"> </span><span class="typ">Godot</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> partial </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MySprite2D</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Sprite2D</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> _speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">400</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">float</span><span class="pln"> _angularSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Mathf</span><span class="pun">.</span><span class="typ">Pi</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">_Process</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Rotation</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> _angularSpeed </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">delta</span><span class="pun">;</span><span class="pln">
        var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="typ">Up</span><span class="pun">.</span><span class="typ">Rotated</span><span class="pun">(</span><span class="typ">Rotation</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> _speed</span><span class="pun">;</span><span class="pln">

        </span><span class="typ">Position</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> velocity </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="typ">float</span><span class="pun">)</span><span class="pln">delta</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخلاصة
</p>

<p>
	    تعلمنا في مقال اليوم طريقة كتابة برنامج بسيط لتحريك العقد في جودو وضبط سرعتها واتجاهها، والجدير بالذكر أنّ تحريك العقدة الذي تعلمناه في هذا المقال لا يأخذ بعين الاعتبار الاصطدام بالجدران أو الأرض. وستتعلّم المزيد عند <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-r2280/" rel="">إنشاء أول لعبة ثنائية الأبعاد في جودو</a> ونستخدم نهجًا آخر لتحريك الكائنات مع اكتشاف التصادمات.
</p>

<p>
	ترجمة بتصرف لقسم <a href="https://docs.godotengine.org/en/stable/getting_started/step_by_step/scripting_first_script.html" rel="external nofollow">Creating your first script</a> من توثيق جودو الرسمي.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%A7%D8%AD%D8%A9-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2371/" rel="">تعرف على لغات البرمجة المتاحة في محرك جودو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-r2304/" rel="">دليلك الشامل إلى برمجة الألعاب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%86%D8%A7%D8%AC%D8%AD-r2284/" rel="">كيف تصبح مبرمج ألعاب فيديو ناجح</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B9%D9%82%D8%AF-nodes-%D9%88%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%87%D8%AF-scenes-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2357/" rel="">العقد Nodes والمشاهد Scenes في جودو Godot</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2382</guid><pubDate>Sun, 04 Aug 2024 15:00:00 +0000</pubDate></item><item><title>&#x644;&#x63A;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x627;&#x644;&#x645;&#x62A;&#x627;&#x62D;&#x629; &#x641;&#x64A; &#x62C;&#x648;&#x62F;&#x648; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%A7%D8%AD%D8%A9-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2371/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_07/-----Godot.png.e34d16082c4361a2bf82dfe448720841.png" /></p>
<p>
	سنلقي الضوء في مقال اليوم على لغات البرمجة المتوفرة في محرك الألعاب جودو، ومتى نختار كل لغة منها ونتعلم محاسن ومساوئ كل خيار، وسنكتب في الجزء التالي أول سكريبت برمجي ضمن محرك جودو باستخدام لغة البرمجة الافتراضية  GDScript.
</p>

<p>
	ترتبط الأكواد البرمجية بالعقد Nodes، فعندما تربط سكريبت برمجي بعقدة معينة، فإنك توسع سلوك تلك العقدة بإضافة وظائف جديدة لها، هذا يعني أن السكريبتات ترث كل وظائف وخصائص العقد المرتبطة بها.
</p>

<p>
	على سبيل المثال لنفترض أننا نعمل على برمجة لعبة فضائية تتحرك فيها سفينة فضائية كما تبين الصورة التالية، ونريد أن تهتز الكاميرا عندما تتضرر السفينة. علينا إضافة عقدة كاميرا Camera2D تابعة لعقدة السفينة في التسلسل الهرمي كي تتبع الكاميرا حركة السفينة، لأن العقدة تتبع العقدة الأب لها في التسلسل الهرمي للعقد بشكل افتراضي، ولجعل الكاميرا تهتز عندما تتضرر السفينة، يجب في هذه الحالة إنشاء سكريبت برمجي وربطه بعقدة Camera2D وكتابة شيفرة الاهتزاز فيه لكون هذه الميزة غير متوافرة بشكل ضمني في جودو.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="153972" href="https://academy.hsoub.com/uploads/monthly_2024_07/1.gif.04cf70e5d96dfc44dbc4b395f0909ca4.gif" rel=""><img alt="1" class="ipsImage ipsImage_thumbnailed" data-fileid="153972" data-unique="aycgh1a79" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/1.gif.04cf70e5d96dfc44dbc4b395f0909ca4.gif"> </a>
</p>

<h2 id="">
	لغات البرمجة المتوفرة في محرك جودو
</h2>

<p>
	يوفر محرك الألعاب جودو أربع<a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel=""> لغات برمجة</a> هي GDScript و C#‎ بالإضافة إلى كل من C وC++‎ من خلال تقنية <strong>GDExtention</strong>، وهناك لغات برمجة أخرى مدعومة من مجتمع جودو ولكن اللغات المذكورة هنا هي اللغات الرسمية. وللعلم يمكننا استخدام عدة لغات برمجة في مشروع واحد، مثلًا يمكننا كتابة شيفرة منطق اللعب باستخدام لغة GDScript كونها سهلة وسريعة في الكتابة، وتستخدم لغة C#‎ أو C++‎ لتطبيق خوارزميات معقدة لتحسين أداء الشيفرة، أو يمكن كتابة كل شيء باستخدام GDScript أو C#‎، الأمر عائد لك. والهدف من هذه المرونة هو تلبية احتياجات المطورين لتنفيذ مشاريع الألعاب المختلفة.
</p>

<h2 id="-1">
	ما لغة برمجة التي يجب استخدامها مع جودو
</h2>

<p>
	يُنصح باستخدام لغة GDScipt إذا كنت مبتدئًا، إذ أنشئت هذه اللغة لجودو بشكل خاص ولتلبية احتياجات <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطوري الألعاب</a>، وهي تتميز بصياغتها السهلة وقلة حجمها، كما أنها تقدم أفضل تكامل مع محرك الألعاب جودو.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153969" href="https://academy.hsoub.com/uploads/monthly_2024_07/2.png.08c5b2a149cbf4bbcbce3a303d670e79.png" rel=""><img alt="2" class="ipsImage ipsImage_thumbnailed" data-fileid="153969" data-unique="3xeqo2dzs" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/2.thumb.png.ad42c599a13246bf262b44a074da7d46.png"> </a>
</p>

<p>
	سنحتاج في حال استخدام لغة C#‎‏ إلى محرر أكواد خارجي مثل <a href="https://code.visualstudio.com/" rel="external nofollow">VSCode</a> أو Visual Studio، وعلى الرغم من كون دعم لغة C#‎ أفضل، ولكننا لن نجد العديد من الموارد المساعدة لاستخدامها مع محرك الألعاب جودو مقارنة بلغة GDScript، لذا يُنصح باستخدام لغة C#‎ لمستخدمي اللغة الخبرين فقط.
</p>

<p>
	دعنا نشرح أكثر عن مميزات كل لغة، و محاسنها ومساوئها في فقراتنا التالية.
</p>

<h3 id="gdscript">
	لغة GDScript
</h3>

<p>
	إن لغة GDScript هي لغة أمرية Imperative و<a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-oop/" rel="">كائنية التوجه Object-oriented </a>مطورة ومكتوبة خصوصًا لمحرك الألعاب جودو، ومصممة لتوفير وقت مطوري الألعاب في كتابة المنطق البرمجي لألعابهم بسرعة وسهولة، وتضم المميزات التالية:
</p>

<ul>
	<li>
		صياغة بسيطة تعطي ملفات صغيرة الحجم
	</li>
	<li>
		وقت تحميل قليل وتصيير rendering سريع جدًا
	</li>
	<li>
		تكامل قوي مع محرر جودو، مع إكمال للشيفرة للعقد والإشارات ومعلومات أكثر مع المشهد المرتبط به
	</li>
	<li>
		وجود أنواع معطيات لتمثيل المتجهات vectors والتحويلات الهندسية transforms مما يسهل استخدام الجبر الخطي الضروري للألعاب
	</li>
	<li>
		تدعم <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%AA%D8%A7%D8%B3%D8%B9-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AE%D9%8A%D9%88%D8%B7-threads-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-r1012/" rel="">الخيوط المتعددة multiple threads</a> وتملك نفس كفاءة اللغات المكتوبة بشكل ساكن أي اللغات التي يحدد فيها نوع البيانات بشكل ثابت وقت التصريف <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AA%D8%B5%D8%B1%D9%8A%D9%81-compilation-%D9%81%D9%8A-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r976/" rel="">compiling</a>
	</li>
	<li>
		لا يوجد فيها <a href="https://academy.hsoub.com/programming/javascript/%D9%83%D9%86%D8%B3-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%87%D9%85%D9%84%D8%A9-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r797/" rel="">كنس للمهملات garbage collection</a>، لأن هذه الميزة قد تبطئ عملية تطوير الألعاب. بدلاً من ذلك، يدير محرك جودو المراجع References ويخصص الذاكرة تلقائيًا في معظم الحالات، مع توفير إمكانية التحكم اليدوي بالذاكرة عند الحاجة
	</li>
	<li>
		توفر ميزة تحديد النوع التدريجي Gradual Typing، فالمتغيرات لها أنواع ديناميكية افتراضيًا، ولكن يمكنك استخدام ميزة تلميحات النوع type hinting للتحقق من الأنواع.
	</li>
	<li>
		تشبه لغة GDScipt لغة بايثون <a href="https://wiki.hsoub.com/Python" rel="external">Python</a> في الهيكلية عن طريق استخدام كتل الشيفرة والمسافات البادئة، ولكنها لا تعمل بنفس المضمون، فقد طورت بالاعتماد على لغات برمجية متعددة مثل Squirrel وLua وبايثون.
	</li>
</ul>

<p>
	<strong>ملاحظة</strong>: قد تتساءل لماذا لا نستخدم لغة بايثون أو لغة Lua مباشرة في محرك جودو؟ في الواقع كان جودو يستخدم بايثون و Lua وقد تطلب تكامل اللغتين الكثير من العمل ويملك الكثير من المحدوديات، مثلًا كان دعم الخيوط <a href="https://academy.hsoub.com/programming/java/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%8A%D9%88%D8%B7-threads-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-r1483/" rel="">threads</a> تحديًا كبيرًا في بايثون، كما أن تطوير لغة جديدة لا يتطلب جهدًا أكبر ويمكّن من تلبية احتياجات مطوري الألعاب، لهذا كانت لغة GDScipt ويجري العمل على تحسينات وميزات كبيرة على اللغة ستكون صعبة التنفيذ في حال استخدام <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات برمجة</a> من طرف ثالث.
</p>

<h3 id="netc">
	لغة ‎.NET و C#‎‎‎
</h3>

<p>
	دُعمَت لغة C#‎ الخاصة بمايكروسوفت رسميًا في محرك الألعاب جودو لأنها اللغة المفضلة لدى مطوري الألعاب، كما أن لغة C#‎ متطورة ومرنة ولديها الكثير من المكتبات المكتوبة لأجلها، وكان إضافة الدعم لها ممكنًا بفضل تبرع سخي من مايكروسوفت لمطوّري جودو.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153970" href="https://academy.hsoub.com/uploads/monthly_2024_07/3.png.20d61eff91a45575e3668dd4aefeb452.png" rel=""><img alt="3" class="ipsImage ipsImage_thumbnailed" data-fileid="153970" data-unique="mkpnyr4cu" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/3.png.20d61eff91a45575e3668dd4aefeb452.png"> </a>
</p>

<p>
	تقدم لغة C#‎ حلًا وسطيًّا بين الأداء وسهولة الاستخدام، ولكن يجب الانتباه من استخدامها <a href="https://academy.hsoub.com/programming/javascript/%D9%83%D9%86%D8%B3-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%87%D9%85%D9%84%D8%A9-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r797/" rel="">لكانس المهملات garbage collector</a>
</p>

<p>
	<strong>ملاحظة1</strong>: يجب استخدام نسخة ‎.‎NET من محرر جودو لكتابة البرامج النصية باستخدام C#‎، ويمكن <a href="https://godotengine.org/download/" rel="external nofollow">تنزيله</a> من موقع جودو الرسمي. بما أن جودو تستخدم ‎.‎NET6 فيمكنك نظريًا استخدام أي مكتبة ‎.‎NET من طرف ثالث أو أي هيكلية في جودو، بالإضافة لأي لغة برمجة متوافقة مع البنية التحتية مثل F#‎ وBoo وClojureCLR، ولكن لغة C#‎ هي خيار ‎<a href="https://academy.hsoub.com/programming/c-sharp/dotnet/" rel="">.NET</a> الوحيد المدعوم.
</p>

<p>
	<strong>ملاحظة2</strong>: لا تُنفذ شيفرة GDScript بسرعة لغات C#‎ أو C++‎ المصرّفة، ولكن محرك جودو نفسه يحتوي على الكثير من الخوارزميات الأساسية السريعة التي تستدعي الدوال والوظائف الأساسية المكتوبة بلغة  C++‎ داخل بنية المحرك، ففي معظم الأحوال لن تؤثر كتابة منطق اللعب على الأداء بشكل ملحوظ سواء استخدمت لغة GDScript أو C#‎ أو C++‎ .
</p>

<p>
	<strong>تنبيه</strong>: لا يمكن تصدير المشاريع المكتوبة بلغة C#‎ باستخدام جودو 4 إلى منصة الويب أي تطوير <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD-r767/" rel="">لعبة تعمل مباشرة في المتصفح</a>، فإذا كنت ترغب في تطوير لعبة أو تطبيق ويب باستخدام لغة C#‎ فيجب عليك استخدام جودو 3 لاستخدام لغة C#‎ على المنصة. كما أن دعم منصتي أندرويد وiOS متوافر في جودو 4.2 لكنه لا يزال تجريبيًا لحظة كتابة هذا المقال ولا تزال فيه بعض المحدوديات.
</p>

<h3 id="cgdextention">
	استخدام لغة C++‎ عبر GDExtention
</h3>

<p>
	تسمح لك GDExtention بكتابة شيفرة اللعبة باستخدام لغة C++‎ دون الحاجة لإعادة تصريف جودو.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153971" href="https://academy.hsoub.com/uploads/monthly_2024_07/4.png.1a1a762ee18cf21e279aa716b37407f1.png" rel=""><img alt="4" class="ipsImage ipsImage_thumbnailed" data-fileid="153971" data-unique="xqgrp7d4t" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/4.thumb.png.f3c4ac1941b1412f99e4b8092bba2ff2.png"> </a>
</p>

<p>
	يمكنك استخدام أي إصدار من اللغة أو تنويع المصرّف والإصدارات للمكتبات المشتركة بفضل استخدام واجهة برمجة التطبيقات المعروفة باسم C <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> Bridge وهي واجهة برمجية تسمح باستخدام أكواد مكتوبة بلغة C مع لغات برمجة أخرى وتمكن التطبيقات المكتوبة بلغات مختلفة من التفاعل مع بعضها البعض بسهولة.
</p>

<p>
	إن GDExtention هي أفضل خيار لتعزيز أداء الألعاب التي تطورها باستخدام جودو، إذ لست بحاجة لاستخدامها في كل اللعبة ويمكنك استخدامها فقط في الأجزاء التي تحتاج إلى تحسين الأداء بشكل كبير وكتابة أكواد بلغات مختلفة باستخدام GDScript أو C#‎، وعند العمل باستخدام GDExtention ستتشابه الأنواع والدوال والخاصيات لواجهة برمجة تطبيقات C++‎ مع تلك التي تستخدمها عند البرمجة داخل محرك Godot نفسه.
</p>

<h2 id="-2">
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على أهمية كتابة الأكواد البرمجية أو السكريبتات في جودو فهي ملفات تحتوي شيفرة برمجية يمكن ربطها مع العقد لتوسيع وظائفها، ورأينا أن محرك ألعاب جودو يدعم أربع لغات برمجة نصية رسمية ليمنح <a href="https://academy.hsoub.com/programming/game-development/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%86%D8%A7%D8%AC%D8%AD-r2284/" rel="">لمبرمجي الألعاب</a> مرونة في اختيار اللغة التي يفضلونها، كما يمكن مزج اللغات لتطبيق خوارزميات ثقيلة باستخدام لغة C أو C++‎ وكتابة معظم منطق اللعبة باستخدام GDScript أو C#‎.
</p>

<p>
	ترجمة - وبتصرف - لقسم <a href="https://docs.godotengine.org/en/stable/getting_started/step_by_step/scripting_languages.html" rel="external nofollow">Scripting Languages</a> من توثيق جودو الرسمي.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%86%D8%B3%D8%AE-%D9%85%D9%86-%D8%A7%D9%84%D9%85%D9%8E%D8%B4%D8%A7%D9%87%D9%90%D8%AF-%D9%88%D8%A7%D9%84%D8%B9%D9%82%D8%AF-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2364/" rel="">إنشاء نسخ من المَشاهِد والعقد في جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">تعرف على أشهر لغات برمجة الألعاب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">تعرف على أشهر محركات الألعاب Game Engines</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">أهمية صناعة الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-r2304/" rel="">دليلك الشامل إلى برمجة الألعاب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2371</guid><pubDate>Fri, 26 Jul 2024 15:00:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x646;&#x633;&#x62E; &#x645;&#x646; &#x627;&#x644;&#x645;&#x634;&#x627;&#x647;&#x62F; &#x648;&#x627;&#x644;&#x639;&#x642;&#x62F; &#x641;&#x64A; &#x62C;&#x648;&#x62F;&#x648;</title><link>https://academy.hsoub.com/programming/game-development/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%86%D8%B3%D8%AE-%D9%85%D9%86-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%87%D8%AF-%D9%88%D8%A7%D9%84%D8%B9%D9%82%D8%AF-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-r2364/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_07/--instances---Godot.png.25b7a95909b1fe7538c8dc20da2d05ba.png" /></p>
<p>
	رأينا في <a href="https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B9%D9%82%D8%AF-nodes-%D9%88%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%87%D8%AF-scenes-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2357/" rel="">الدرس السابق</a> أنّ المشهد عبارة عن مجموعة من العقد المنظمة على شكل شجرة مع عقدة جذر واحدة، كما تعرفنا على إمكانية تقسيم مشروعك إلى أي عدد تريده من المَشاهد، حيث تساعدك هذه الميزة في تقسيم وتنظيم مكونات لعبتك المختلفة.
</p>

<p>
	يمكنك في محرك جودو إنشاء العديد من المَشاهد بالطريقة التي ترغب بها وحفظها كملفات بامتداد <code>‎.‎tscn</code> والذي تعني مشهدًا نصيًا وكان ملف <code>label.tscn</code> من الدرس السابق مثالًا على ذلك. ونسمّي تلك الملفات مَشاهد مُخزنّة لأنها تخزن معلومات حول محتوى المشهد.
</p>

<p>
	إليك مثالًا على مشهد كرة مكوّن من عقدة جذر <code>RigidBody2D</code> باسم كرة Ball، والتي تسمح للكرة بالسقوط والارتداد على الجدران، وعقدة <code>Sprite2D</code>، وعقدة <code>CollisionShape2D</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153496" href="https://academy.hsoub.com/uploads/monthly_2024_07/1.png.056a53c2c416b360e9f7f4a06734e0e9.png" rel=""><img alt="1" class="ipsImage ipsImage_thumbnailed" data-fileid="153496" data-unique="dfqv06soy" src="https://academy.hsoub.com/uploads/monthly_2024_07/1.png.056a53c2c416b360e9f7f4a06734e0e9.png"> </a>
</p>

<p>
	بمجرد حفظ أي مشهد سيعمل كنموذج أو قالب Template، أي يمكنك استنساخه في مَشاهد أخرى بقدر ما ترغب ونسمي عملية تكرار كائن من قالب كهذا باسم ** استنساخ Instancing **
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153497" href="https://academy.hsoub.com/uploads/monthly_2024_07/2.png.e9684f6d07b2cdc896e690ce615f7bc0.png" rel=""><img alt="2" class="ipsImage ipsImage_thumbnailed" data-fileid="153497" data-unique="th49lr9uj" src="https://academy.hsoub.com/uploads/monthly_2024_07/2.thumb.png.c668462302f35c4bd429bd59687a2739.png"> </a>
</p>

<p>
	وكما ذكرنا في<a href="https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B9%D9%82%D8%AF-nodes-%D9%88%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%87%D8%AF-scenes-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2357/" rel="">الدرس السابق</a>، تتصرف المشاهد المُستنسخة كعقدة يخفي المحرر محتواها افتراضيًا. فسترى عند استنساخ الكرة عقدتها فقط، لاحظ أيضًا كيف أن لكل نسخة اسمًا فريدًا خاصًّا بها.
</p>

<p>
	تبدأ كل نسخة من مشهد الكرة بنفس الهيكل والخصائص كملف <code>ball.tscn</code> ومع ذلك، يمكنك تعديل كل منها بشكل مستقل، مثل تغيير كيفية ارتدادها، وزنها، أو أي خاصية يعرضها المشهد الأصلي.
</p>

<h2 id="">
	التطبيق العملي
</h2>

<p>
	سنستخدم استنساخ المشاهد في تطبيق عملي لنرى كيف يعمل في جودو Godot. يمكنك تحميل مشروع الكرة الذي أعددناه لك من هنا <a href="https://github.com/godotengine/godot-docs-project-starters/releases/download/latest-4.x/instancing_starter.zip" rel="external nofollow">instancing_starter.zip</a>
</p>

<p>
	استخرج الملف على حاسوبك. ولاستيراده، تحتاج إلى الوصول إلى مدير المشروع Project Manager. يمكن الوصول إليه عن طريق فتح جودو، أو إذا كان مفتوحًا بالفعل، انقر على "المشروع Project" ثم " العودة لقائمة المشاريع Quit to Project List" ‫(Ctrl + Shift + Q, Ctrl + Option + Cmd + Q على macOS)
</p>

<p>
	في مدير المشروع، انقر فوق زر "استيراد" Import لاستيراد المشروع
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153498" href="https://academy.hsoub.com/uploads/monthly_2024_07/3.png.310a328ac7ccdde6b8cc5580af095fb3.png" rel=""><img alt="3" class="ipsImage ipsImage_thumbnailed" data-fileid="153498" data-unique="y3skv3uqo" src="https://academy.hsoub.com/uploads/monthly_2024_07/3.thumb.png.b2af2bbf65ded5a7b69dd8cd7dace0a2.png"> </a>
</p>

<p>
	في النافذة المنبثقة التي تظهر، انقر فوق زر "تصفح" browse وانتقل إلى المجلد الذي استخرجته.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153499" href="https://academy.hsoub.com/uploads/monthly_2024_07/4.png.cf235a2bed642bf458e808ab6a8925c4.png" rel=""><img alt="4" class="ipsImage ipsImage_thumbnailed" data-fileid="153499" data-unique="t10z9li1r" src="https://academy.hsoub.com/uploads/monthly_2024_07/4.thumb.png.a5ad994cbe14c9898dc276cb19ad8922.png"> </a>
</p>

<p>
	انقر نقرًا مزدوجًا على ملف <code>project.godot</code> لفتحه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153500" href="https://academy.hsoub.com/uploads/monthly_2024_07/5.png.f11cc219790df307b52444d78f15c77c.png" rel=""><img alt="5" class="ipsImage ipsImage_thumbnailed" data-fileid="153500" data-unique="nyjd1qxi6" src="https://academy.hsoub.com/uploads/monthly_2024_07/5.thumb.png.6c25e311ab112bb5e607f9ebc9bad756.png"> </a>
</p>

<p>
	وأخيرًا، انقر فوق زر "استيراد وتعديل" Import &amp; Edit.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153501" href="https://academy.hsoub.com/uploads/monthly_2024_07/6.png.e29baed02eb436cccc5756e5aa2116f0.png" rel=""><img alt="6" class="ipsImage ipsImage_thumbnailed" data-fileid="153501" data-unique="it8bmhnv7" src="https://academy.hsoub.com/uploads/monthly_2024_07/6.thumb.png.fe453f025477148391bd655004eae620.png"> </a>
</p>

<p>
	يحتوي المشروع على مشهدين محفوظين هما المشهد الرئيسي <code>main.tscn</code> الذي يحتوي على الجدران التي تصطدم بها الكرة، ومشهد الكرة <code>ball.tscn</code>. يجب أن يفتح المشهد الرئيسي تلقائيًا. وفي حال رأيت مشهدًا فارغًا ثلاثي الأبعاد بدلاً من المشهد الرئيسي فانقر على زر 2D في أعلى الشاشة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153502" href="https://academy.hsoub.com/uploads/monthly_2024_07/7.png.4d155641a99579ff554306be3fdd7716.png" rel=""><img alt="7" class="ipsImage ipsImage_thumbnailed" data-fileid="153502" data-unique="lhlxu41zg" src="https://academy.hsoub.com/uploads/monthly_2024_07/7.thumb.png.8c692d7281ad84704d75840096ac5544.png"> </a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153503" href="https://academy.hsoub.com/uploads/monthly_2024_07/8.png.6a646e661039ff11b26564c83ac14e60.png" rel=""><img alt="8" class="ipsImage ipsImage_thumbnailed" data-fileid="153503" data-unique="izzotc21z" src="https://academy.hsoub.com/uploads/monthly_2024_07/8.png.6a646e661039ff11b26564c83ac14e60.png"> </a>
</p>

<p>
	لنضف كرة بصفة ابن للعقدة الرئيسية Main. من قائمة "المشهد" Scene، اختر العقدة Main، ثم انقر على أيقونة الرابط في أعلى القائمة. يسمح هذا الزر بإضافة نسخة من مشهد كابن للعقدة المختارة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153504" href="https://academy.hsoub.com/uploads/monthly_2024_07/9.png.39e931460b8f280033a7b8822b84f34b.png" rel=""><img alt="9" class="ipsImage ipsImage_thumbnailed" data-fileid="153504" data-unique="u88u9picw" src="https://academy.hsoub.com/uploads/monthly_2024_07/9.thumb.png.fbd46ed644527615278dba12596cf5c3.png"> </a>
</p>

<p>
	انقر نقرًا مزدوجًا على مشهد الكرة لإنشاء نسخة منه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153505" href="https://academy.hsoub.com/uploads/monthly_2024_07/10.png.e7403e84d300177a5889630c94c53b76.png" rel=""><img alt="10" class="ipsImage ipsImage_thumbnailed" data-fileid="153505" data-unique="c5gguncaw" src="https://academy.hsoub.com/uploads/monthly_2024_07/10.thumb.png.bbebfd968ae6489f530a607c5a1fee61.png"> </a>
</p>

<p>
	تظهر الكرة في الزاوية اليسرى أعلى نافذة العرض كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153506" href="https://academy.hsoub.com/uploads/monthly_2024_07/11.png.6e8c26defec08f67398f5e698af36ed9.png" rel=""><img alt="11" class="ipsImage ipsImage_thumbnailed" data-fileid="153506" data-unique="92e8giej4" src="https://academy.hsoub.com/uploads/monthly_2024_07/11.png.6e8c26defec08f67398f5e698af36ed9.png"> </a>
</p>

<p>
	انقر عليها واسحبها نحو المنتصف.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153507" href="https://academy.hsoub.com/uploads/monthly_2024_07/12.png.16c527ca89c657c7693eb7223a1d62d4.png" rel=""><img alt="12" class="ipsImage ipsImage_thumbnailed" data-fileid="153507" data-unique="dkla6d3js" src="https://academy.hsoub.com/uploads/monthly_2024_07/12.png.16c527ca89c657c7693eb7223a1d62d4.png"> </a>
</p>

<p>
	شغِّل اللعبة بالضغط على <code>F5</code> ‫(<code>Cmd + B</code> على macOS) ويجب أن ترى الكرة وهي تسقط للأسفل.
</p>

<p>
	نريد الآن إنشاء مزيد من النُسخ من عقدة الكرة.
</p>

<p>
	بالمحافظة على الكرة محددة، اضغط على <code>Ctrl + D</code> ‫(<code>Cmd + D</code> على macOS) لاستدعاء أمر النسخ. ثم انقر واسحب لنقل الكرة الجديدة إلى موقع مختلف.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153508" href="https://academy.hsoub.com/uploads/monthly_2024_07/13.png.64f796fbc6b9cdb45bee477a4929a168.png" rel=""><img alt="13" class="ipsImage ipsImage_thumbnailed" data-fileid="153508" data-unique="3d4j9ngpr" src="https://academy.hsoub.com/uploads/monthly_2024_07/13.thumb.png.9a2c8bc5b2ebd3b199005c7104e04af7.png"> </a>
</p>

<p>
	يمكنك تكرار هذه العملية حتى تحصل على عدة كرات في المشهد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153509" href="https://academy.hsoub.com/uploads/monthly_2024_07/14.png.93f6859dbb1fbc174793231865870c0b.png" rel=""><img alt="14" class="ipsImage ipsImage_thumbnailed" data-fileid="153509" data-unique="nqe9snnpt" src="https://academy.hsoub.com/uploads/monthly_2024_07/14.png.93f6859dbb1fbc174793231865870c0b.png"> </a>
</p>

<p>
	شغِّل اللعبة مرة أخرى. يجب أن ترى الآن كل كرة تسقط بشكل مستقل الأخرى. هذا ما تفعله النُسخ، حيث أن كل نسخة هي إعادة تشكيل مستقل لمشهد حسب قالب معين.
</p>

<h2 id="-1">
	تحرير المَشاهد والنُسخ
</h2>

<p>
	هناك المزيد من المميزات حول النُسخ. إذ يمكنك أيضًا:
</p>

<ul>
	<li>
		تغيير خصائص إحدى الكرات دون التأثير على الأخرى باستخدام أمر "الفاحص" Inspector
	</li>
	<li>
		تغيير الخصائص الافتراضية لكل كرة بفتح مشهد <code>ball.tscn</code> وإجراء تغيير على عقدة الكرة هناك وعند الحفظ، ستُحدّث قيم جميع نُسخ الكرة في المشروع.
	</li>
</ul>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ملاحظة: يتسبب تغيير الخاصية بكتابة قيم جديدة على المشهد المحزَّم packed scene الموافق.
	</p>
</blockquote>

<p>
	لنجرب التالي: افتح <code>ball.tscn</code> وحدد عقدة الكرة. ومن قائمة "الفاحص" Inspector على اليمين، انقر على خاصية PhysicsMaterial لاستعراضها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153510" href="https://academy.hsoub.com/uploads/monthly_2024_07/15.png.3efaa0a05b5a9dfdef0779416c67adef.png" rel=""><img alt="15" class="ipsImage ipsImage_thumbnailed" data-fileid="153510" data-unique="qy4k8lwth" src="https://academy.hsoub.com/uploads/monthly_2024_07/15.png.3efaa0a05b5a9dfdef0779416c67adef.png"> </a>
</p>

<p>
	اضبط خاصية Bounce إلى <code>0.5</code> بالنقر على مجال الأرقام أو كتابة <code>0.5</code> والضغط على <code>Enter</code>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153511" href="https://academy.hsoub.com/uploads/monthly_2024_07/16.png.85e7231e4c8b9aeb878186ffecc2f52c.png" rel=""><img alt="16" class="ipsImage ipsImage_thumbnailed" data-fileid="153511" data-unique="ldzblka6s" src="https://academy.hsoub.com/uploads/monthly_2024_07/16.png.85e7231e4c8b9aeb878186ffecc2f52c.png"> </a>
</p>

<p>
	شغِّل اللعبة بالضغط على <code>F5</code> (<code>‫Cmd+B</code> على macOS) ولاحظ كيف تترتّب الكرات الآن بشكل أكبر. حيث أن مشهد الكرة هو قالب لجميع النُسخ، ويُسبب إجراء التعديل والحفظ تحديث جميع النسخ وفقًا لذلك.
</p>

<p>
	الآن، دعنا نعدِّل نسخة فردية من هذه النسخ.
</p>

<p>
	انتقل مرة أخرى إلى المشهد الرئيسي بالنقر على التبويب المقابل فوق نافذة العرض.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153512" href="https://academy.hsoub.com/uploads/monthly_2024_07/17.png.1447c474d508ec23c99bd9b27d31ecda.png" rel=""><img alt="17" class="ipsImage ipsImage_thumbnailed" data-fileid="153512" data-unique="pbeh5i6ne" src="https://academy.hsoub.com/uploads/monthly_2024_07/17.png.1447c474d508ec23c99bd9b27d31ecda.png"> </a>
</p>

<p>
	حدد إحدى عقد الكرة المُستنسخة واضبط قيمة مقياس الجاذبية إلى <code>10</code> من قائمة "الفاحص" Inspector.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="153513" href="https://academy.hsoub.com/uploads/monthly_2024_07/18.png.d23e14dd31969135aaadee5942e70d0f.png" rel=""><img alt="18" class="ipsImage ipsImage_thumbnailed" data-fileid="153513" data-unique="lbghm3cau" src="https://academy.hsoub.com/uploads/monthly_2024_07/18.png.d23e14dd31969135aaadee5942e70d0f.png"> </a>
</p>

<p>
	ستظهر أيقونة رمادية "revert" بجوار الخاصية المعدَّلة.
</p>

<p>
	تُشير هذه الأيقونة إلى أنك تجاوزت قيمة من مشهد المصدر المحزَّم، وسيتم الاحتفاظ بالتجاوز في النسخة حتى إذا عدّلت الخاصية في المشهد الأصلي.
</p>

<p>
	ستُستعاد الخاصية إلى قيمتها في المشهد المحفوظ، بالنقر على أيقونة revert.
</p>

<p>
	أعِد تشغيل اللعبة ولاحظ كيف تسقط هذه الكرة الآن بسرعة أكبر من الكرات الأخرى.
</p>

<p>
	ملاحظة: قد تلاحظ أنه لا يمكنك تغيير قيم <code>PhysicsMaterial</code> للكرة. هذا يعود إلى أن <code>PhysicsMaterial</code> هو مورد resource، والموارد هي مكونات أساسية أخرى في ألعاب محرك جودو، سنتحدث عنها في درس لاحق. ويجب عليك جعله فريدًا قبل أن تتمكن من تحريره في مشهد يرتبط بالمشهد الأصلي. ولجعل مورد ما فريدًا لحالة واحدة، انقر بالزر الأيمن عليه من قائمة "الفاحص" Inspector وانقر على "Make Unique" في القائمة التي تظهر لك.
</p>

<h2 id="-2">
	حالات المشهد كلغة تصميم
</h2>

<p>
	تقدم نُسخ ومشاهد جودو لغة تصميم ممتازة، تجعله يبرز عن غيره، فمحرك جودو صّمّم منذ البداية ليناسب هذه الفكرة.
</p>

<p>
	لست ملزمًا باتّباع أنماط الشيفرة المعمارية عند صنع ألعاب باستخدام جودو، مثل نموذج-عرض-تحكم (MVC) أو مخططات كيان-علاقة (<a href="https://academy.hsoub.com/devops/servers/databases/%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D9%83%D9%8A%D8%A7%D9%86-%D9%88%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D8%A9-er-%D9%84%D8%AA%D9%85%D8%AB%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%81%D9%8A-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r543/" rel="">Entity-Relationship</a>) ويمكنك بدلاً من ذلك، البدء بتخيّل العناصر التي سيراها اللاعبون في لعبتك وبناء شيفرتك منها.
</p>

<p>
	على سبيل المثال، يمكنك تقسيم لعبة إطلاق نار على النحو التالي:
</p>

<p style="text-align: center;">
	<img alt="19.png" class="ipsImage ipsImage_thumbnailed" data-fileid="153630" data-ratio="35.00" data-unique="mtm1rjsdr" width="600" src="https://academy.hsoub.com/uploads/monthly_2024_07/19.png.ba7aef2bb109f4795d9c73c42aaebf25.png">
</p>

<p>
	يمكنك إنشاء مخطط مثل هذا لأي نوع من الألعاب تقريبًا حيث يُمثِّل كل مستطيل في الصورة السابقة كيانًا يظهر في اللعبة من وجهة نظر اللاعب، وتُخبرك الأسهم أي مشهد يمتلك مشهدًا آخر. بمجرد أن تضع مخطط لعبتك فيمكنك حينها إنشاء مشهد لكل عنصر مُدرج في هذا المخطط لتطوير لعبتك. ويمكنك الاستفادة من ميزة الاستنساخ لبناء شجرة مَشاهد، سواء بكتابة كود برمجي لإتشاء المشهد أو يمكنك إنشاؤه مباشرة في المحرر الرسومي لجودو.
</p>

<p>
	غالبًا ما يقضي المبرمجون وقتًا طويلًا في تصميم هياكل معمارية مجردة ومحاولة تنسيق المكونات ضمنها، إلا أنّ التصميم بناءً على مشاهد اللعبة يجعل التطويرَ أسرع وأسهل، مما يسمح لك بالتركيز على منطق اللعبة نفسه. ونظرًا لأن معظم مكونات اللعبة تتطابق مباشرة مع مشهد ما، فإن استخدام التصميم المعتمد على المشهد يعني أن بإمكانك العمل على كل مشهد بشكل مستقل والتركيز على العلاقات بين المشاهد ودمج المشاهد الفرعية في المشاهد الرئيسية، وهذا يقلل من حجم الشيفرة البرمجية.
</p>

<p>
	إليك مثالًا على مخطط المشهد للعبة عالم مفتوح بأصول كثيرة وعناصر متداخلة:
</p>

<p style="text-align: center;">
	<img alt="20.png" class="ipsImage ipsImage_thumbnailed" data-fileid="153629" data-ratio="35.00" data-unique="czsgglmdl" width="600" src="https://academy.hsoub.com/uploads/monthly_2024_07/20.png.101e5358c770ec5c04e6b5f026bf27fb.png">
</p>

<p>
	تخيل أننا بدأنا بإنشاء الغرفة، يُمكننا إنشاء عدة مَشاهد غرف مختلفة بترتيبات فريدة من الأثاث في كل منها، ويُمكننا في وقت لاحق إنشاء مشهد منزل يستخدم عدة نسخ غرف داخلية. وسنُنشئ قلعة من العديد من المنازل المُثبتة وأرضية كبيرة نضع عليها القلعة. وكل هذه ستكون حالات استنساخ لمشهد واحد أو أكثر.
</p>

<p>
	وفي وقت لاحق، يُمكن إنشاء مَشاهد جديدة تُمثِّل حُراسًا وإضافتهم إلى القلعة. ستتم إضافتهم بشكل غير مباشر إلى عالم اللعب كاملًا، وبفضل هذه الميزة في محرك ألعاب جودو، سيكون من السهل عليك تحسين وتطوير لعبتك بطريقة سهلة ومنظمة إذ أن كل ما عليك فعله هو إنشاء واستنساخ المزيد من المَشاهد.
</p>

<p>
	لقد صُمّم المحرر في جودو ليكون سهل الوصول من قبل المبرمجين والمصممين والفنانين على حد سواء، ويُمكن أن يشارك في عملية تطوير اللعبة فريق مؤلف من مصممي نمذجة ثنائية أو ثلاثية الأبعاد، ومصممي مستويات، ومصممي ألعاب، ومصممي رسوم متحركة، ويمكنهم أن يتعاونوا بكل مرونة ويعملوا جميعًا ضمن محرر جودو بطريقة سلسلة ومنظمة.
</p>

<h2 id="-3">
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على ميزة الاستنساخ التي يقصد بها عملية إنتاج نسخ من كائن ما في محرك ألعاب جودو ورأينا أن لهذه الميزة استخدامات عديدة. كما تعرفنا أكثر على المَشاهد التي تمنحك القدرة على تقسيم لعبتك إلى مكوِّنات قابلة لإعادة الاستخدام وتوفر لك أداة لبناء الأنظمة المعقدة كما توفر لك لغة رسومية تسهل عليك التفكير في هيكل مشروع اللعبة وتحسينها وتطويرها.
</p>

<p>
	ترجمة - وبتصرف - لقسم <a href="https://docs.godotengine.org/en/stable/getting_started/step_by_step/instancing.html" rel="external nofollow">Creating instances</a> من توثيق جودو الرسمي.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B9%D9%82%D8%AF-nodes-%D9%88%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%87%D8%AF-scenes-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2357/" rel="">العقد Nodes والمشاهد Scenes في جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B1%D8%A4%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%8A%D8%A9-%D9%84%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2278/" rel="">الرؤية التصميمية لمحرك اﻷلعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">تعرف على أهمية صناعة الألعاب الإلكترونية</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2364</guid><pubDate>Sat, 13 Jul 2024 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x639;&#x642;&#x62F; Nodes &#x648;&#x627;&#x644;&#x645;&#x634;&#x627;&#x647;&#x62F; Scenes &#x641;&#x64A; &#x62C;&#x648;&#x62F;&#x648; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B9%D9%82%D8%AF-nodes-%D9%88%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D9%87%D8%AF-scenes-%D9%81%D9%8A-%D8%AC%D9%88%D8%AF%D9%88-godot-r2357/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_07/-Nodes--Scenes---Godot.png.66a0e3cb1429f397dedbf320b4095b25.png" /></p>
<p>
	تعرفنا في مقال سابق على <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">المفاهيم الرئيسية لمحرك الألعاب جودو Godot</a>، ورأينا أنّ اللعبة عبارة عن مجموعة من المَشاهد على شكل شجرة وأنّ كل مشهد هو شجرة من العقد بحد ذاته. في هذا الدرس، سنشرح المزيد حول العقد والمشاهد ونعلمك كيف يمكن أن تنُشئ أول مشهد في جودو بنفسك.
</p>

<h2 id="">
	العقد
</h2>

<p>
	العقد هي الوحدات الأساسية لبناء لعبتك، فهي مثل المكونات في نموذج، وهناك عشرات الأنواع من العقد والتي يمكن أن تعرض صورة أو صوتًا أو كاميرا وغيرها الكثير من الأنواع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152439" href="https://academy.hsoub.com/uploads/monthly_2024_07/1.png.5197c1894d7f80cef32982641b5fceb2.png" rel=""><img alt="1" class="ipsImage ipsImage_thumbnailed" data-fileid="152439" data-unique="zbtws40kj" src="https://academy.hsoub.com/uploads/monthly_2024_07/1.png.5197c1894d7f80cef32982641b5fceb2.png"> </a>
</p>

<p>
	تمتلك جميع العقد في جودو الخصائص التالية:
</p>

<ul>
	<li>
		اسم.
	</li>
	<li>
		خصائص قابلة للتحرير.
	</li>
	<li>
		تتلقى استدعاءات لتحديثها في كل إطار.
	</li>
	<li>
		يمكنك تطويرها بإضافة خصائص ودوال جديدة.
	</li>
	<li>
		يمكنك إضافتها إلى عقدة أخرى بصفة ابن.
	</li>
</ul>

<p>
	الخاصية الأخيرة مهمة حيث تشكّل العقد مع بعضها <strong>شجرة </strong>وهي ميزة قوية لتنظيم المشاريع. ونظرًا لأن العقد المختلفة لها دوال مختلفة، فإن دمجها معًا ينتج عنه سلوك أكثر تعقيدًا حيث يمكنك بناء شخصية <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-r2280/" rel="">لعبة ثنائية الأبعاد</a> تتبعها الكاميرا باستخدام عقدة <code>CharacterBody2D</code>، وعقدة <code>Sprite2D</code>، وعقدة <code>Camera2D</code>، وعقدة <code>CollisionShape2D</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152440" href="https://academy.hsoub.com/uploads/monthly_2024_07/2.png.421ff15601b8fe7467aec7775f15d75f.png" rel=""><img alt="2" class="ipsImage ipsImage_thumbnailed" data-fileid="152440" data-unique="rqssi89yz" src="https://academy.hsoub.com/uploads/monthly_2024_07/2.png.421ff15601b8fe7467aec7775f15d75f.png"> </a>
</p>

<h2 id="scenes">
	المَشاهد Scenes
</h2>

<p>
	عندما ترتّب العقد ضمن شجرة، نسمي هذا التركيب <strong>مشهدًا </strong>تمامًا مثل الشخصية الموضحة في الصورة التالية، وبمجرد حفظها، ستصبح المَشاهد كنوع جديد من العقد في المحرر، حيث يمكنك إضافتها بصفة ابن لعقد موجودة مسبقًا. وفي هذه الحالة، تظهر نسخة من المشهد كعقدة واحدة مع تفاصيلها الداخلية المخفية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152441" href="https://academy.hsoub.com/uploads/monthly_2024_07/3.png.7b2c2b5d89218eb32d404ebd9eec5457.png" rel=""><img alt="3" class="ipsImage ipsImage_thumbnailed" data-fileid="152441" data-unique="ay1bpsl42" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/3.png.7b2c2b5d89218eb32d404ebd9eec5457.png"> </a>
</p>

<p>
	تسمح لك المَشاهد ببناء الشيفرة البرمجية للعبتك بالطريقة التي تريدها، كما يمكنك <strong>تكوين عقد</strong> لإنشاء أنواع مخصصة ومعقدة منها، مثل شخصية لعبة تركض وتقفز، مع شريط حياة Health bar، ومجموعة من الإعدادات التي تمكنك من التفاعل معها، وغيره الكثير.
</p>

<p>
	يعدّ محرر الألعاب جودو في الأساس <strong>محرر مشاهد </strong>فهو يحتوي على العديد من الأدوات لتحرير المَشاهد ثنائية وثلاثية الأبعاد، بالإضافة إلى واجهات المستخدم. كما أن المشروع الذي يُنفذ باستخدام محرك جودو يمكن أن يحتوي على العديد من هذه المَشاهد حسب الحاجة. يتطلّب المحرك وجود مشهد واحد فقط <strong>كمشهد رئيسي</strong> لتطبيقك، وهو ذاته المشهد الذي يعرضه المحرك في البداية عند تشغيل اللعبة.
</p>

<p>
	تتمتع المَشاهد - بالإضافة إلى عملها كعقد - بالخصائص التالية:
</p>

<ul>
	<li>
		لديها دائمًا عقدة جذر واحدة، مثل الشخصية في مثالنا.
	</li>
	<li>
		يمكنك حفظها على وسيط التخزين الخاص بك وتحميلها لاحقًا.
	</li>
	<li>
		يمكنك إنشاء عدد لا منتهي من النسخ للمشهد، ويمكنك أن تملك خمس أو عشر شخصيات في لعبتك، تم إنشاؤها من مشهد الشخصية الأساسي الخاص بك.
	</li>
</ul>

<h2 id="-1">
	إنشاء أول مشهد لك
</h2>

<p>
	سنُنشئ أول مشهد بعقدة واحدة، ولتنفيذ ذلك، ستحتاج أولاً إلى إنشاء مشروع جديد. بعد فتح نافذة المشروع، سيظهر لك محرر فارغ.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152442" href="https://academy.hsoub.com/uploads/monthly_2024_07/4.png.78d59dfd66dcba1abe2f4ec1b7716e46.png" rel=""><img alt="4" class="ipsImage ipsImage_thumbnailed" data-fileid="152442" data-unique="3wcc7xg64" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/4.thumb.png.8127b8b8e5499e3ad9e5a210fdc71f4c.png"> </a>
</p>

<p>
	تظهر عدة خيارات في مشهد فارغ، ومن قائمة "مشهد Scene" على اليسار لإضافة عقد جذر بسرعة. تضيف 2D Scene عقد <code>Node2D</code> وتضيف 3D Scene عقد <code>Node3D</code>، وتضيف User Interface عقد <code>Control</code>.
</p>

<p>
	هذه التعيينات اختيارية حسب الحاجة وليس بالضرورة اختيارها جميعها. يتيح لك الخيار Other Node تحديد أي عقدة لتكون هي العقدة الجذر. ويعادل خيار Other Node في مشهد فارغ خيار Add Child Node في أعلى الجزء الأيسر من قائمة "مشهد Scene"، والذي عادة ما يضيف عقدًا جديدة كأبناء للعقد التي تم اختيارها مسبقًا.
</p>

<p>
	الآن سنضيف عقدة Label واحدة إلى المشهد. تتمثل وظيفتها برسم نص على الشاشة.
</p>

<p>
	انقر فوق زر Add Child Node أو Other Node لإنشاء عقدة جذر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152443" href="https://academy.hsoub.com/uploads/monthly_2024_07/5.png.8a891a45d7c7d6e7f1e0bb1de1a5e22b.png" rel=""><img alt="5" class="ipsImage ipsImage_thumbnailed" data-fileid="152443" data-unique="bnieq7imi" src="https://academy.hsoub.com/uploads/monthly_2024_07/5.png.8a891a45d7c7d6e7f1e0bb1de1a5e22b.png"> </a>
</p>

<p>
	ستفتح نافذة إنشاء العقد وتظهر قائمة طويلة من العقد المتوفرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152444" href="https://academy.hsoub.com/uploads/monthly_2024_07/6.png.05d7d206828f8c0920a41dc331410766.png" rel=""><img alt="6" class="ipsImage ipsImage_thumbnailed" data-fileid="152444" data-unique="lvjy5dpaq" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/6.png.05d7d206828f8c0920a41dc331410766.png"> </a>
</p>

<p>
	حدد عقدة Label. يمكنك كتابة اسمها لتصفية القائمة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152445" href="https://academy.hsoub.com/uploads/monthly_2024_07/7.png.0c6d84c0b690f97b29adc619f5b0a1b3.png" rel=""><img alt="7" class="ipsImage ipsImage_thumbnailed" data-fileid="152445" data-unique="xc37ibesc" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/7.png.0c6d84c0b690f97b29adc619f5b0a1b3.png"> </a>
</p>

<p>
	انقر فوق عقدة Label لتحديدها ثم اضغط على زر "أنشئ Create" في أسفل النافذة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152446" href="https://academy.hsoub.com/uploads/monthly_2024_07/8.png.a14987fb5694115c296aabda283e7f02.png" rel=""><img alt="8" class="ipsImage ipsImage_thumbnailed" data-fileid="152446" data-unique="3m7sdt7iu" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/8.thumb.png.4d18165d77d69b3af36fb920ef295577.png"> </a>
</p>

<p>
	يحدث الكثير في <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك الألعاب</a> عند إضافة أول عقدة إلى المشهد، حيث يتغير المشهد إلى مساحة عمل ثنائية الأبعاد لأن Label هو عقدة من نوع 2D. يظهر Label مُحدَّدًا في الزاوية اليسرى العلوية من نافذة العرض، وتظهر العقدة في القائمة "مشهد Scene" على اليسار، كما تظهر عناصر العقد في قائمة "الفاحص Inspector" على اليمين.
</p>

<h2 id="-2">
	تغيير عناصر العقد
</h2>

<p>
	الخطوة التالية هي تغيير عنصر "Text" في Label. دعونا نغيره إلى Hello World
</p>

<p>
	انتقل إلى قائمة الفاحص Inspector على يمين نافذة العرض، ثم انقر داخل الحقل أسفل عنصر Text واكتب Hello World
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152447" href="https://academy.hsoub.com/uploads/monthly_2024_07/9.png.6809b60187a0f1582c1a4a01395d24ec.png" rel=""><img alt="9" class="ipsImage ipsImage_thumbnailed" data-fileid="152447" data-unique="wh6d2yavu" src="https://academy.hsoub.com/uploads/monthly_2024_07/9.png.6809b60187a0f1582c1a4a01395d24ec.png"> </a>
</p>

<p>
	سترى أن النص يرسم ضمن نافذة العرض أثناء كتابتك.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ملاحظة: يمكنك تعديل أي خاصية موجودة في Inspector كما فعلنا مع العقدة Text. لمرجع متكامل حول قسم Inspector اطّلع <a href="https://docs.godotengine.org/en/stable/tutorials/editor/inspector_dock.html#doc-editor-inspector-dock" rel="external nofollow">هنا</a>.
	</p>
</blockquote>

<p>
	يمكنك نقل عقدة Label في نافذة العرض عن طريق تحديد أداة النقل في شريط الأدوات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152448" href="https://academy.hsoub.com/uploads/monthly_2024_07/10.png.2bd5468c2fd121c1e0d24cd69cc19796.png" rel=""><img alt="10" class="ipsImage ipsImage_thumbnailed" data-fileid="152448" data-unique="0wd4m94me" src="https://academy.hsoub.com/uploads/monthly_2024_07/10.png.2bd5468c2fd121c1e0d24cd69cc19796.png"> </a>
</p>

<p>
	عند تحديد عقدة Label، انقر واسحب في أي مكان ضمن نافذة العرض لنقلها إلى وسط العرض المحدد بالمستطيل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152449" href="https://academy.hsoub.com/uploads/monthly_2024_07/11.png.2fce07abb04f2a66f7a3c6d28e867fae.png" rel=""><img alt="11" class="ipsImage ipsImage_thumbnailed" data-fileid="152449" data-unique="sw340wmke" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/11.thumb.png.d4bb81ac0d96d1449b6a27bba6128e42.png"> </a>
</p>

<h2 id="-3">
	تشغيل المشهد
</h2>

<p>
	أصبح كل شيء جاهزًا لتشغيل المشهد. اضغط على زر تشغيل المشهد في أعلى اليمين من الشاشة أو اضغط على <code>F6</code>) <code>Cmd+R</code> على نظام macOS).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152450" href="https://academy.hsoub.com/uploads/monthly_2024_07/12.png.b57af0753e476b00ce545afba07dfda3.png" rel=""><img alt="12" class="ipsImage ipsImage_thumbnailed" data-fileid="152450" data-unique="bm55iu2bs" src="https://academy.hsoub.com/uploads/monthly_2024_07/12.png.b57af0753e476b00ce545afba07dfda3.png"> </a>
</p>

<p>
	ستظهر نافذة منبثقة تطلب منك حفظ المشهد، وهذا خيار ضروري لتشغيل المشهد. انقر على زر الحفظ في مستعرض الملفات لحفظه باسم <code>label.tscn</code>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152451" href="https://academy.hsoub.com/uploads/monthly_2024_07/13.png.970976f5224e8dbdf9e838f038c50885.png" rel=""><img alt="13" class="ipsImage ipsImage_thumbnailed" data-fileid="152451" data-unique="1ks00d7vz" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/13.png.970976f5224e8dbdf9e838f038c50885.png"> </a>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ملاحظة: تسمح نافذة حفظ المشهد كما هو الحال مع نوافذ الملفات الأخرى في المحرر، بحفظ الملفات داخل المشروع فقط. يمثل مسار res<code>://</code> في أعلى النافذة مسار جذر للمشروع ويعبر عن مسار المورد
	</p>
</blockquote>

<p>
	يجب أن يفتح التطبيق في نافذة جديدة ويعرض فيها النص Hello World على النحو التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152452" href="https://academy.hsoub.com/uploads/monthly_2024_07/14.png.03ab9545fef3c1e29794ac0f41abe52d.png" rel=""><img alt="14" class="ipsImage ipsImage_thumbnailed" data-fileid="152452" data-unique="5ky4nas5j" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/14.png.03ab9545fef3c1e29794ac0f41abe52d.png"> </a>
</p>

<p>
	أغلق النافذة أو اضغط على <code>F8</code> (<code>‫cmd + .</code> على نظام macOS) لإيقاف تشغيل المشهد.
</p>

<h2 id="-4">
	تعيين المشهد الرئيسي
</h2>

<p>
	استخدمنا زر التشغيل لتشغيل المشهد، ويوجد زر آخر بجانبه يسمح لك بتحديد وتشغيل المشهد الرئيسي للمشروع. يمكنك الضغط على <code>F5</code> ‫(<code>Cmd + B</code> على نظام macOS) لفعل ذلك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152453" href="https://academy.hsoub.com/uploads/monthly_2024_07/15.png.aef43a0cff55fa8c0284b206551a7641.png" rel=""><img alt="15" class="ipsImage ipsImage_thumbnailed" data-fileid="152453" data-unique="3cc2kvv6z" src="https://academy.hsoub.com/uploads/monthly_2024_07/15.png.aef43a0cff55fa8c0284b206551a7641.png"> </a>
</p>

<p>
	ستظهر نافذة منبثقة تطلب منك تحديد المشهد الرئيسي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152454" href="https://academy.hsoub.com/uploads/monthly_2024_07/16.png.ce4716ce31ae59b1ada44086bbf0fdc2.png" rel=""><img alt="16" class="ipsImage ipsImage_thumbnailed" data-fileid="152454" data-unique="k15404feg" src="https://academy.hsoub.com/uploads/monthly_2024_07/16.png.ce4716ce31ae59b1ada44086bbf0fdc2.png"> </a>
</p>

<p>
	انقر على زر التحديد ثم انقر مرتين على <code>label.tscn</code> في المربع الذي يظهر لك
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152455" href="https://academy.hsoub.com/uploads/monthly_2024_07/17.png.4cf17c6e240d6969b19e87fc3435fe6c.png" rel=""><img alt="17" class="ipsImage ipsImage_thumbnailed" data-fileid="152455" data-unique="0gq143sz3" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_07/17.thumb.png.44ffa5844d1c9e406c4e563a54714520.png"> </a>
</p>

<p>
	يجب أن تشغل العرض التوضيحي مرة أخرى وعند تشغيلك للمشروع في المرات القادمة، سيستخدم جودو هذا المشهد كنقطة بداية.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ملاحظة: يحفظ المحرر مسار المشهد الرئيسي في ملف project.godot في مسار المشروع الذي صممته. وبالإمكان تعديل هذا الملف النصي مباشرة لتغيير إعدادات المشروع، كما يمكنك استخدام نافذة "المشروع Project" ثم "إعدادات المشروع Project Settings" لفعل ذلك.
	</p>
</blockquote>

<h2>
	الخلاصة
</h2>

<p>
	تناولنا في هذا المقال مفاهيم العقد Nodes والمشاهد Scenes في محرك الألعاب Godot ورأينا أن العقد هي الوحدات الأساسية التي تشكل مكونات اللعبة وقد تكون عبارة عن صورة أو صوت أو عنصر واجهة مستخدم، وأنها تتكون من خصائص قابلة للتعديل وتستجيب لاستدعاءات التحديث في كل إطار من إطارات اللعبة، كما استعرضنا كيفية تركيب العقد داخل شجرة لتشكيل مشهد يمثل كيانًا مستقلاً في اللعبة مثل شخصية أو مستوى ما. وفي المقال التالي، سنناقش مفهومًا رئيسيًا آخر في <a href="https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-r2304/" rel="">برمجة الألعاب</a> باستخدام جودو وهو إنشاء نسخ من المشهد.
</p>

<p>
	ترجمة - وبتصرف - لقسم <a href="https://docs.godotengine.org/en/stable/getting_started/step_by_step/nodes_and_scenes.html" rel="external nofollow">Nodes and Scenes</a> من توثيق جودو الرسمي.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">تعرف على أشهر لغات برمجة الألعاب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D9%86%D8%A7%D8%A1-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7-%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%B4%D8%A7%D8%B4%D8%A7%D8%AA-%D8%A7%D9%84%D9%84%D9%85%D8%B3-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%91%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-r2255/" rel="">دليلك الشامل إلى بناء كاميرا خاصة بشاشات اللمس في محرّك اﻷلعاب جودو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sqlite-r2241/" rel="">إعداد محرك الألعاب جودو Godot للعمل مع قاعدة البيانات SQLite</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2357</guid><pubDate>Sat, 06 Jul 2024 15:00:00 +0000</pubDate></item><item><title>&#x62F;&#x644;&#x64A;&#x644;&#x643; &#x627;&#x644;&#x634;&#x627;&#x645;&#x644; &#x625;&#x644;&#x649; &#x628;&#x631;&#x645;&#x62C;&#x629; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628;</title><link>https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-r2304/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/----.png.19e4151be1596feb3156c1dcb019b576.png" /></p>
<p>
	ازداد الإقبال على الألعاب ومجالات الترفيه في الآونة الأخيرة بين أوساط المستخدمين، وهو يزداد يومًا بعد الآخر لاسيما بعد انتشار ألعاب الجوال التي سهلت عملية الوصول للألعاب والتسلية بها، واليوم تعد صناعة الألعاب صناعة رائجة ومربحة وتُقام لها مسابقاتٌ بأموالٍ طائلة، وهذا زاد من الطلب على مبرمجي الألعاب ورفع من فرصهم التوظيفية، وفي مقال اليوم نشرح لكم ما هي برمجة الألعاب؟ وما أهم تقنياتها؟ وما مراحل برمجة لعبة إلكترونية؟
</p>

<h2 id="-1">
	ما هي برمجة الألعاب؟
</h2>

<p>
	<span ipsnoautolink="true">تعد برمجة الألعاب</span> واحدة من أهم تخصصات البرمجة، وهي مرحلة هامة في صناعة الألعاب الإلكترونية تأتي بعد العديد من المراحل السابقة بدءًا من وضع فكرة اللعبة وكتابة قصتها وتحديد شخصياتها وقواعدها، مرورًا بتصميم اللعبة ثم برمجتها وكتابة المنطق البرمجي اللازم لتحويلها من فكرة وتصماميم إلى لعبة فعلية يمكن لعبها، وصولًا إلى إصدارها للمستخدمين وإتاحتها للتحميل على المتاجر المخصصة وتحديثها وصيانتها بصورة مستمرة.
</p>

<p>
	تعرف برمجة الألعاب بأنها عملية كتابة الكود البرمجي اللازم لعمل الألعاب الإلكترونية باستخدام مجموعة متنوعة من التقنيات ولغات البرمجة، وهي تتطلب إلى جانب توفر المهارات التقنية لوجود معرفة جيدة بالرياضيات مثل الأشعة الرياضية والرسوم المتجهة، والجبر الخطي، وفهمًا جيد لتصميم الألعاب وأنواعها كالألعاب ثنائية الأبعاد 2D وثلاثية الأبعاد 3D، وامتلاك مهارات إبداعية وتفكير منطقي لإنشاء ألعاب احترافية وحل مشكلاتها وصناعة ألعاب محببة يمكن اللعب بسلاسة واستمتاع.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" id="ips_uid_8570_6" referrerpolicy="strict-origin-when-cross-origin" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="560" data-embed-src="https://www.youtube.com/embed/O5suGXMNMdU?si=e1LgqPPHGXd0iQzL"></iframe>
</p>

<h2>
	أهمية برمجة الألعاب
</h2>

<p>
	لا تقتصر <span ipsnoautolink="true">أهمية برمجة الألعاب</span> على الترفيه والتسلية، وإنما تتعدد فوائدها وتمتد إلى مجالاتٍ أخرى، وإليك قائمة توضح أهم هذه الفوائد:
</p>

<ul>
	<li>
		<p>
			<strong>تسهيل التعليم:</strong> دخلت الألعاب إلى عملية التعليم وزادت الألعاب التعليمية زيادةً ملحوظة في الآونة الأخيرة، فنجد لُعَبًا لتعليم البرمجة، مثل: سكراتش ومايكروسوفوت ميك كود، ويوجد ألعابٌ لتعليم اللغات المختلفة، وألعابٌ أخرى لتعليم مبادئ الرياضيات والفيزياء.
		</p>
	</li>
	<li>
		<p>
			<strong>تطوير القدرة على الإبداع وحل المشكلات:</strong> تحفز غالبية الألعاب الفرد على ابتكار طرق جديدة للتفوق على أقرانه في اللعبة، مما يزيد من قدراته الإبداعية والابتكارية، وكذلك أثناء ابتكار هذه الطرق تواجهه مشكلات عديدة يسعى لحلها، فتتطور عنده مهارة حل المشكلات.
		</p>
	</li>
	<li>
		<p>
			<strong>تنمية المهارات الناعمة:</strong> باتت كثيرٌ من الألعاب تعتمد على تشكيل الفرق واللعب ضمن مجموعات، ما يساعد على تنمية مهارات التعاون والتواصل والقيادة وغيرها.
		</p>
	</li>
</ul>

<p>
	ولمطالعة المزيد من المعلومات حول أهمية برمجة الألعاب وأهم النصائح التي تساعدك لتصبح مطور ألعاب محترف، ننصحك بمطالعة مقال <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">تعرف على أهمية صناعة الألعاب الإلكترونية</a>.
</p>

<h2 id="-2">
	ما لغات برمجة الألعاب الإلكترونية؟
</h2>

<p>
	تكثر <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">لغات برمجة الألعاب</a> الإلكترونية، ويشتهر منها أربع لغات:
</p>

<ul>
	<li>
		سي بلس بلس⁦ C++
	</li>
	<li>
		سي شارب #C⁦
	</li>
	<li>
		جافا Java
	</li>
	<li>
		بايثون Python
	</li>
</ul>

<p>
	يعتمد اختيار اللغة البرمجية المناسبة لبرمجة الألعاب على متطلباتك وطبيعة اللعبة التي تطورها، لنتعرف على المزيد من المعلومات عن كل لغة من هذه اللغة، وأبرز مزايا وعيوب استخدامها في برمجة الألعاب.
</p>

<h3 id="c">
	سي بلس بلس ++C⁦
</h3>

<p>
	تعد <a href="https://academy.hsoub.com/programming/cpp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-c-r802/" rel="">سي بلس بلس</a> إحدى أهم <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a> في مجال برمجة الألعاب، إذ لديها قدرة قوية على إدارة الذاكرة والعتاد بكفاءة، كما تتميز الألعاب المطورة باستخدام سي بلس بلس بالسرعة والأداء المرتفع، وكذلك تحظى لغة سي بلس بلس بدعم واسع من محركات الألعاب المختلفة، ما يجعلها لغة مميزة في برمجة الألعاب الثقيلة والمعقدة، ولا يعيب سي بلس بلس سوى صعوبة تعلمها وطول الوقت المتوقع للانتهاء من برمجة لعبة.
</p>

<h3 id="c-1">
	سي شارب #C⁦⁦
</h3>

<p>
	تتشابه لغة البرمجة <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-c-r597/" rel="">سي شارب</a> في مميزاتها مع لغة سي بلس بلس، من سرعة إلى إدارة مميزة للعتاد ودعم واسع من مختلف محركات الألعاب، إلا أن سي شارب تعد أقل تعقيدًا وأسرع تعلمًا من سي بلس بلس، ما يجعلها خيارًا مناسبًا للمبتدئين في برمجة الألعاب، وكذلك تعد لغة سي شارب متعددة المنصات؛ أي يمكن باستخدامها برمجة ألعاب لأنظمة تشغيل الحواسيب وأنظمة تشغيل الهواتف سواءً.
</p>

<h3 id="java">
	جافا Java
</h3>

<p>
	تشتهر لغة <a href="https://academy.hsoub.com/programming/java/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%A7-%D9%87%D9%8A%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-java-r1515/" rel="">جافا</a> في برمجة ألعاب نظام تشغيل أندرويد، وتتميز الألعاب المبنية على لغة جافا بالقدرة الهائلة على التوسع وتحمل الزيادة المستمرة في أعداد المستخدمين دون حدوث أعطال في اللعبة، وكذلك توفر لغة جافا أدواتٍ مميزة للتعامل مع الرسوم Graphics والرسوم المتحركة Animations، ما يساعد المطور على برمجة ألعاب معقدة بصريًا بسهولة.
</p>

<h3 id="python">
	بايثون Python
</h3>

<p>
	لعل ما يميز <a href="https://academy.hsoub.com/python/" rel="">بايثون</a> في مجال برمجة الألعاب هو سهولتها، ولذلك تُستخدم لغة بايثون في برمجة الألعاب البسيطة الخالية من التعقيدات الرسومية، وكذلك تُستخدم بايثون للنمذجة الأولية للألعاب المعقدة قبل الشروع في تطويرها باستخدام لغة أخرى.
</p>

<h2 id="-3">
	ما أهم التقنيات المستخدمة في برمجة الألعاب؟
</h2>

<p>
	إلى جانب لغات البرمجة التي شرحناها سابقُا، هناك العديد من التقنيات التي يتوجب على مبرمجي الألعاب معرفتها وتعلم استخدامها وأبرز هذه التقنيات:
</p>

<ul>
	<li>
		محركات الألعاب Game Engines
	</li>
	<li>
		برامج التصميم أو النمذجة ثلاثية الأبعادوالتحريك 3D Modeling and Animations
	</li>
	<li>
		برامج تصميم رسومات البكسل Pixel Art
	</li>
</ul>

<h3 id="gameengines">
	محركات الألعاب Game Engines
</h3>

<p>
	تعد <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محركات الألعاب</a> بيئات مجهزة لتطوير وتشغيل الألعاب، وتضم مجموعة من المحركات الأخرى، مثل: محرك الفيزياء الذي يساعد المبرمج على محاكاة الحركات الحقيقية في اللعبة، ومحرك الرسوم الذي يعالج الرسوم ثنائية الأبعاد وثلاثية الأبعاد في اللعبة، ومحرك الصوت المسؤول عن معالجة التأثيرات الصوتية في اللعبة، ومحرك الرسوم المتحركة، وغيرها من المحركات.
</p>

<p>
	لعل أبرز فوائد محركات اللعبة هي تسهيلها لعملية برمجة الألعاب وتوفيرها للكثير من الوقت على المبرمج، إذ كانت هذه العملية قبلًا شديدة التعقيد، ولكن بفضل محركات اللعبة صارت عملية سهلة وزادت إمكانيات الألعاب من رسوم وأداء وغيرها، ومن أشهر محركات الألعاب نذكر محرك يونتي Unity ومحرك أن ريل Unreal Engine ومحرك الألعاب جودو <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">Godot</a>.
</p>

<h3 id="3dmodelingandanimations">
	برامج التصميم أو النمذجة ثلاثية الأبعاد والتحريك 3D Modeling and Animations
</h3>

<p>
	تشير النمذجة ثلاثية الأبعاد إلى عملية التمثيل المرئي للأبعاد الثلاثة وهم الطول والعرض والارتفاع لعنصرٍ في اللعبة باستخدام النقاط والخطوط والمضلعات، مثل: تمثيل إحدى شخصيات اللعبة مرئيًا على هيئة رسم ثلاثي الأبعاد، كما تتضمن نمذجة تحريكات العناصر، علي سبيل المثال نمذجة تحريك النباتات حول الشخصية أثناء سيرها، أو نمذجة سير الشخصية نفسها.
</p>

<p>
	تتضمن عملية النمذجة ثلاثية الأبعاد تحديد حجم الكائن أو العنصر وهيئته وتحديد طريقة حركته وتناغمه مع باقي عناصر اللعبة، ويعد التصميم ثلاثي الأبعاد مهمًا لزيادة واقعية اللعبة وتحسين رسومها وجاذبيتها، ومن أشهر البرمجيات المستخدمة في هذه العملية: برنامج Blender وAutodesk.
</p>

<h3 id="pixelart">
	برامج تصميم رسومات البكسل Pixel Art
</h3>

<p>
	يعد <a href="https://academy.hsoub.com/design/graphic/photoshop/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%81%D9%86-%D8%A7%D9%84%D8%A8%D9%90%D9%83%D8%B3%D9%84-pixel-art-r358/" rel="">فن البكسل</a> فنًا رقميًا يستخدم في العديد من المجالات ومن ضمنها رسومات الألعاب، إذ يعمل مصمم رسوم البكسل على تصميم الصورة أو الرسم على مستوى البكسل، وهو الوحدة الأصغر من مكونات الصورة ويستخدمون فيها عددًا محددًا من الألوان، ولتبيين هذا المفهوم بدقة أكبر انظر الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="148410" href="https://academy.hsoub.com/uploads/monthly_2024_04/pixel_art.jpg.95fb53593a0336d809d880264acceeb0.jpg" rel=""><img alt="pixel art" class="ipsImage ipsImage_thumbnailed" data-fileid="148410" data-ratio="75.33" data-unique="ebv4ttxe6" style="width: 400px; height: auto;" width="600" src="https://academy.hsoub.com/uploads/monthly_2024_04/pixel_art.thumb.jpg.a7a5c587fcaffb415ac437e02fe639cc.jpg"> </a>
</p>

<p>
	ولعل أبرز لعبة مبنية على هذا النوع من الرسوم هي لعبة ماين كرافت الشهيرة، ومن أشهر برامج تصميم فن البكسل نذكر برنامج Aseprite وبرنامج PyxelEdit. وللتنويه لا يحتاج مبرمجو الألعاب لإنشاء رسومات البكسل بأنفسهم فهناك العديد من المواقع التي توفر مكتبات مجانية أو مدفوعة من رسومات البكسل التي يمكن استيرادها إلى محركات الألعاب والبدء بكتابة المنطق البرمجي الخاص بها.
</p>

<h2 id="-4">
	ما مراحل برمجة لعبة فيديو؟
</h2>

<p>
	تتضمن عملية برمجة لعبة فيديو عديدًا من المراحل، منها:
</p>

<ol>
	<li>
		<strong>التخطيط:</strong> تبدأ عملية برمجة لعبة فيديو بالتخطيط لها، وتبدأ عملية التخطيط بابتداع فكرة ثم تطوير هذه الفكرة، كما تضم مرحلة التخطيط عملية تحديد نوع اللعبة؛ هل هي لعبة رعب أم حرب أم رياضة أو غيرها؟ وتضم أيضًا تحديد طراز اللعبة؛ ثنائية الألعاب كانت أو ثلاثية الأبعاد، وكذلك تتضمن تحديد محرك الألعاب ولغة البرمجة والتقنيات التي ستستخدمها لبرمجة اللعبة.
	</li>
	<li>
		<strong>ما قبل التطوير:</strong> تضم هذه المرحلة خطوات عديدة، فمنها مثلًا كتابة قصة اللعبة وخلق عالمها وشخصياتها وتحديد صفات كل شخصية، ومنها أيضًا النمذجة الأولية للعبة وإنشاء تصاميم أولية لأشكال الشخصيات، وكذلك تحديد أسلوب التصميم والألوان المستخدمة في اللعبة حسب القصة ونوع اللعبة.
	</li>
	<li>
		<strong>التطوير:</strong> تعد المرحلة الأهم والأطول في عملية برمجة لعبة فيديو، ويعمل خلالها المطور على كتابة شيفرات اللعبة وتحويل التصاميم الأولية إلى لعبة حقيقية، كما يعمل فنانو الصوت على تسجيل الحوارات بين الشخصيات، ويعمل المصممون على تصميم الرسوم المتحركة للعبة، ويعمل مصممو الصوت على إضافة التأثيرات الصوتية للعبة، ثم تُجمع هاته الإبداعات المختلفة معًا عبر محرك اللعبة لتكون اللعبة جاهزة للاختبار.
	</li>
	<li>
		<strong>الاختبار:</strong> يُختبر في هذه المرحلة جميع أجزاء اللعبة، بدءًا من الشيفرات لاستخراج الثغرات الأمنية وتنقيحها، مرورًا بالأداء لتحسينه وتحسين تجربة المستخدم الكلية، وصولًا إلى تناغم الأجزاء المختلفة من اللعبة عمومًا مع بعضها، وكذلك تُختبر مدى صعوبة اللعبة، وغيرها من الأجزاء المختلفة في اللعبة، ثم تُجمَع الأخطاء المكتشفة وتُنقَّح قبل إطلاق اللعبة.
	</li>
	<li>
		<strong>ما قبل الإطلاق:</strong> تتضمن هذه المرحلة التسويق للعبة وكتابة إعلانات تسويقية عنها، كما تتضمن إطلاق نسخة مبدئية للعبة لتجربتها والحصول على آراء أولية قبل الإطلاق الرسمي لها، ما يساعدك على تحسين اللعبة وإطلاقها في أفضل هيئة لها.
	</li>
	<li>
		<strong>الإطلاق:</strong> أصبحت اللعبة جاهزة وحان موعد الإطلاق؛ في هذه المرحلة تنشر اللعبة على المنصات المخطط لها، ولكن لم تنتهِ المراحل بعض فلا تزال اللعبة تحتاج تحديثاتٍ.
	</li>
	<li>
		<strong>التحديث:</strong> لا تنتهي هذه المرحلة أبدًا، إذ تستمر في إصدار التحديثات تحديثًا بعد الآخر لإضافة مميزات جديدة تزيد من متعتها وتُحسِّن من تجربة المستخدم، كما تسد الثغرات والمشكلات المكتشفة بعد إطلاق اللعبة.
	</li>
</ol>

<p>
	إذا كنت مهتمًا بدخول عالم تطوير الألعاب فقد وفرت لك أكاديمية حسوب <a href="https://academy.hsoub.com/learn/game-development/" rel="">دورة تطوير الألعاب</a> لتحويل شغفك إلى مهارة عملية. ستتعلم في هذه الدورة كيف تبني ألعابك الخاصة باستخدام محرك الألعاب جودو Godot، وستتقن برمجة الألعاب وتطور شخصيات ألعاب تتفاعل مع بعضها بذكاء وإبداع.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير الألعاب
		</p>

		<p class="banner-subtitle">
			ابدأ رحلة صناعة الألعاب ثنائية وثلاثية الأبعاد وابتكر ألعاب ممتعة تفاعلية ومليئة بالتحديات.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/game-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/game-development/" rel=""><img alt="دورة تطوير الألعاب" src="https://academy.hsoub.com/learn/assets/images/courses/game-development.png"></a>
	</div>
</div>

<h2 id="-5">
	ما الفرق بين برمجة ألعاب الجوال وبرمجة ألعاب الحاسوب؟
</h2>

<p>
	تتعدد الفروق بين برمجة ألعاب الجوال وبرمجة ألعاب الحواسيب، ومن أهمها:
</p>

<ul>
	<li>
		<strong>الإمكانيات:</strong> يفوق عتاد الحواسيب عتاد الجوالات قوةً وقدراتٍ، ما يزيد من إمكانيات ألعاب الحواسيب، بدءًا من الرسوم فتكون رسوم ألعاب الحواسيب أكثر تعقيدًا، مرورًا بالأداء المرتفع لألعاب الحواسيب، وصولًا إلى توسعية اللعبة وحجم بياناتها وتعقيدها.
	</li>
	<li>
		<strong>محركات الألعاب:</strong> تكثر محركات ألعاب الحواسيب وتتفوق على محركات ألعاب الجوال في المواصفات والإمكانات، ومن أشهرها: محرك الألعاب Unreal Engine ومحرك CryEngine، بينما يعد Unity محرك الألعاب الأشهر في برمجة ألعاب الجوال.
	</li>
	<li>
		<strong>التكلفة:</strong> تعد تكلفة تطوير لعبةٍ للحاسوب أكثر من تكلفة تطوير لعبة للجوال، إذ تتضمن ألعاب الحاسوب تعقيداتٍ أكثر وتأخذ أوقاتًا أطول لبرمجتها من ألعاب الجوال.
	</li>
</ul>

<h2 id="-6">
	الخاتمة
</h2>

<p>
	استكشفنا في مقال اليوم عالم برمجة الألعاب الإلكترونية وحظينا بنظرةٍ شاملةٍ عن ماهيتها وتعرفنا على مجموعة متنوعة من لغات البرمجة المستخدمة في تطوير الألعاب، مع تسليط الضوء على مميزات كل لغة وأهم تقنياتها ومحركاتها، ومراحل تطوير لعبة والفرق بين برمجة ألعاب الجوال وبرمجة ألعاب الحاسوب. وختامًا إذا كنت مهتمًا بمجال برمجة الألعاب ننصحك بأن تبدأ رحلتك في تطوير الألعاب بخطوة صحيحة من خلال تحديد متطلبات  اللعبة التي تود صناعتها واختيار اللغة ومحرك الألعاب المناسب، والاستمتاع في تنفيذ أفكارك الإبداعية وتحويلها للعبة مميزة مليئة بالتحديات والإنجازات.
</p>

<h2 id="-7">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%AA%D8%B7%D9%88%D8%B1%D9%87%D8%A7-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%88%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%AA%D9%87%D8%A7-r2290/" rel="">ألعاب الفيديو: تطورها وأهميتها وخطوات برمجتها</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%86%D8%A7%D8%AC%D8%AD-r2284/" rel="">كيف تصبح مبرمج ألعاب فيديو ناجح</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">تعرف على أهمية صناعة الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">تعرف على أفضل برنامج تصميم الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">أشهر أنواع الألعاب الإلكترونية</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2304</guid><pubDate>Thu, 25 Apr 2024 12:05:00 +0000</pubDate></item><item><title>&#x631;&#x628;&#x637; &#x645;&#x634;&#x627;&#x647;&#x62F; &#x627;&#x644;&#x644;&#x639;&#x628;&#x629; &#x648;&#x648;&#x636;&#x639; &#x627;&#x644;&#x644;&#x645;&#x633;&#x627;&#x62A; &#x627;&#xFEF7;&#x62E;&#x64A;&#x631;&#x629; &#x644;&#x644;&#x639;&#x628;&#x629; &#x62B;&#x646;&#x627;&#x626;&#x64A;&#x629; &#x627;&#x644;&#x623;&#x628;&#x639;&#x627;&#x62F; &#x641;&#x64A; &#x645;&#x62D;&#x631;&#x643; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x62C;&#x648;&#x62F;&#x648; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D8%B1%D8%A8%D8%B7-%D9%85%D8%B4%D8%A7%D9%87%D8%AF-%D8%A7%D9%84%D9%84%D8%B9%D8%A8%D8%A9-%D9%88%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D9%84%D9%85%D8%B3%D8%A7%D8%AA-%D8%A7%EF%BB%B7%D8%AE%D9%8A%D8%B1%D8%A9-%D9%84%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2295/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/(1).png.36f971643991ddc7b01d46fde3229be2.png" /></p>
<p>
	آخر ما يلزمنا ﻹكمال اللعبة ثنائية الأبعاد تفادي الزواحف التي بدأنا العمل عليها في <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-r2280/" rel="">مقال سابق</a> هو بناء واجهة المستخدم user interface المخصصة عرض أشياء مهمة مثل النتيجة أو عبارة "انتهت اللعبة" وزر ﻹعادة اللعب.
</p>

<p>
	لهذا سننشىء في مقال اليوم مشهدًا جديدًا ثم نضيف عقدة من النوع <code>CanvasLayer</code> (واجهة مستخدم) باسم <code>HUD</code> وهي اختصار للكلمات "Heads-up display" بمعنى "شاشة المقدمة" والتي تعرض معلومات عن اللعبة وتظهر على شكل طبقة فوق نافذة عرض اللعبة.
</p>

<h2 id="-1">
	إنشاء واجهة اللعبة
</h2>

<p>
	تسمح لك العقدة <code>CanvasLayer</code> في <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك الألعاب</a> جودو GODOT برسم عناصر واجهة المستخدم على طبقة فوق بقية مشاهد اللعبة، وبالتالي لن تغطيها أية عناصر أخرى كاللاعب أو اﻷعداء.
</p>

<p>
	في لعبتنا الحالة، نحتاج لأن تعرض الواجهة HUD المعلومات التالية:
</p>

<ul>
	<li>
		النتيجة وتغيّرها <code>ScoreTimer</code>
	</li>
	<li>
		رسالة مثل انتهت اللعبة أو استعد للعب
	</li>
	<li>
		زر ابدأ لكي تبدأ اللعب
	</li>
</ul>

<p>
	إن الصنف اﻷساسي لهذه العقدة هو <code>Control</code>، وسنحتاج في واجهتنا لنوعين من عناصر التحكم <code>Control</code> هما عنوان <code>Label</code> وزر <code>Button</code>، لهذا عليك إنشاء ثلاث عقد أبناء للعقدة <code>HUD</code> كالتالي:
</p>

<ul>
	<li>
		عنوان <code>Label</code> باسم <code>ScoreLabel</code>
	</li>
	<li>
		عنوان <code>Label</code> باسم <code>Message</code>
	</li>
	<li>
		زر <code>Button</code> باسم <code>StartButton</code>
	</li>
	<li>
		مؤقت <code>Timer</code> باسم <code>MessageTimer</code>
	</li>
</ul>

<p>
	انقر على العنوان <code>ScoreLabel</code> ثم اكتب رقمًا في الحقل <code>Text</code> ضمن الفاحص، وكما تلاحظ، فإن الخط المستخدم افتراضيًا للعقدة <code>Control</code> صغير وغير مناسب، لذلك سنستخدم خطًا موجودًا ضمن المجلد "font" يُدعى "Xolonium-Regular.ttf" كالتالي: في نافذة الفاحص وتحت اللوحة انقر على Theme Overridesثم Fonts ثم Font ثم اختر "تحميل" واختر الملف "Xolonium-Regular.ttf":
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148031" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_Add_font.png.8d227e143df6b2e06699ab4d92008941.png" rel=""><img alt="01 add font" class="ipsImage ipsImage_thumbnailed" data-fileid="148031" data-unique="nwn3racoj" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_Add_font.png.8d227e143df6b2e06699ab4d92008941.png"> </a>
</p>

<p>
	زد حجم الخط إلى 64 في الحقل "Font Size" ثم كرر نفس العملية على العنوان اﻵخر وعلى الزر في المشهد.
</p>

<p>
	<strong>ملاحظة</strong>: للعقدة <code>Control</code> موقع وأبعاد لكنها تمتلك أيضًا ما يُعرف بالمربط Anchor الذي يحدد نقطة اﻷصل، وهي النقطة المرجعية لحواف العقدة.
</p>

<p>
	رتب العقد كما في لقطة الشاشة التالية، وبإمكانك سحب العقد إلى المكان الذي تريده يدويًا أو استخدم المربط لضبط الموقع بدقة أكبر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148033" href="https://academy.hsoub.com/uploads/monthly_2024_04/03_arranging_UI.png.e4ac27fe8f7948815dd874e7974105e3.png" rel=""><img alt="03 arranging ui" class="ipsImage ipsImage_thumbnailed" data-fileid="148033" data-unique="4lun3pilr" style="width: 215px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/03_arranging_UI.png.e4ac27fe8f7948815dd874e7974105e3.png"> </a>
</p>

<h3 id="scorelabel">
	العنوان ScoreLabel
</h3>

<ol>
	<li>
		أضف النص <code>0</code>
	</li>
	<li>
		اضبط المحاذاة اﻷفقية Horizontal Alignment والعمودية Vertical Alignment على <code>Center</code>.
	</li>
	<li>
		اختر القيمة <code>Center Top</code> لضبط المربط (الخاصية Anchor Preset).
	</li>
</ol>

<h3 id="message">
	الرسالة Message
</h3>

<ol>
	<li>
		أضف النص "تفادي الزواحف".
	</li>
	<li>
		اضبط المحاذاة اﻷفقية Horizontal Alignment والعمودية Vertical Alignment على <code>Center</code>.
	</li>
	<li>
		اضبط قيمة "نمط الالتفاف التلقائي Autowrap Mode" على <code>Word</code> وإلا سيبقى النص على نفس السطر.
	</li>
	<li>
		اضبط قيمة الخاصية <code>Size X</code> الموجودة على المسار Control&gt;Layout&gt;Transform على القيمة <code>480</code>
	</li>
	<li>
		اختر القيمة <code>Center</code> لضبط المربط (الخاصية Anchor Preset).
	</li>
</ol>

<h3 id="startbutton">
	الزر StartButton
</h3>

<ol>
	<li>
		أضف النص "ابدأ".
	</li>
	<li>
		اضبط قيمة الخاصية <code>Size X</code> الموجودة على المسار Control&gt;Layout&gt;Transform على القيمة <code>200</code> والخاصية <code>Size Y</code> على القيمة <code>100</code>.
	</li>
	<li>
		اختر القيمة <code>Center Bottom</code> لضبط المربط (الخاصية Anchor Preset).
	</li>
	<li>
		ا ضبط قيمة الخاصية <code>Position Y</code> الموجودة على المسار Control&gt;Layout&gt;Transform على القيمة <code>580</code>.
	</li>
</ol>

<p>
	وأخيرًا، اضبط الخاصية <code>Wait Time</code> في المؤقت <code>MessageTimer</code> على <code>2</code>، والخاصية <code>One Shot</code> على "فعّال ON" ثم أضف السكربت التالي إلى HUD:
</p>

<pre class="ipsCode">extends CanvasLayer

# Notifies `Main` node that the button has been pressed
signal start_game
</pre>

<p>
	نريد اﻵن عرض رسالة مؤقتة مثل " استعد!" لهذا سنضيف الشيفرة التالية:
</p>

<pre class="ipsCode">func show_message(text):
    $Message.text = text
    $Message.show()
    $MessageTimer.start()
</pre>

<p>
	علينا أيضًا معالجة الحالة التي يخسر فيها اللاعب، لهذا ستعرض الشيفرة التالية رسالة "انتهت اللعبة" لمدة ثانيتين ثم تعود إلى الشاشة الرئيسية وتعرض بعد توقف صغير الزر "ابدأ":
</p>

<pre class="ipsCode">func show_game_over():
    show_message("Game Over")
    # Wait until the MessageTimer has counted down.
    await $MessageTimer.timeout

    $Message.text = "Dodge the\nCreeps!"
    $Message.show()
    # Make a one-shot timer and wait for it to finish.
    await get_tree().create_timer(1.0).timeout
    $StartButton.show()
</pre>

<p>
	تُستدعى الدالة اﻷخيرة عندما يخسر اللاعب.
</p>

<p>
	<strong>ملاحظة</strong>: إن أردت أن توقف اللعبة لفترة وجيزة، بإمكانك استخدام الدالة <code>()create_timer</code> العائدة لشجرة المشاهد بدلًا من استخدام عقدة مؤقت. وهذه الدالة مفيدة جدًا في إضافة تأخير زمني في الحالات المشابهة لحالتنا التي نرغب فيها الانتظار قليلًا قبل عرض زر "إبدأ".
</p>

<p>
	أضف الشيفرة التالية اﻵن لتحديث النتيجة:
</p>

<pre class="ipsCode">func update_score(score):
    $ScoreLabel.text = str(score)
</pre>

<p>
	صل اﻹشارة <code>()timeout</code> العائدة للمؤقت <code>MessageTimer</code> واﻹشارة <code>()pressed</code> العائدة للزر <code>StartButton</code> ثم عدل الشيفرة لتصبح كالتالي:
</p>

<pre class="ipsCode">func _on_start_button_pressed():
    $StartButton.hide()
    start_game.emit()

func _on_message_timer_timeout():
    $Message.hide()
</pre>

<h2 id="hudmain">
	ربط المشهد HUD بالمشهد الرئيسي Main
</h2>

<p>
	بعد أن انتهينا من إنشاء المشهد <code>HUD</code> سنعود إلى المشهد الرئيسي <code>Main</code>. انشئ نسخة من المشهد <code>HUD</code>ضمن المشهد الرئيسي كما نسخنا مشهد اللاعب سابقًا. ويجب أن تبدو شجرة المشاهد كالتالي حتى يكون كل شيء في مكانه الصحيح:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148034" href="https://academy.hsoub.com/uploads/monthly_2024_04/04_comlpete_main_scene.png.4aa5ad876d982ea8a61c07ecbe71fb13.png" rel=""><img alt="04 comlpete main scene" class="ipsImage ipsImage_thumbnailed" data-fileid="148034" data-unique="1vj817001" src="https://academy.hsoub.com/uploads/monthly_2024_04/04_comlpete_main_scene.png.4aa5ad876d982ea8a61c07ecbe71fb13.png"> </a>
</p>

<p>
	علينا اﻵن وصل وظائف المشهد <code>HUD</code> إلى السكربت الرئيسي، ويتطلب ذلك بعد اﻹضافات إلى المشهد الرئيسي. صل اﻹشارة <code>start_game</code> للمشهد <code>HUD</code> إلى الدالة <code>()new_game</code> في المشهد الرئيسي بالنقر على نسخة <code>HUD</code> في المشهد الرئيسي ثم الانتقال إلى "عقدة" في الشريط الجانبي واختيار اﻹشارة <code>start_game</code> ثم النقر عليها نقرًا مزدوجًا لتظهر نافذة "قم بوصل اﻹشارة إلى الدالة" ثم النقر على زر "Pick" في أسفلها واختيار الدالة <code>()new_game</code>. تأكد من وجود اﻷيقونة الخضراء إلى جوار <code>()func new_game</code> في السكربت الرئيسي، ولا تنس إزالة الاستدعاء <code>()new_game</code> من الدالة <code>()ready_</code> ﻷننا لا نريد أن تبدأ اللعبة تلقائيًا.
</p>

<p>
	عدّل الشيفرة الموجودة ضمن الدالة <code>()new_game</code> لتعرض الرسالة "استعد!":
</p>

<pre class="ipsCode">$HUD.update_score(score)
$HUD.show_message("Get Ready")
</pre>

<p>
	كما عليك استدعاء دالة <code>HUD</code> الموافقة للدالة <code>()game_over</code> في السكربت الرئيسي:
</p>

<pre class="ipsCode">$HUD.show_game_over()
</pre>

<p>
	أضف أخيرًا الشيفرة التالية إلى الدالة <code>()on_score_timer_timeout_</code> كي يبقى عداد النتيجة متزامنًا مع التغيرات:
</p>

<pre class="ipsCode">$HUD.update_score(score)
</pre>

<p>
	أصبحت اﻵن جاهزًا للعب! انقر على زر تشغيل المشهد، وإذا طُلب منك اختيار المشهد اﻷساسي اختر <code>main.tscn</code>.
</p>

<h2 id="-2">
	إزالة الزواحف القديمة
</h2>

<p>
	عندما تنتهي اللعبة وتحاول اللعب مجددًا ستبقى الزواحف من اللعبة القديمة موجودة على الشاشة ومن اﻷفضل أن تختفي جميعها قبل البدء بلعبة جديدة. إذًا لابد من طريقة ﻹخبار الزواحف بتدمير نفسها، وذلك باستخدام الميزة "المجموعات group".
</p>

<p>
	اختر المشهد ثم اختر العقدة الرئيسية وانقر على نافذة "عقدة" إلى جوار الفاحص وهو نفس المكان الذي تجد فيه اﻹشارات. انقر على العنوان "مجموعات" ثم اكتب اسمًا للمجموعة الجديدة وليكن "mobs" ثم انقر "أضف" وستظهر المجموعة الجديدة تحت الصندوق النصي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148035" href="https://academy.hsoub.com/uploads/monthly_2024_04/05_mobs_group.png.88540f2021cdbfde4249cbe2f314aeff.png" rel=""><img alt="05 mobs group" class="ipsImage ipsImage_thumbnailed" data-fileid="148035" data-unique="au2horfo1" src="https://academy.hsoub.com/uploads/monthly_2024_04/05_mobs_group.png.88540f2021cdbfde4249cbe2f314aeff.png"> </a>
</p>

<p>
	أضف السطر التالي إلى الدالة <code>()new_game</code> في السكربت الرئيسي:
</p>

<pre class="ipsCode">get_tree().call_group("mobs", "queue_free")
</pre>

<p>
	تستدعي الدالة <code>()call_group</code> تابعًا محددًا (المعامل الثاني لها) باسمه وتطبقه على كل عناصر المجموعة المختارة (المعامل الأول)، وفي حالتنا يحذف كل زاحف نفسه.
</p>

<h2 id="-3">
	وضع اللمسات اﻷخيرة على اللعبة
</h2>

<p>
	اكتملت اللعبة حاليًا من ناحية الوظيفة، وما سنفعله تاليًا هو بعض اﻹضافات لتحسين المظهر العام لها.
</p>

<h3 id="-4">
	الخلفية
</h3>

<p>
	قد يجد البعض أن الخلفية الرمادية غير جذابة لذا دعونا نغير اللون. ومن الطرق المتبعة نجد العقدة <code>ColorRect</code> التي يجب وضعها تحت العقدة <code>Main</code> مباشرة كي تُرسم خلف جميع العقد. ولهذا العقدة خاصية واحدة هي <code>Color</code>. اختر اللون الذي تريده ثم انقر على Layout&gt;Anchor Preset واختر "على كامل المستطيل"، كما يمكنك تنفيذ العملية من خلال شريط اﻷدوات أعلى نافذة العرض.
</p>

<p>
	بإمكانك أيضًا استخدام صورة في الخلفية إن أردت لكنك ستحتاج إلى عقدة من نوع <code>TextureRect</code>.
</p>

<h3 id="-5">
	إضافة تأثيرات صوتية للعبة
</h3>

<p>
	مقاطع الصوت والموسيقى من أكثر العوامل التي تزيد من جاذبية  <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">تصميم الألعاب الإلكترونية</a>، لهذا وضعنا في المجلد "art" الخاص بلعبتنا ملفين صوتيين الأول هو "House In a Forest Loop.ogg" لموسيقى الخلفية واﻵخر "gameover.wav" لخسارة اللاعب. وعلينا اﻵن إضافة عقدتين من النوع <code>AudioStreamPlayer</code> كأبناء للعقدة <code>Main</code> وتسميتهما باسم <code>Music</code> و <code>DeathSound</code>. انقر بعد ذلك على الخاصية <code>Stream</code> لكل منهما ثم "تحميل" واختر المقطع الصوتي الموافق.
</p>

<p>
	تُدرج المقاطع الصوتية تلقائيًا وتكون الخاصية <code>Loop</code> غير مفعلة لها بصورة افتراضية. فإن أردت أن تشغل الموسيقى دون توقف، فانقر على السهم المجاور لاسم الملف الصوتي في الخاصية <code>stream</code> ثم اختر "اجعله فريدًا" وانقر بعدها على المربع الذي يضم اسم العقدة الصوتية أعلى حاوية الفاحص واختر "stream" ثم فعّل قيمة الخاصية <code>Loop</code>.
</p>

<p>
	ولتشغيل الموسيقى أضف التابع <code>()Music.play$</code> إلى الدالة <code>()new_game</code> والتابع <code>()Music.stop$</code> إلى الدالة <code>()game_over</code> ثم أضف أخيرًا التابع <code>()DeathSound.play$</code> إلى الدالة <code>()game_over</code>.
</p>

<h3 id="-6">
	اختصارات لوحة المفاتيح
</h3>

<p>
	طالما أن التحكم باللعبة سيكون عن طريق لوحة المفاتيح، فمن الملائم جدًا أن نبدأ اللعبة بالضغط على أحد مفاتيحها. يمكن إنجاز اﻷمر بالاستفادة من الخاصية "Shortcut" للزر <code>Button</code>. لهذا سننشئ إجراء دخل يربط مفتاحًا بالزر "Start".
</p>

<p>
	انقر على مشروع&gt;إعدادات الشروع ثم انقر على النافذة الفرعية "خريطة اﻹدخال" في النافذة التي تظهر. انشئ بعد ذلك وبنفس الطريقة التي أنشأت بها سابقًا إجراءات الحركة اﻷربعة إجراءًا جديدًا باسم <code>start_game</code> واربطه بالمفتاح Enter.
</p>

<p>
	وإن أردت أيضًا ربط أزرار أي أداة تحكم أخرى باﻹجراءات السابقة، تأكد من توصيل هذه اﻷداة ثم انقر اﻷيقونة "+" الموجودة إلى يمين كل إجراء ثم اضغط زر اﻷداة الذي تريد ربطه بهذا اﻹجراء.
</p>

<p>
	عد إلى الواجه <code>HUD</code> وانقر على الزر <code>StartButton</code> ثم ابحث عن الخاصية "Shortcut" ضمن "الفاحص" ثم انشئ اختصارًا جديدًا بالنقر على مربع النص المجاور واختيار "جديدة Shortcut" ثم النقر على الاختصار الجديد وفتح "Events" وإضافة حدث جديد بالنقر على "Array[InputEvent]".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148039" href="https://academy.hsoub.com/uploads/monthly_2024_04/06_Add_shortcut_element.png.24b8e8d01324bfbfc26dc54ab72e34cf.png" rel=""><img alt="06 add shortcut element" class="ipsImage ipsImage_thumbnailed" data-fileid="148039" data-unique="ctr23czu6" src="https://academy.hsoub.com/uploads/monthly_2024_04/06_Add_shortcut_element.png.24b8e8d01324bfbfc26dc54ab72e34cf.png"> </a>
</p>

<p>
	أنشئ حدث جديدة <code>InputEventAction</code> باسم <code>start_game</code>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148037" href="https://academy.hsoub.com/uploads/monthly_2024_04/07_input_event_action.png.cd0613933031decb6f80bca9d2710359.png" rel=""><img alt="07 input event action" class="ipsImage ipsImage_thumbnailed" data-fileid="148037" data-unique="a1dxrpmax" style="width: 215px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/07_input_event_action.png.cd0613933031decb6f80bca9d2710359.png"> </a>
</p>

<p>
	وهكذا عندما يظهر زر "ابدأ" يمكن النقر عليه أو الضغط على المفتاح "Enter" لتبدأ اللعب!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="148038" href="https://academy.hsoub.com/uploads/monthly_2024_04/08_dodge_preview.gif.f178e0a62651ef667e1120593cfe8dcd.gif" rel=""><img alt="08 dodge preview" class="ipsImage ipsImage_thumbnailed" data-fileid="148038" data-unique="1fj234f1h" src="https://academy.hsoub.com/uploads/monthly_2024_04/08_dodge_preview.gif.f178e0a62651ef667e1120593cfe8dcd.gif"> </a>
</p>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	لقد انتهيت من تصميم أولى ألعابك ثنائية البعد وقد تعلمت إنشاء الشخصيات التي تتحكم بها والزواحف التي تتكاثر لتملأ الشاشة واستطعت حساب النتيجة وأنجزت طريقة لتبدأ اللعبة وتنهيها وتستخدم واجهة لها وأضفت مقاطع صوتية. تهانينا!
</p>

<p>
	لا زال هناك الكثير لتتعلمه بالطبع لتكون <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور ألعاب إلكترونية</a> محترف، لكن خذ الآن قسطًا من الراحة واستمتع بإنجازك!
</p>

<p>
	ترجمة -وبتصرف- للمقالين: <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/06.heads_up_display.html" rel="external nofollow">Heads_up display</a><span style="display: none;">           </span> و <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/07.finishing-up.html" rel="external nofollow">Finishing up</a> من توثيق جودو الرسمي.<span style="display: none;"> </span>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%84%D8%AB-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B4%D9%87%D8%AF-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A-%D9%81%D9%8A-%D8%A7%D9%84%D9%84%D8%B9%D8%A8%D8%A9-r2291/" rel=""> إنشاء المشهد الرئيسي للعبة ثنائية الأبعاد في محرك الألعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">تعرف على أشهر لغات برمجة الألعاب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%86%D8%A7%D8%AC%D8%AD-r2284/" rel="">كيف تصبح مبرمج ألعاب فيديو ناجح</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D9%86%D8%A7%D8%A1-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7-%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%B4%D8%A7%D8%B4%D8%A7%D8%AA-%D8%A7%D9%84%D9%84%D9%85%D8%B3-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%91%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-r2255/" rel="">دليلك الشامل إلى بناء كاميرا خاصة بشاشات اللمس في محرّك اﻷلعاب جودو</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2295</guid><pubDate>Mon, 08 Apr 2024 15:00:00 +0000</pubDate></item><item><title>&#x623;&#x644;&#x639;&#x627;&#x628; &#x627;&#x644;&#x641;&#x64A;&#x62F;&#x64A;&#x648;: &#x62A;&#x637;&#x648;&#x631;&#x647;&#x627; &#x648;&#x623;&#x647;&#x645;&#x64A;&#x62A;&#x647;&#x627; &#x648;&#x62E;&#x637;&#x648;&#x627;&#x62A; &#x628;&#x631;&#x645;&#x62C;&#x62A;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/game-development/%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%AA%D8%B7%D9%88%D8%B1%D9%87%D8%A7-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%88%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%AA%D9%87%D8%A7-r2290/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/-.png.f611af4b0c709d5258ec6c785991123b.png" /></p>
<p>
	من منا لا يحب ألعاب الفيديو التي غزت العالم، فقد أصبحت ألعاب الفيديو جزءًا لا يتجزأ من أساليب الترفيه في حياتنا اليومية، مثل لعبة سوبر ماريو أو فيفا أو GTA، فإذا كنت من محبي الألعاب الإلكترونية، وتود معرفة المزيد عنها، وتتساءل كيف تطورت ألعاب الفيديو، وما هي أنواعها، وتفكر كيف يمكنك برمجة لعبة فيديو خاصة بك، وهل ستحتاج لتعلم الكثير من التقنيات وبرمجة الألعاب؟ فأدعوك لقراءة هذا المقال الذي يجيبك على كل تساؤلاتك هذه.
</p>

<h2 id="">
	ما هي ألعاب الفيديو
</h2>

<p>
	ألعاب الفيديو هي ألعاب إلكترونية يمكن اللعب بها على شاشةٍ ما، سواء كانت هذه الشاشة هي شاشة حاسوب، أو جوال، أو تلفاز موصول بوحدات خاصة لتشغيل الألعاب video game console، مثل بلايستيشن أو Xbox أو Wii، كما توجد أنواع من ألعاب الفيديو تسمى ألعاب الأوركيد تعمل على أجهزة مستقلة بذاتها وتوجد في الأماكن العامة ومراكز التسوق.
</p>

<h2 id="-1">
	تاريخ تطور ألعاب الفيديو
</h2>

<p>
	لقد ارتبط تطور ألعاب الفيديو بتطور الحواسيب وانتشارها، وكانت الألعاب الإلكترونية في البداية ألعابًا بسيطة، إذ تُعد لعبة Tennis for Two التي برمجها المطور الأمريكي ويليام هيجنبوثام في عام 1958، أول لعبة فيديو طورت لأغراض التسلية، حيث كانت اللعبة تتألف من شاشة تقفز عليها نقطة خضراء مضيئة، ويمكن لشخصين اللعب بهذه النقطة التي تقفز من جانب لآخر كما توضح الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="147917" href="https://academy.hsoub.com/uploads/monthly_2024_04/Tennis_For_Two.jpg.4d573aa721b6f8eb855c51d316a4af17.jpg" rel=""><img alt="tennis for two" class="ipsImage ipsImage_thumbnailed" data-fileid="147917" data-ratio="88.80" data-unique="40qva8ont" style="width: 400px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_04/Tennis_For_Two.thumb.jpg.7db602be8aa930a13b935397e801468b.jpg"> </a>
</p>

<p style="text-align: center;">
	<a href="https://en.wikipedia.org/wiki/Tennis_for_Two" rel="external nofollow">مصدر الصورة</a>
</p>

<p>
	كما يوضح <a href="https://youtu.be/6PG2mdU_i8k?si=LjoV62lrJz5JhcB-" rel="external nofollow">هذا الفيديو </a>طريقة اللعب بها ويبين كانت الآلعاب الإلكترونية الأولى بدائية وبسيطة، ولكنها كانت نقطة الانطلاق لعالم <a href="https://academy.hsoub.com/programming/game-development/" rel="">صناعة الألعاب</a> المتطورة التي نستمتع بها اليوم، ولم تكن هذه الألعاب الأولية مشهورة، لأن تواجد أجهزة الحواسيب كان مقتصرًا بشكل أساسي على الجامعات الكبيرة والمراكز البحثية.
</p>

<p>
	وقد بدأ تحقق الانتشار الواسع لألعاب الفيديو في السبعينيات، عندما بدأت الشركات في تثبيت ألعاب الفيديو في المراكز التجارية والأماكن العامة، ففي عام 1972 قامت شركة أتاري بإصدار بونج Pong والتي اعتبرت أول لعبة فيديو ناجحة تجاريًا على مستوى العالم وهي لعبة أروكيد ثنائية الأبعاد تحاكي كرة الطاولة يمكن لعبها من قبل لاعبين اثنين إذ يتحكم كل لاعب في مضرب يمكنه التحرك عموديًا لضرب الكرةذهابًا وإيابًا، ويحصل اللاعب على نقطة عندما يفشل خصمه في صد الكرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="147916" href="https://academy.hsoub.com/uploads/monthly_2024_04/bong-game.jpg.ac324b61ab18eacba3ca880d07140230.jpg" rel=""><img alt="bong game" class="ipsImage ipsImage_thumbnailed" data-fileid="147916" data-unique="u3bpclj91" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/bong-game.thumb.jpg.475ffd2b5f2915333a78a6496f7157e9.jpg"> </a>
</p>

<p style="text-align: center;">
	<a href="https://en.wikipedia.org/wiki/File:Atari_Pong_arcade_game_front.jpg" rel="external nofollow">مصدر الصورة</a>
</p>

<p>
	وبعدها زاد انتشار ألعاب الفيديو في ثمانينيات القرن الماضي مع تطور الحواسيب وصغر حجمها وزيادة كفاءتها وأدائها، مما مَكّن مبرمجي الألعاب من تصميم رسومات ألعاب احترافية وتحقيق تجربة لعب أكثر ابتكارًا، حيث حصلت الألعاب على شخصياتها الخاصة وقصص أكثر تعقيدًا، فمعظم ألعاب الفيديو الكلاسيكية التي نعرفها اليوم مثل لعبة باك مان ولعبة سوبر ماريو نشأت في هذا الوقت.
</p>

<p>
	وفي فترة التسعينيات ومطلع الألفية الثالثة انتقلت ألعاب الفيديو لمرحلة أكثر احترافيةً، وظهرت الألعاب ذات الرسومات ثلاثية الأبعاد، التي يستطيع فيها اللاعبون التحرك في ثلاث اتجاهات بدلاً من اتجاهين فقط، وأصبحت عوالم ألعاب الفيديو أكثر واقعيةً، وتنافست الشركات المصنعة للأجهزة والألعاب على السوق، فقدمت سوني عام 1994 جهاز البلايستيشن الذي مثل قفزة كبيرة تقنيًا ورسوميًا مقارنةً بالأجهزة الموجودة حينها، كما ظهرت أفكار ألعاب أكثر ابتكارًا من استوديوهات الألعاب، وظهرت <a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">أنواع ألعاب جديدة</a> مثل ألعاب إطلاق النار من منظور الشخص الأول.
</p>

<p>
	كما ساهم ظهور الإنترنت في تحويل ألعاب الفيديو تدريجيًا إلى اللعب عبر الإنترنت بدل لعبها على الأجهزة المحلية، وأصبحت ألعاب مثل وورلد أوف ووركرافت World of Warcraft في عام 2004 تُلعب بشكل رئيسي عبر الإنترنت، كما ساعد ظهور تقنيات <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r2239/" rel="">الذكاء الاصطناعي AI</a> في جعل الألعاب أكثر ديناميكيةً وواقعيةً، فالخصوم لم يعودوا يتصرفون بنفس الطريقة في كل الحالات، بل يتفاعلون بشكل مستقل مع أحداث اللعبة، كما ظهرت ألعاب العالم المفتوح، حيث يمكن للاعبين استكشاف عوالم خيالية بمفردهم وتحديد سياق اللعب بحرية، أو يمكنهم إنشاء العالم الافتراضي بأنفسهم، كما في مفهوم <a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">ألعاب صندوق الرمل Sandbox</a>.
</p>

<p>
	وهكذا جاء هذا العقد بعدد لا يحصى من الألعاب التي نالت شهرة واسعة وأكثر مبيعًا، من أهمها:
</p>

<ul>
	<li>
		The Sims (2000)‎: لعبة محاكاة واقع افتراضي، وفد حققت نجاحًا هائلاً بفضل الحرية الكبيرة في اللعب والقدرة على بناء وتخصيص المنازل والتفاعل مع العالم الافتراضي.
	</li>
	<li>
		Grand Theft Auto San Andreas (2004)‎: لعبة أكشن وعالم مفتوح، تتميز بوجود العديد من أساليب ‎‎اللعب.
	</li>
	<li>
		Super Mario Galaxy (2007)‎: لعبة ماريو ثلاثية الأبعاد، والتي تميزت بتصميم عالم احترافي والمستويات الإبداعية وحصدت الكثير من الإعجابات بفضل أسلوب لعبها المبتكر.
	</li>
	<li>
		Minecraft oder (2010)‎: لعبة ماينكرافت هي لعبة عالم مفتوح تتيح لك بناء عوالم خاصة بك، وقد نالت شهرةً عالميةً واسعة بفضل إمكانيات البناء اللامحدودة والإبداع الذي يتيحه اللعب بها.
	</li>
</ul>

<h2 id="-2">
	أهمية ألعاب الفيديو
</h2>

<p>
	أصبحت ألعاب الفيديو اليوم صناعة تدرّ الكثير من الأرباح على صانعيها، إذ يقضي الكثير من الناس معظم الوقت وهم يلعبون على الشاشات ومن كل الفئات العمرية، لاسيما ألعاب الهواتف الجوالة ويقضون الكثير من فترات الانتظار في مواقف الحافلات أو خلال السفر أو قبل النوم في اللعب بها، وهناك ألعاب على الحاسوب أو وحدات تشغيل الألعاب تجعل اللاعب يدمنها ولا يتخلى عن اللعب بها مرات ومرات، كما انتشرت اليوم ظاهرة تصوير اللاعبين لأنفسهم أثناء اللعب والتعليق على أحداث اللعبة أو تقديم نصائح حول طريقة اللعب لنشر هذه المقاطع على يوتيوب والكسب من مشاهدتها,
</p>

<p>
	وهذه الشعبية الكبيرة أدت لزيادة شهرة الألعاب ورواجها الكبير لزيادة وجعلت من صناعة ألعاب الفيديو صناعة رائجة تدرّ الكثير من الأرباح على الشركات المطورة، فقد تم بيع ملايين النسخ من بعض الألعاب الإلكترونية، وتجاوزت أرباح صناعة الألعاب الإلكترونية المليارات، كما أن أرباح صناعة الألعاب الإلكترونية تفوق اليوم أرباح صناعات أخرى مثل صناعة الأفلام والسينما، وهناك العديد من استوديوهات الألعاب المستقلة التي تطور مختلف أنواع الفيديو لجميع أنواع الأنظمة كالحواسيب والجوالات والأجهزة المحمولة.
</p>

<p>
	ومن أنجح سلاسل الألعاب الإلكترونية التي حققت نجاحًا واسعًا في عالم ألعاب الفيديو نذكر لعبة سوبر ماريو ولعبة بوكيمون ولعبة فيفا ولعبة Grand Theft Auto أو GTA ولعبة The Sims.
</p>

<h2 id="-3">
	كيف تصبح مطور ألعاب فيديو؟
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147918" href="https://academy.hsoub.com/uploads/monthly_2024_04/-.png.8e9764618285eb994f1d2ef3834df39b.png" rel=""><img alt="ألعاب-الفيديو.png" class="ipsImage ipsImage_thumbnailed" data-fileid="147918" data-ratio="62.60" data-unique="pcjwv47gp" style="width: 500px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_04/-.thumb.png.62003dc4cd7ad0196bb2808602ccdbb4.png"></a>
</p>

<p>
	لا بد أن برمجة لعبة فيديو تعتمد على نوع اللعبة التي ترغب في برمجتها، فبرمجة لعبة فيديو ثنائية الأبعاد تختلف عن برمجة لعبة ثلاثية الأبعاد، كما أن برمجة لعبة جوال بسيطة أسهل من برمجة لعبة حاسوبية أو لعبة لمنصة تشغيل ألعاب مثل بلاي ستيشن PlayStation أو Xbox أو لعبة تحاكي الواقع الافتراضي وتتضمن الكثير من المراحل والخطوات والعديد من اللاعبين. فهناك ألعاب بسيطة يمكن برمحتها من قبل شخص واحد وخلال مدة قصيرة وهنالك ألعاب يعمل عليها فريق متكامل يضم مئات الأشخاص ويكلف تطويرها آلاف الدولارات، لكننا سنشرح هنا خطوات عامة يمكنك اتباعها لتصبح مطور ألعاب فيديو بسيطة وبخطوات سهلة:
</p>

<ol>
	<li>
		تحديد الهدف من لعبة الفيديو والمنصة التي ستوجه لها اللعبة وطريقة التفاعل معها، هل هو من خلال إدخالات لوحة المفاتيح والفأرة أو من خلال وحدة التحكم، وغيرها من التفاصيل الأخرى.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">تصميم لعبة الفيديو</a> وتحديد كل ما يتعلق بها من تفاصيل، وما هي شخصيات اللعبة وكيف ستتحرك الشخصية وما ردة فعلها عندما تصدم بجدار أو تسقط في بركة ما مثلًا، وما هي قوانين اللعب وشروط الفوز، وغيرها من القوانين والحركات.
	</li>
	<li>
		رسم وتصميم شخصيات اللعبة الإلكترونية اللازمة على الشاشة، وتحديد تأثيرات الصوت التي ستصدر في كل مرحلة من الحركة أو التفاعل.
	</li>
	<li>
		برمجة لعبة الفيديو، فبعد أن تكون قد حددت جميع التفاصيل اللازمة لبرمجة لعبة الفيديو الخاصة بك ستكون الآن مرحلة برمجة اللعبة قد حانت، وتشبه برمجة اللعبة تطوير البرمجيات التقليدية، حيث يتوجب عليك في البداية إنشاء نموذج أولي للعبة واختبارها، وهنا يمكنك الاستعانة بالكثير من التقنيات مثل لغات برمجة الألعاب <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">ومحركات الألعاب</a> التي تسرع عملية التطوير.
	</li>
	<li>
		اختبار لعبة الفيديو، فبعد برمجة اللعبة عليك التحقق من عدم وجود مشكلات أو أخطاء في برمجتها وأن اللعبة تعمل كما هو متوقع، ويمكن مشاركتها مع الأصدقاء لتجربتها واختبار أي مشكلات فيها.
	</li>
</ol>

<p>
	ونذكر من جديد أن تطوير لعبة فيديو احترافية سيحتاج لفريق عمل مكون من عدة أشخاص من مختلف التخصصات، مثل مصممي الألعاب الذين يصممون عالم اللعبة وقصتها، والكتّاب أو رواة القصص الذين يكتبون قصة اللعبة، وموسيقيون يسجلون التأثيرات الصوتية المستخدمة، وأخيرًا مطورو الألعاب يكتبون الكود البرمجي الذي يحوّل اللعبة من فكرة لواقع فعلي. وتستغرق عملية صناعة لعبة فيديو احترافية بدءًا من التخطيط وحتى مرحلة ما بعد الإنتاج حوالي ثلاث إلى خمس سنوات في المتوسط بالنسبة لألعاب وحدات التحكم وأجهزة الحاسوب بينما يمكن تطوير لعبة جوال بسيطة بوقت أقل بكثير وهذا لا يمنع من فرصة نجاحها وانتشارها فهناك الكثير من <a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%81%D9%83%D8%A7%D8%B1-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88/" rel="">أفكار الألعاب</a> التي حققت شهرة واسعة حتى اليوم رغم بساطتها مثل لعبة لعبة كاندي كراش Candy Crash ولعبة باك مان  Pac-Man.
</p>

<p>
	هل تطمح لتصبح مطور ألعاب فيديو محترف وتحويل شغفك إلى مهارة عملية. ستساعدك <a href="https://academy.hsoub.com/learn/game-development/" rel="">دورة تطوير الألعاب</a> من أكاديمية حسوب على تحقيق هذا الهدف، حيث ستتعلم كيف تبني ألعابك الخاصة من الصفر حيث ستتقن مفاهيم البرمجة وتطوير شخصيات ألعاب تتفاعل مع بعضها بذكاء وإبداع.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير الألعاب
		</p>

		<p class="banner-subtitle">
			ابدأ رحلة صناعة الألعاب ثنائية وثلاثية الأبعاد وابتكر ألعاب ممتعة تفاعلية ومليئة بالتحديات.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/game-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/game-development/" rel=""><img alt="دورة تطوير الألعاب" src="https://academy.hsoub.com/learn/assets/images/courses/game-development.png"></a>
	</div>
</div>

<h2 id="-4">
	مستقبل ألعاب الفيديو
</h2>

<p>
	تطورت ألعاب الفيديو من مجرد نقاط بسيطة تتحرك على الشاشة إلى ألعاب برسومات عالية الدقة ومناظر ثلاثية الأبعاد رائعة وواقعية، ثم أصبح اللاعبون بفضل الواقع الافتراضي جزءًا من أحداث اللعبة وشخصياتها، ويتوقع أن يشهد مستقبل ألعاب الفيديو مزيدًا من التطور، ويستخدم فيه الذكاء الاصطناعي والواقع المعزز بصورة أكبر، وتتحسن دقة الرسومات وتستخدم وحدات تشغيل ألعاب أكثر تقدمًا، وأن تشكل الوحدات الأصغر حجمًا والأكثر تطورًا مستقبل صناعة الألعاب.
</p>

<p>
	كما سيشهد مستقبل ألعاب الفيديو برمجة مزيد من ألعاب الواقع المعزز AR التي تجمع بين العالم الواقعي والعناصر الرقمية المتفاعلة، مثل لعبة بوكيمون جو Pokémon Go التي تمكن اللاعبين من رؤية شخصيات اللعبة التي تنشئ بيئة لعب افتراضية كاملة، وتحتاج لارتداء نظارات VR أو أجهزة مشابهة للتفاعل مع بيئة اللعب باستخدام وحدات تحكم أو حركات الجسم مثل لعبة Beat Saber التي يقوم فيها اللاعبون بتحريك أضواء الليزر بواسطة مضارب ضوء لقطع الكتل المتحركة لتوليد تجربة لعب مثيرة، وكلا النوعين يقدمان تجارب متفردة ومثيرة، ويستخدمان تقنيات فريدة لإيصال اللاعبين إلى عوالم مختلفة وتفاعلية ويتوقع أن تلقى صناعة الألعاب المزيد من التقدم والرواج والازدهار في السنوات المقبلة ويزداد الطلب على مطوري الألعاب بشكل أكبر.
</p>

<h2 id="-5">
	الخلاصة
</h2>

<p>
	تحدثنا في مقال اليوم موجزًا عن عالم ألعاب الفيديو، الذي أصبح جزءًا لا يتجزأ من حياتنا اليومية، من خلال استعراض تاريخها وتطورها، وصولاً إلى نظرة مستقبلية عن ألعاب الفيديو، والتي لم تعد مجرد وسيلة للترفيه والتسلية، بل أصبحت صناعة ضخمة تجذب ملايين اللاعبين وتحقق أرباحًا خيالية، وختمنا المقال بأهم الخطوات التي تساعدك كي تصبح مطور ألعاب فيديو محترف.
</p>

<h2 id="-10">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%86%D8%A7%D8%AC%D8%AD-r2284/" rel="">كيف تصبح مبرمج ألعاب فيديو ناجح</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">تعرف على أهمية صناعة الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%86%D8%A8%D8%B0%D8%A9-%D8%B9%D9%86-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%88%D9%85%D8%AD%D8%B1%D9%83-unity3d-r126/" rel="">نبذة عن صناعة الألعاب ومحرك Unity3D</a><span style="display: none;"> </span>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8%D8%9F-r2068/" rel="">ما هي برمجة الألعاب؟</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2290</guid><pubDate>Thu, 04 Apr 2024 12:09:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x627;&#x644;&#x645;&#x634;&#x647;&#x62F; &#x627;&#x644;&#x631;&#x626;&#x64A;&#x633;&#x64A; &#x644;&#x644;&#x639;&#x628;&#x629; &#x62B;&#x646;&#x627;&#x626;&#x64A;&#x629; &#x627;&#x644;&#x623;&#x628;&#x639;&#x627;&#x62F; &#x641;&#x64A; &#x645;&#x62D;&#x631;&#x643; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x62C;&#x648;&#x62F;&#x648; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B4%D9%87%D8%AF-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A-%D9%84%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2291/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/1139860275_.png.521506d8445f36e74b28e3d3d5774e32.png" /></p>
<p>
	بدأنا في <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-r2280/" rel="">مقال سابق</a> بإنشاء لعبة إلكترونية باستخدام محرك الألعاب جودو، وحان الوقت اﻵن لضم كل شيء معًا وإنشاء مشهد كامل للعبتنا، لهذا سنبدأ في مقال اليوم باستكمال العمل على اللعبة وإنشاء مشهدها الأساسي وإعداده بالطريقة المناسبة.
</p>

<h2>
	إنشاء عقدة المشهد الرئيسي للعبة
</h2>

<p>
	لإنشاء مشهد جديد في محرك ألعاب جودو علينا إنشاء عقدة اسمها <code>Main</code> من النوع <code>Node</code> ولا حاجة أن تكون من النوع <code>Node2D</code> لأنها مجرد حاوية لمنطق اللعبة ولن تحتاج فعلًا إلى وظائف هذا النوع من العقد.
</p>

<p>
	انقر على زر إنشاء نسخة (أيقونة السلسلة في نافذة المشهد) ثم اختر المشهد "Player.tscn".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147927" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_create_instance.png.48d04c712915cd132e7ccc3dc06f7bf6.png" rel=""><img alt="01 create instance" class="ipsImage ipsImage_thumbnailed" data-fileid="147927" data-unique="hl4tfh92s" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_create_instance.png.48d04c712915cd132e7ccc3dc06f7bf6.png"> </a>
</p>

<p>
	أضف بعد ذلك العقد التالية كأبناء للعقدة <code>Main</code> وفق اﻷسماء التالية:
</p>

<ul>
	<li>
		مؤقت <code>Timer</code> باسم <code>MobTimer</code> للتحكم بمعدل تكاثر الزواحف، واضبط الخاصية <code>Wait Time</code> له على <code>0.5</code>
	</li>
	<li>
		مؤقت <code>Timer</code> باسم <code>ScoreTimer</code> لزيادة النتيجة كل ثانية، واضبط الخاصية <code>Wait Time</code> له على <code>1</code>
	</li>
	<li>
		مؤقت <code>Timer</code> باسم <code>StartTimer</code> لإضافة تأخير بسيط قبل بدء اللعبة، واضبط الخاصية <code>Wait Time</code> له على <code>2</code>
	</li>
	<li>
		عقدة من النوع <code>Marker2D</code> اسمها <code>StartPosition</code> لتحديد موقع البداية بالنسبة للاعب
	</li>
</ul>

<p>
	إضافة إلى ذلك، اضبط الخاصية <code>One Shot</code> للمؤقت <code>StartTimer</code> على "فعّال On" و الخاصية <code>Position</code> للعقدة <code>StartPosition</code> على<br>
	القيمة التالية<code>(450,240)</code>.
</p>

<h2 id="-1">
	توليد شخصيات الأعداء
</h2>

<p>
	نستخدم المشهد الرئيسي <code>Main</code> في توليد شخصيات الأعداء ونريدهم أن يظهروا في أماكن عشوائية على حواف الشاشة، لهذا أضف عقدة من النوع <code>Path2D</code> باسم <code>MobPath</code> كابن للعقدة الرئيسية. سترى عدة أزرار إضافية في أعلى المحرر عند اختيار اﻷيقونة <code>Path2D</code>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147928" href="https://academy.hsoub.com/uploads/monthly_2024_04/02_path_buttons.png.e80043bca2379818cc0faa9d4494b686.png" rel=""><img alt="02 path buttons" class="ipsImage ipsImage_thumbnailed" data-fileid="147928" data-unique="t6su711zj" src="https://academy.hsoub.com/uploads/monthly_2024_04/02_path_buttons.png.e80043bca2379818cc0faa9d4494b686.png"> </a>
</p>

<p>
	اختر الزر الموجود في المنتصف "إضافة عقدة في مساحة خالية" ثم ارسم مسارًا بالنقر ضمن المحرر في النقاط التي يعرضها الشكل التالي. ولكي يكون تحديد النقاط دقيقًا فعّل الخيارين "استخدام المحاذاة للشبكة Use Grid Snap" و "استخدم المحاذاة الذكية Use Smart Snap"، وستجدهما إلى يمين أيقونة"القفل على شكل مغناطيس بجوار عدة نقاط وآخر بجوار شبكة كما توضح الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147929" href="https://academy.hsoub.com/uploads/monthly_2024_04/03_path_snaps.png.3e201703764ef8e3a31090685d235d5c.png" rel=""><img alt="03 path snaps" class="ipsImage ipsImage_thumbnailed" data-fileid="147929" data-unique="5stfh6922" src="https://academy.hsoub.com/uploads/monthly_2024_04/03_path_snaps.png.3e201703764ef8e3a31090685d235d5c.png"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: ارسم المنحني باتجاه عقارب الساعة وإلا ستتكاثر الزواحف إلى الخارج بدلًا من الداخل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="147932" href="https://academy.hsoub.com/uploads/monthly_2024_04/04_draw_path2d.gif.dc1ca5ee99fd0fc0a64c443c0209e1cb.gif" rel=""><img alt="04_draw_path2d.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="147932" data-ratio="155.20" data-unique="fjaw2pnox" style="width: 250px; height: auto;" width="406" src="https://academy.hsoub.com/uploads/monthly_2024_04/04_draw_path2d.thumb.gif.c085ec9507f15217d305f9c2d0912e0e.gif"></a>
</p>

<p>
	بعد تحديد أربع نقاط، انقر على أيقونة "إغلاق المنحني" وسيكتمل هذا المنحني. أضف بعد الانتهاء من رسم المنحني العقدة <code>PathFollow2D</code> كابن للعقدة <code>MobPath</code> وسمها <code>MobSpawnLocation</code>. ستدور هذه العقدة وتتبع المسار عندما تتحرك وبالتالي يمكن استخدامها لاختيار مواقع واتجاهات عشوائية على طول المسار.
</p>

<p>
	سيبدو المشهد الرئيسي اﻵن كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147930" href="https://academy.hsoub.com/uploads/monthly_2024_04/05_main_scene.png.e2b2f410dd24df2c715987e023cf96bf.png" rel=""><img alt="05 main scene" class="ipsImage ipsImage_thumbnailed" data-fileid="147930" data-unique="ffqlkntjn" src="https://academy.hsoub.com/uploads/monthly_2024_04/05_main_scene.png.e2b2f410dd24df2c715987e023cf96bf.png"> </a>
</p>

<h2 id="-2">
	السكربت الرئيسي
</h2>

<p>
	أضف نص برمجي إلى المشهد <code>Main</code> ثم أضف له العبارة <code>export var mob_scene: PackedScene@</code> التي تسمح لنا باختيار مشهد اﻷعداء الذي نريد صنع نسخة عنه:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2217_9" style=""><span class="pln">extends </span><span class="typ">Node</span><span class="pln">

</span><span class="lit">@export</span><span class="pln"> var mob_scene</span><span class="pun">:</span><span class="pln"> </span><span class="typ">PackedScene</span><span class="pln">
var score</span></pre>

<p>
	انقر على العقدة <code>Main</code> وستجد الخاصية <code>Mob Scene</code> ضمن الفاحص في لوحة "متغيرات السكربت"، وﻹسناد قيمة إلى هذه الخاصية يمكنك اتباع إحدى الطريقتين التاليتين:
</p>

<ul>
	<li>
		اسحب المشهد من حاوية نظام الملفات وأفلته ضمن الخاصية <code>Mob Scene</code>.
	</li>
	<li>
		انقر على زر السهم المجاور للخاصية <code>Mob Scene</code> وانقر "تحميل" ثم اختر <code>mob.tscn</code>.
	</li>
</ul>

<p>
	اختر نسخة العقدة <code>Player</code> الموجودة ضمن العقدة <code>Main</code> ثم انقر على حاوية "عقدة" إلى جوار "الفاحص" في الشريط الجانبي لترى قائمة تضم جميع اﻹشارات للعقدة <code>Player</code>. جد اﻹشارة <code>hit</code> وانقر عليها نقرة مزدوجة (أو انقر عليها بالزر الأيمن واختر "توصيل"). ستفتح هذه العملية نافذة جديدة نريد فيها إنشاء دالة جديدة ندعوها <code>game_over</code> تعالج ما نريد فعله عند انتهاء اللعبة.
</p>

<p>
	اكتب "game_over" في المربع النصي "الدالة المتلقية Receiver Method" أسفل النافذة ثم انقر زر "وصل Connect". وما سيحدث اﻵن أن اﻹشارة <code>hit</code> التي بثها اللاعب <code>Player</code> سيعالجها السكربت اﻷساسي "Main". أضف اﻵن الشيفرة التالية إلى الدالة الجديدة، وأضف أيضًَا الدالة <code>new_game</code> التي تحضّر كل شيء عند بداية اللعبة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2217_11" style=""><span class="pln">func game_over</span><span class="pun">():</span><span class="pln">
    $ScoreTimer</span><span class="pun">.</span><span class="pln">stop</span><span class="pun">()</span><span class="pln">
    $MobTimer</span><span class="pun">.</span><span class="pln">stop</span><span class="pun">()</span><span class="pln">

func new_game</span><span class="pun">():</span><span class="pln">
    score </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
    $Player</span><span class="pun">.</span><span class="pln">start</span><span class="pun">(</span><span class="pln">$StartPosition</span><span class="pun">.</span><span class="pln">position</span><span class="pun">)</span><span class="pln">
    $StartTimer</span><span class="pun">.</span><span class="pln">start</span><span class="pun">()</span></pre>

<p>
	صل اﻵن اﻹشارة <code>()timeout</code> العائدة إلى كل عقدة مؤقت (<code>StartTimer</code> و <code>ScoreTimer</code> و <code>MobTimer</code>) إلى السكربت الرئيسي. وسيشغل المؤقت <code>StartTimer</code> المؤقتين الآخرين ويزيد المؤقت <code>ScoreTimer</code> النتيجة بمقدار 1.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2217_13" style=""><span class="pln">func _on_score_timer_timeout</span><span class="pun">():</span><span class="pln">
    score </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">

func _on_start_timer_timeout</span><span class="pun">():</span><span class="pln">
    $MobTimer</span><span class="pun">.</span><span class="pln">start</span><span class="pun">()</span><span class="pln">
    $ScoreTimer</span><span class="pun">.</span><span class="pln">start</span><span class="pun">()</span></pre>

<p>
	سننشئ ضمن الدالة نسخة عن العدو (الزواحف)، لهذا، سنختار مكانًا عشوائيًا للبدء على المسار <code>Path2D</code> ونضبط حركة العدو. تدور العقدة تلقائيًا عندما تلحق بالمسار، لهذا سنستفيد منها في اختيار جهة حركة الزاحف وموقعه. وعندما تتكاثر الزواحف سنختار قيمة عشوائية لسرعة حركتها بين <code>150</code> و <code>250</code>. وانتبه إلى أن إضافة نسخة جديدة إلى المشهد تكون من خلال التعليمة <code>add_child</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9772_7" style=""><span class="pln">func _on_mob_timer_timeout</span><span class="pun">():</span><span class="pln">
    </span><span class="com"># mob scene أنشئ نسخة من مشهد الزاحف</span><span class="pln">
    var mob </span><span class="pun">=</span><span class="pln"> mob_scene</span><span class="pun">.</span><span class="pln">instantiate</span><span class="pun">()</span><span class="pln">

    </span><span class="com"># Path2D اختر مكانًا عشوائيًا على المسار.</span><span class="pln">
    var mob_spawn_location </span><span class="pun">=</span><span class="pln"> get_node</span><span class="pun">(</span><span class="str">"MobPath/MobSpawnLocation"</span><span class="pun">)</span><span class="pln">
    mob_spawn_location</span><span class="pun">.</span><span class="pln">progress_ratio </span><span class="pun">=</span><span class="pln"> randf</span><span class="pun">()</span><span class="pln">

    </span><span class="com"># اجعل اتجاه الزاحف عمودًا على اتجاه المسار</span><span class="pln">
    var direction </span><span class="pun">=</span><span class="pln"> mob_spawn_location</span><span class="pun">.</span><span class="pln">rotation </span><span class="pun">+</span><span class="pln"> PI </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
  
    </span><span class="com"># اختر موقعًا عشوائيًًًًًًًًًا للزاحف</span><span class="pln">
     mob</span><span class="pun">.</span><span class="pln">position </span><span class="pun">=</span><span class="pln"> mob_spawn_location</span><span class="pun">.</span><span class="pln">position

    </span><span class="com"># أضف بعض العشوائية إلى المسار</span><span class="pln">
    direction </span><span class="pun">+=</span><span class="pln"> randf_range</span><span class="pun">(-</span><span class="pln">PI </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> PI </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln">
    mob</span><span class="pun">.</span><span class="pln">rotation </span><span class="pun">=</span><span class="pln"> direction

    </span><span class="com"># اختر سرعة الزاحف</span><span class="pln">
    var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">(</span><span class="pln">randf_range</span><span class="pun">(</span><span class="lit">150.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">250.0</span><span class="pun">),</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">)</span><span class="pln">
    mob</span><span class="pun">.</span><span class="pln">linear_velocity </span><span class="pun">=</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">rotated</span><span class="pun">(</span><span class="pln">direction</span><span class="pun">)</span><span class="pln">

    </span><span class="com"># إجعل الزواحف تتكاثر بإضافتها إلى الشاشةالرئيسية</span><span class="pln">
    add_child</span><span class="pun">(</span><span class="pln">mob</span><span class="pun">)</span></pre>

<p>
	<strong>ملاحظة هامة</strong>:  قد تتساءل لماذا نستخدم العدد <code>PI</code> في الدوال التي تتعامل مع الزوايا؟ لأن جودو يستخدم الراديان لقياس الزوايا. تمثّل <code>PI</code> نصف دوره كما يمكن استعمال <code>TAU</code> التي تمثّل دورة كاملة. لكن إن كنت تفضّل العمل مع الدرجات ستحتاج إلى الدالتين <code>()rad_to_deg</code> و <code>()deg_to_rad</code> للتحويل بين الدرجات والراديان.
</p>

<h2 id="-3">
	اختبار المشهد
</h2>

<p>
	نختبر اﻵن إذا كانت كل شيء على ما يرام حتى اللحظة، لهذا استدعي الدالة <code>new_game</code> ضمن الدالة <code>()ready_</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2217_17" style=""><span class="pln">func _ready</span><span class="pun">():</span><span class="pln">
    new_game</span><span class="pun">()</span></pre>

<p>
	لنجعل أيضًا المشهد <code>Main</code> المشهد الرئيسي في اللعبة، وهو المشهد الذي يعمل تلقائيًا. انقر على زر التشغيل واختر <code>main.tscn</code> عندما يُطلب ذلك.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تلميح</strong>:
	</p>

	<p>
		إن كنت قد اخترت سابقًا مشهدًا آخر ليكون المشهد اﻷساسي يمكنك النقر على الملف <code>main.tscn</code> في نظام الملفات وتحديد "Set As Main Scene"
	</p>
</blockquote>

<p>
	من المفترض أن تكون قادرًا على تحريك اللاعب في جميع الاتجاهات وترى الزواحف تتحرك وتتكاثر، وسترى كيف يختفي اللاعب عندما يصطدم بالعدو.
</p>

<p>
	عندما تتأكد أن كل شيء يعمل جيدًا أزل الدالة <code>new_game</code> من الدالة <code>()ready_</code>.
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعلمنا في مقال اليوم كيف ننشئ المشهد الأساسي للعتبنا الإلكترونية وسنكتفي في هذا المقال بهذه المرحلة، ومع ذلك لا تزال اللعبة غير مكتملة وتنقصها بعض اللمسات النهائية وإنشاء واجهة مناسبة للعبة، لذا سنشرح خطوات تعزيز اللعبة بواجهة تتضمن تأثيرات صوتية واختصارات لوحة المفاتيح وغيرها من الخيارات وهذا ما سنراه في المقال التالي من هذه السلسلة.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/05.the_main_game_scene.html" rel="external nofollow">The main game scene</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D8%B4%D8%A7%D9%87%D8%AF-%D8%A7%D9%84%D9%84%D8%B9%D8%A8%D8%A9-%D9%88%D8%A8%D8%B1%D9%85%D8%AC%D8%AA%D9%87%D8%A7-r2281/" rel=""> إنشاء وبرمجة مشاهد لعبة ثنائية الألعاب في محرك جودو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sqlite-r2241/" rel="">إعداد محرك الألعاب جودو Godot للعمل مع قاعدة البيانات SQLite</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2291</guid><pubDate>Wed, 03 Apr 2024 15:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x635;&#x628;&#x62D; &#x645;&#x628;&#x631;&#x645;&#x62C; &#x623;&#x644;&#x639;&#x627;&#x628; &#x641;&#x64A;&#x62F;&#x64A;&#x648; &#x646;&#x627;&#x62C;&#x62D;</title><link>https://academy.hsoub.com/programming/game-development/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%A8%D8%AD-%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%86%D8%A7%D8%AC%D8%AD-r2284/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/---------.png.263edb78600cae8aa2b6a63ca685b44b.png" /></p>
<p>
	عالم تطوير الألعاب هو عالمٌ غنيّ بالإثارة والإبداع والتطور وأن تكون مبرمج ألعاب فيديو يعني أن تشارك في بناء عالمٍ يدخله ملايين الأشخاص يوميًا، حيث يوجد ملايين ال<span ipsnoautolink="true">لاعبين حول العالم المهتمين بمجال ألعاب الفيديو ومتابعة كل تطور حاصل فيه</span><span style="display: none;"> </span>، ما يعزّز فكرة العمل على بناء ألعاب جديدة تفوق توقعات اللاعبين وابتكار بيئات لعب استثنائية تنال استحسانهم وتحقيق مبيعات عالية.
</p>

<p>
	ولا عجب أن مجال تطوير الألعاب يعد واحدًا من أسرع <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">مجالات البرمجة</a> نموًا حول العالم، فسواء كان المجال الذي ترغب في العمل به هو التصميم الفني <a href="https://academy.hsoub.com/programming/game-development/%D8%B4%D8%AE%D8%B5%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%86%D8%A7%D8%AC%D8%AD%D8%A9-r2212/" rel="">لشخصيات الألعاب</a> وعوالمها، أو <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8%D8%9F-r2068/" rel="">برمجة الألعاب</a>، فإن هذه الصناعة تسمح لك بتطوير مهاراتك وتحقيق أحلامك المهنية، ومن الجدير بالذكر أنّ متوسط دخل الوظائف البرمجية المرتبطة بالألعاب الإلكترونية مرتفعٌ مقارنةً مع متوسط دخل باقي الوظائف لا سيما إذا تمكنك من الوصول لمرحلة احترافية في هذا التخصص.
</p>

<p>
	سنحدّثك في هذا المقال عن أبرز النقاط الأساسية حول مبرمج ألعاب الفيديو الناجح، وما هي مهامه، وكيف يختار مساره المهنيّ، ونجيبك عن العديد من التساؤلات الأخرى التي قد تخطر ببالك حول هذا التخصص المميز.
</p>

<h2 id="-1">
	ما هي مهام مبرمج الألعاب؟
</h2>

<p>
	يتطلّب تطوير الألعاب مزيجًا من المهارات الإبداعية والتحليلية، وبالتالي على مبرمج الألعاب الناجح أن يمتلك مهارات العمل وحده أو مع فريق وذلك اعتمادًا على <a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">نوع اللعبة</a> التي يعمل عليها وهل سيطورها بمفرده أو ضمن استوديو ألعاب مع فريق عمل متكامل، وأن يكون قادرًا على التفكير خارج الصندوق لابتكار أساليب جديدةٍ وجذابة للعب، وأن يكون منظّمًا بما يكفي لاتباع جدولٍ زمنيٍّ دقيق يمشي عليه طوال فترة تطوير اللعبة والتفاعل مع أعضاء الفريق، والعمل ضمن حدود الميزانية والزمن المخصص لإنجاز اللعبة المطلوبة.
</p>

<p>
	وهنا يأتي السؤال؛ ما هي مهام مبرمج الألعاب الأساسية؟
</p>

<p>
	في الواقع تتمثل مهمة مبرمج الألعاب الأساسية في تطوير البرامج اللازمة لإنشاء ألعاب الفيديو، من خلال المنصات والمحركات التي تدعم اللعبة التي يعمل عليها، وكتابة الشيفرات البرمجية المناسبة لبناء لعبةٍ مثالية. وتقسم الأدوار عادة  بين كلٍّ من المبرمج والمطوّر والمصمّم، الذين يعملون معًا لصناعة اللعبة الإلكترونية وضمان سير العمل بسلاسة؛ حيث يعمل المبرمجون على كتابة منطق اللعبة البرمجي وتفاعل الكائنات مع بعضها البعض في عالم اللعبة، بينما يعمل المصممون على تصميم هذه الكائنات والانتقالات الخاصة بها.
</p>

<p>
	بناءً على ما سبق تتركز <strong>مهام مبرمج الألعاب</strong> على النقاط التالية:
</p>

<ul>
	<li>
		إعداد بيئة التطوير المناسبة للعبة الفيديو.
	</li>
	<li>
		البحث عن مجموعة البرامج والمنصات التي سيتم استخدامها لدعم اللعبة.
	</li>
	<li>
		ضمان تحقيق التصميم الكامل للعبة وأداءها بكفاءة وجودة.
	</li>
	<li>
		العمل وفقًا لجدول زمني محكم والالتزام بالميزانية.
	</li>
	<li>
		إنتاج نماذج أوليّة لاختبارها وتحديد الأخطاء والإصلاحات.
	</li>
	<li>
		إجراء اختبارات ضمان الجودة والاستجابة للآراء والتعليقات المختلفة.
	</li>
	<li>
		التعاون مع جميع الأقسام لحلّ المشكلات التقنية خلال عملية إنتاج اللعبة.
	</li>
	<li>
		توفير الدعم التقني المستمر بعد إطلاق اللعبة والعمل على ترقيتها لمواكبة التطورات التقنيّة.
	</li>
</ul>

<h2 id="-2">
	كيف تبرز نفسك كمبرمج ألعاب ناجح ضمن المنافسة؟
</h2>

<p>
	إذا كنت مهتمًا لتكون مبرمج ألعاب فعليك أن تضع في الحسبان أن المنافسة في هذ المجال كبيرة وهناك بعض المهارات التي لا بدّ أن تكون موجودة فيك لتتميز في برمجة الألعاب، فامتلاكك لهذه المهارات وتمكّنك منها سيمنحك أفضليّة على منافسيك وبقيّة المبرمجين الآخرين.
</p>

<p>
	إذ ينبغي أن يمتلك مبرمج الألعاب عمومًا خلفية واسعة في علوم الحاسوب ويتقن إحدى <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">لغات برمجة الألعاب</a> ويكون ماهرًا في التعامل مع أحد <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محركات الألعاب</a>؛ لكنك ستكون مخطئًا إن اعتقدتّ أن هذه المهارات  الفنية هي الوحيدة التي ستقرّر نجاحك وتضمن توظيفك، إذ تولي استوديوهات ألعاب الفيديو المهارات التالية في مبرمجي الألعاب انتباهًا شديدًا لعوامل أخرى من أبرزها ما يلي:
</p>

<ol>
	<li>
		التواصل الفعال: من الضروريّ أن يكون مبرمجو ألعاب الفيديو قادرين على التواصل فيما بينهم بشكلٍ صحيح ليتمكّنوا من فهم طبيعة العمل والمواد المتوفّرة والتقنيات المتاحة.
	</li>
	<li>
		العمل ضمن فريق: على الرغم من قدرتك على كون مبرمج ألعابٍ منفردًا إلّا أن تطوير الألعاب ضمن فريق سواء أكان مستقلًا أو في شركة يتطلّب قدرًا من التعاون مع بقية الأشخاص، لذلك يجب أن يتمتع المبرمجون بقدرات تعاونية ممتازة، بما في ذلك القدرة على التفاعل وتبادل الأفكار وتقديم التعليقات والآراء لتمكين الفريق من تحقيق أهدافه المشتركة.
	</li>
	<li>
		حل المشكلات: يجب على المبرمجين أن يكونوا قادرين على حل المشكلات بفعالية من خلال <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%86%D8%B7%D9%82%D9%8A-%D9%81%D9%8A-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r2095/" rel="">التفكير المنطقي</a> والبحث والحكم السليم.
	</li>
	<li>
		الإبداع: يتيح الإبداع للمبرمجين التفكير في طرق جديدة لحل المشاكل المعقدة في ألعاب الفيديو والارتقاء إلى مستوى أعلى.
	</li>
	<li>
		القابلية للتكيف: نظرًا لأن صناعة ألعاب الفيديو تتغير باستمرار، فإن القابلية للتكيف والتآلف مع ظهور تقنيات جديدة تؤثر على عملية تطوير الألعاب مهارة حاسمة للمبرمجين.
	</li>
</ol>

<h2 id="-3">
	اختيار الأدوات المناسبة لبرمجة ألعاب الفيديو
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147646" href="https://academy.hsoub.com/uploads/monthly_2024_03/---.png.7bd969ab56ff699798b6467a182f3e97.png" rel=""><img alt="أدوات-مبرمج-ألعاب-الفيديو.png" class="ipsImage ipsImage_thumbnailed" data-fileid="147646" data-ratio="62.60" data-unique="ut3y05c8e" style="width: 500px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_03/---.thumb.png.41265176ff47d3ead12dcae0532e2c86.png"></a>
</p>

<p>
	قبل أن تبدأ رحلتك في عالم برمجة الألعاب، عليك بداية تحديد الأدوات التي ستستخدمها. تتمثّل هذه الأدوات بشكل رئيس بلغة البرمجة المُختارة ومحرك الألعاب، وقد تلجأ لتعلّم لغة معينة إذا ناسبك محرك ألعاب معين يعمل بها أو بالعكس، وفيما يلي نسرد لك أهم أدوات مبرمج ألعاب الفيديو لنساعدك على اختيار ما يناسبك من بينها.
</p>

<h3 id="-4">
	لغة البرمجة
</h3>

<p>
	تتنوّع لغات البرمجة في مهامها والمجالات التي تخدمها، ولبرمجة ألعاب الفيديو نصيب من لغات البرمجة المخصصة لها، لذلك إن كنت تريد أن تصبح مبرمج ألعاب فيديو محترف يجب أن تتعرف على لغات البرمجة المتخصصة في مجال برمجة ألعاب الفيديو. وهناك عدّة لغات يجب على أي مبرمج ألعاب فيديو تعلّمها ومن أبرزها:
</p>

<ul>
	<li>
		C++‎
	</li>
	<li>
		C#‎
	</li>
	<li>
		Java
	</li>
	<li>
		Python
	</li>
	<li>
		JavaScript
	</li>
</ul>

<p>
	ولكي لا تضيع بتعدّد الخيارات يمكنك التعرف على ميزات كل لغة على حدى وأيّ اللغات هي الأنسب للمجال الذي تبحث عنه من خلال قراءة <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مقال لغات برمجة الألعاب</a>. بعد أن تتعلّم لغة البرمجة الأنسب للعبتك يجب أن تختار محرك الألعاب الذي يحقق الغاية المرجوّة من اللعبة.
</p>

<h3 id="-5">
	محرك الألعاب
</h3>

<p>
	يسعى أيّ مبرمج ألعاب فيديو إلى اختيار محرك ألعاب يسهّل عليه عمله ويشكّل إطارًا خلّاقًا يعكس طبيعة اللعبة وأبعادها، فمحرك الألعاب هو البيئة المسؤولة عن تشغيل اللعبة، حيث يوفر لأي مبرمج ألعاب فيديو إطار عمل برمجيّ يتضمن التعليمات البرمجية والمكتبات المستخدمة والأدوات اللازمة لبرمجة وتطوير هذه اللعبة بسهولة تامة.
</p>

<p>
	لهذا تعدّ عملية اختيار محرك الألعاب الخطوة الأولى في طريق إظهار اللعبة إلى النّور، فمحرك الألعاب يوفر البنية التحتية الرقمية اللازمة لتشغيل عناصر اللعبة وجعلها تعمل بالشكل المطلوب. وقد شكّلت محركات الألعاب ثورة برمجية في مجال تطوير الألعاب، فقبل وجودها كان مبرمج ألعاب الفيديو يبرمج تفاصيل اللعبة من الألف إلى الياء ويكتب الشيفرات البرمجية اللازمة لتصميم اللعبة ونشرها، إلا أنه مع محركات الألعاب بات عمل كلّ مبرمج ألعاب فيديو أسهل بكثير من حيث التصميم والنشر وإنشاء ألعاب متعددة المنصات وصار كل ما تحتاجه لتصميم لعبة متكاملة اليوم هو تعلم استخدام أحد محركات الألعاب ومعرفة أساسية بإحدى لغات البرمجة التي يدعمها هذا المحرك على سبيل المثال:
</p>

<ul>
	<li>
		محرك يونيتي Unity بلغة سي شارب C#‎
	</li>
	<li>
		محرك أنريل Unreal بلغة سي بلس بلس C++‎
	</li>
	<li>
		محرك جودو Godot بلغة جي دي سكربت GDScript - أو سي شارب C#‎
	</li>
	<li>
		محرك جيم ميكر GameMaker بلغة برمجة GML المعتمددة على لغات جافا سكريبت و C++‎ و C#‎
	</li>
</ul>

<p>
	ولمطالعة المزيد عن محركات الألعاب ومميزاتها ولغات البرمجة المستخدمة في كل منها أنصحك بمطالعة مقال <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel=""> تعرف على أشهر محركات برمجة الألعاب الإلكترونية</a>
</p>

<h2 id="-6">
	ما الفرق بين مبرمج ألعاب فيديو ومصمم ألعاب فيديو؟
</h2>

<p>
	الفرق الرئيس بينهما هو نوع العمل الذي يقومون به في عملية تطوير اللعبة. إذ يتولى مصمم ألعاب الفيديو إنشاء الرؤية العامة والمفهوم للعبة الفيديو. فهو يصمم حركة اللعبة والمستويات والشخصيات وخطوط القصة وعناصر أخرى تشكل اللعبة. ويعمل فريق <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">تصميم الألعاب</a> بشكل وثيق مع فريق البرمجة لضمان تنفيذ تصميم اللعبة بشكل صحيح.
</p>

<p>
	من ناحية أخرى، يتولى مبرمج ألعاب الفيديو برمجة منطق اللعبة. وهذا يتضمّن الجوانب التقنية للعبة، مثل إنشاء محرك اللعبة وتصميم واجهة المستخدم وتنفيذ حركات اللعبة، ويتواصل مع المصممين لضمان بناء اللعبة وفقًا لمواصفات التصميم. باختصار، يتعامل مصمم ألعاب الفيديو مع الرؤية الإبداعية للعبة، بينما يكون مبرمج ألعاب الفيديو مسؤولًا عن تحويل تلك الرؤية إلى حقيقة من خلال البرمجة والتنفيذ التقني.
</p>

<h2 id="-7">
	هل يجب أن أكون مبرمج ألعاب فيديو مستقلّ أم ضمن شركة؟
</h2>

<p>
	إذا كنت مستقلًا، فأنت مسؤولٌ عن عملك وفوائدك الخاصة وتطويره بالشكل الذي تريد، إلا أنه يجب عليك العمل في هذه الحالة على تسويق نفسك على منصات التواصل الاجتماعي وتعلّم إدارة ربحك وتكاليفك بشكل مضاعف. إلّا أنه من الجدير بالذكر أن كلّ مبرمج ألعاب فيديو وضع في عين الاعتبار العمل كمستقل في بداية مسيرته لما يحصل عليه من ميزات.
</p>

<p>
	أولًا؛ يمكنك الحصول على دفع أعلى للساعة كمستقل. إذا يجني بعض مبرمجي الألعاب المستقلين الخبراء أكثر من 100$ في الساعة، وهو أكثر بكثير مما يحصلون عليه كموظفين عاديين.
</p>

<p>
	ثانيًا؛ المرونة في العمل، يمكنك أن تعمل متى تريد، كيفما تريد، على مشاريع من اختيارك، فأنت رئيس نفسك هنا! إلا أنه لا يمكن نكران صعوبة الحصول على منصب مبرمج ألعاب فيديو في شركات مرموقة تحكي منتجاتها عنها وتجذب مشاريع جديدةً بشكل دائم ما يشجّع مبرمجي ألعاب الفيديو على تطوير مهاراتهم للعمل مع هذه الشركات. فإن كنت قادرًا على التسويق لنفسك وجذب عملائك يمكنك العمل كمستقلّ، أما إن كنت تبحث عن التطور والمشاريع الدائمة وبيئة العمل الجماعيّة فقدّم طلب عملٍ إلى شركات تطوير الألعاب الآن!.
</p>

<h2 id="-8">
	متوسّط دخل مبرمجي الألعاب
</h2>

<p>
	يعتمد متوسط دخل أيّ مبرمج ألعاب فيديو على التقنيات المستخدمة ولغة البرمجة، فلا يمكن أن يكون أجر مبرمج ألعاب فيديو iOS يساوي أجر مبرمج ألعاب فيديو باستخدام لغة <a href="https://academy.hsoub.com/programming/cpp/" rel="">C++‎</a> لأنهم يستخدمون نهجًا ومهارات مختلفة، بالإضافة إلى عدد سنوات الخبرة في المجال وسرعة الإنجاز والاحترافية في التقنيات والمهارات.
</p>

<p>
	إليك قائمة بمتوسط دخل مبرمجي ألعاب الفيديو سنويًا في الولايات المتحدة الأمريكية اعتمادًا على الاختصاص ولغة البرمجة بحسب <a href="https://qubit-labs.com/game-developers-salaries-guide/" rel="external nofollow">إحصائية لكيوبت عام 2023</a> :
</p>

<ul>
	<li>
		2000$ مبرمج ألعاب فيديو مختصّ بنظام iOS 11
	</li>
	<li>
		113000$ مبرمج ألعاب فيديو مختص بنظام Android
	</li>
	<li>
		53000$ مبرمج ألعاب فيديو مختص بلغة #C
	</li>
	<li>
		113000$ مبرمج ألعاب مختص بلغة ++C
	</li>
	<li>
		98000$ مبرمج ألعاب فيديو مختص بلغة HTML5
	</li>
	<li>
		89000$ مبرمج ألعاب فيديو مختص بلغة JavaScript
	</li>
</ul>

<h2 id="-9">
	كيفية البدء بالعمل كمبرمج ألعاب فيديو
</h2>

<p>
	للدخول إلى عالم برمجة ألعاب الفيديو، تحتاج إلى استراتيجية عمل متينة توصلك إلى وظيفتك الأولى، فليس هناك طريقٌ واحد يجب أن تسلكه وإنما استراتيجيات تمكنك من الوصول لهدفك والبدء بالعمل.
</p>

<p>
	فيما يلي 3 استراتيجيات يمكنك اعتمادها لبدء رحلتك في برمجة الألعاب:
</p>

<ol>
	<li>
		<strong>برمج لعبتك الأولى</strong>: فأكبر مبرمجي الألعاب حول العالم بدؤوا مسيرتهم من خلال أجهزةٍ محدودة الإمكانيات، إلا أن الشغف شجعهم على إنشاء لعبةٍ متميزة. هناك الكثير من أدوات تطوير الألعاب المجانية حولك، كل ما عليك فعله هو اختيار اللعبة التي تريد برمجتها ومن ثمّ نشرها على المنصات الخاصة بالألعاب، والآن أصبح لديك خبرة ومعرض أعمال في المجال، وعندما تلقى لعبتك رواجًا ستلاحظك شركات برمجة الألعاب الشهيرة.
	</li>
	<li>
		<strong>أنشئ معرض أعمال</strong>: تبحث شركات برمجة الألعاب عن مرشحين يسعون إلى التطور بشكلٍ دائم في مجالهم، لذلك حاول أن تسعى بشكل دائم إلى تطوير نفسك في المجال وزيادة خبراتك وشارك أحدث أخبارك عبر منصات التواصل الاجتماعي المختلفة. صمّم معرض أعمالٍ تضع فيه تفاصيل مشاريعك المختلفة والأدوات والمنصات التي اعتمدتها لتحقيق النتيجة النهائية يمكنك استخدام موقع مثل <a href="https://itch.io/" rel="external nofollow">itch.io</a> لإنشاء معرض أعمال لألعابك ورفعها.
	</li>
	<li>
		<strong>شارك في مسابقات الألعاب Game Jams</strong>: عندما تشارك في مسابقات الألعاب ستحصل على خبرةٍ تضيفها إلى سيرتك الذاتية، وستكتسب بعض المهارات في العمل مع فريق تحت الضغط، وستوسع شبكتك المهنية عن طريق لقاء أشخاص جدد - كثير منهم قد يكونون مطوري ألعاب محترفين يمكنهم مساعدتك في الحصول على وظيفةٍ يومًا ما.
	</li>
</ol>

<p>
	كما توفر لك أكاديمية حسوب <a href="https://academy.hsoub.com/learn/game-development/" rel="">دورة تطوير الألعاب</a> التي تختصر عليك وقت التعلم وتمكنك من دخول عالم تطوير الألعاب الرائع، وتشرح لك كيفية بناء ألعاب إلكترونية متنوعة من الصفر حتى الاحتراف بتوجيه من خبراء محترفين  يرشدونك خلال رحلة التعلم.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير الألعاب
		</p>

		<p class="banner-subtitle">
			ابدأ رحلتك في برمجة وتطوير الألعاب ثنائية وثلاثية الأبعاد وصمم ألعاب تفاعلية ممتعة ومليئة بالتحديات
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/game-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/game-development/" rel=""><img alt="دورة تطوير الألعاب" src="https://academy.hsoub.com/learn/assets/images/courses/game-development.png"></a>
	</div>
</div>

<h2 id="-10">
	الخاتمة
</h2>

<p>
	لتكون مبرمج ألعاب فيديو محترف يجب أن تتحلّى بالعمل الجاد والتفاني والإصرار على الاستمراريّة لاكتساب الخبرات والمهارات التقنية والإبداعية. ولأجل ذلك استمرّ في تحسين مهاراتك وتواصل مع المحترفين في المجال، وتعلّم طريقة سرد قصص الألعاب وكتابة حبكتها بشكل مشوّق ومقنع، وشارك في أي فعاليات تخصّ صناعة الألعاب للتعرف على الأشخاص العاملين في مجال تطوير الألعاب والاستفادة من أفكارهم وتجاربهم وفهم المزيد حول صناعة الألعاب وتطوير مهاراتك وخبراتك.
</p>

<p>
	أخيرًا، ابحث عن فرصة عمل مناسبة من خلال التعاقد مع استوديوهات ألعاب أو شركات متخصصة في تطوير ألعاب احترافية أو اعمل على نفسك بشكل مستقل وطوّر ألعابًا خاصة بك وانشرها على متاجر الألعاب لزيادة شهرتك وتحقيق الأرباح.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">أشهر أنواع الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">تعرف على أهمية صناعة الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">تعرف على أفضل برنامج تصميم الألعاب الإلكترونية</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2284</guid><pubDate>Thu, 28 Mar 2024 12:05:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x648;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x645;&#x634;&#x627;&#x647;&#x62F; &#x644;&#x639;&#x628;&#x629; &#x62B;&#x646;&#x627;&#x626;&#x64A;&#x629; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x641;&#x64A; &#x645;&#x62D;&#x631;&#x643; &#x62C;&#x648;&#x62F;&#x648;</title><link>https://academy.hsoub.com/programming/game-development/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%88%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%85%D8%B4%D8%A7%D9%87%D8%AF-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83-%D8%AC%D9%88%D8%AF%D9%88-r2281/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/190891889_.png.acd07ed58cf07c790c3fa6d8bf4fee55.png" /></p>
<p>
	بعد أن أنشأنا في <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-r2280/" rel="">المقال السابق</a> ملفات مشروع لعبة "تفادي الزواحف" ونظمناه، سنبدأ في هذا المقال بالعمل على شخصيات اللعبة وهي لاعب أساسي وأعداء، إذ سنبني المشهد اﻷول باسم <code>Player</code> الذي يمثل اللاعب، ومشهد آخر باسم <code>Mob</code> يمثل الأعداء، ومن ميزات إنشاء مشهد لكل منهما هو إمكانية اختبارها بشكل مستقل قبل أن ننشئ بقية أجزاء اللعبة.
</p>

<h2 id="">
	هيكلية العقدة
</h2>

<p>
	نحتاج بداية إلى عقدة جذرية للاعب، وكقاعدة عامة، لا بد أن تعكس العقدة الجذرية للمشهد الوظيفة المرغوبة للكائن وما هو هذا الكائن. لهذا، انقر على زر + لإضافة عقدة أخرى، وأضف عقدة من نوع <code>Area2D</code> إلى المشهد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146861" href="https://academy.hsoub.com/uploads/monthly_2024_03/01_add_node.png.b88bae535d3c9301354904c54f400ada.png" rel=""><img alt="01 add node" class="ipsImage ipsImage_thumbnailed" data-fileid="146861" data-unique="w4336x3si" src="https://academy.hsoub.com/uploads/monthly_2024_03/01_add_node.png.b88bae535d3c9301354904c54f400ada.png"> </a>
</p>

<p>
	سيعرض جودو أيقونة تنبيه بجوار العقدة في شجرة المشاهد، تجاهلها اﻵن وسنعود إليها لاحقًا.
</p>

<p>
	نتمكن باستخدام <code>Area2D</code> من استشعار الكائنات التي تتداخل أو تعمل ضمن اللاعب، وسنغير اسم العقدة الجديدة إلى <code>Player</code> بالنقر المضاعف عليها. وبعد إنشاء العقدة الجذرية، سنضيف عقدًا إضافية لمنحها مقدرات وظيفية أكبر. لكن قبل ذلك، علينا أن نتأكد من عدم تحريك أو تغيير العقد اﻷبناء عند النقر عليهم. لهذا انقر على اﻷيقونة الواقعة على يسار أيقونة القفل في شريط أدوات المشهد سيعرض لك وصف اﻷداة عند تمرير مؤشر الفأرة فوقها العبارة "اجعل فروع العقدة المختارة غيرقابلة للاختيار":
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146862" href="https://academy.hsoub.com/uploads/monthly_2024_03/02_lock_children.png.3da31aa0e2a8ff0c68ce3d72470e43ab.png" rel=""><img alt="02 lock children" class="ipsImage ipsImage_thumbnailed" data-fileid="146862" data-unique="xk39lr8el" src="https://academy.hsoub.com/uploads/monthly_2024_03/02_lock_children.png.3da31aa0e2a8ff0c68ce3d72470e43ab.png"> </a>
</p>

<p>
	احفظ المشهد بالنقر على مشهد ثم حفظ أو اضغط Ctrl + S في ويندوز ولينكس أو Cmd + S في ماك أو إس.
</p>

<p>
	سنستخدم في مشروعنا أسلوب التسمية المتبع في <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك الألعاب</a> جودو وهو كالتالي حسب لغة البرمجة المستخدمة:
</p>

<ul>
	<li>
		<strong>في لغة GDScript</strong>: نتبع أسلوب باسكال في اﻷصناف (الحرف اﻷول من كل كلمة كبير)، وفي الدوال والمتغيرات أسلوب اﻷفعى حيث تفصل بين كل كلمتين شرطة سفلية <code>_</code>، أما الثوابت فتكتب كل حروفها بالشكل الكبير.
	</li>
	<li>
		<strong>في لغة #C</strong>: تسمى الأصناف والمتغيرات والتوابع بأسلوب باسكال، ونستخدم في تعريف الحقول الخاصة private والمتغيرات المحلية والمعاملات أسلوب سنام الجمل أي الحرف اﻷول من كل كلمة كبير ما عدا الكلمة اﻷولى. وتأكد من كتابة أسماء التوابع بشكل دقيق عند ربط اﻹشارات.
	</li>
</ul>

<h2 id="-1">
	الرسم المتحرك للشخصية Sprite
</h2>

<p>
	انقر على أيقونة العقدة <code>Player</code> وأضف عقدة ابن من نوع <code>AnimatedSprite2D</code> (استخدم Ctrl + A في ويندوز ولينكس) والتي تتولى أمور مظهر وتحريك اللاعب، ولاحظ وجود إشارة تحذير إلى جانب العقدة. تحتاج العقدة موردًا يُدعى "إطارات السبرايت SpriteFrames"، وﻹنشائه، ابحث عن الخاصية <code>SpriteFrames</code> ضمن النافذة الفرعية <code>Animation</code> في حاوية "الفاحص" ثم انقر على مربع النص empty واختر "جديدة SpriteFrame". انقر مجددًا لفتح لوحة "إطارات-اﻷرسومة".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146863" href="https://academy.hsoub.com/uploads/monthly_2024_03/03_spriteframes_panel.png.080dd9aec3ca29bad7d23325f4535a4a.png" rel=""><img alt="03 spriteframes panel" class="ipsImage ipsImage_thumbnailed" data-fileid="146863" data-unique="h8aec7d82" src="https://academy.hsoub.com/uploads/monthly_2024_03/03_spriteframes_panel.thumb.png.50bdfa1371c1fc70886b1f846fd88f0b.png"> </a>
</p>

<p>
	ستجد إلى اليمين قائمة بالرسومات، انقر على الافتراضية وسمها "walk"، ثم انقر على أيقونة إضافة إطار في الزاوية العليا اليمينية وأضف إطارًا آخر سمِّه "up". ابحث بعد ذلك عن الصور المناسبة في المجلد "art" في نظام الملفات وانقل الصور <code>playerGrey_walk[1/2]</code> إلى اﻹطار "walk" بالسحب واﻹفلات، أو بفتح الصورة من خلال أيقونة المجلد وكرر العملية بنقل الصورتين <code>playerGrey_up[1/2]</code> إلى اﻹطار "up".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146864" href="https://academy.hsoub.com/uploads/monthly_2024_03/04_spriteframes_panel2.png.08282e06e5d9f8673966f55aca462bb8.png" rel=""><img alt="04 spriteframes panel2" class="ipsImage ipsImage_thumbnailed" data-fileid="146864" data-unique="06lpw1p9r" src="https://academy.hsoub.com/uploads/monthly_2024_03/04_spriteframes_panel2.thumb.png.9babba42c9cd53c76d50369ffd260da1.png"> </a>
</p>

<p>
	إن أبعاد الصور أكبر من أبعاد نافذة اللعبة، ولا بد من تصغير هذه الصور بالنقر على العقدة <code>AnimatedSprite2D</code> ومن ثم ضبط الخاصية <code>Scale</code> على القيمة <code>Scale</code>. ستجد هذه الخاصية في حاوية الفاحص تحت العنوان <code>Node2D</code> والقائمة "Transform تحويل":
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146865" href="https://academy.hsoub.com/uploads/monthly_2024_03/05_player_scale.png.f49d3f6e5829168248fcc5ef3bd68d86.png" rel=""><img alt="05 player scale" class="ipsImage ipsImage_thumbnailed" data-fileid="146865" data-unique="961cx6i0q" src="https://academy.hsoub.com/uploads/monthly_2024_03/05_player_scale.png.f49d3f6e5829168248fcc5ef3bd68d86.png"> </a>
</p>

<p>
	أضف أخيرًا عقدة من النوع <code>CollisionShape2D</code> لتكون ابنًا للعقدة <code>Player</code>، وتحدد هذه العقدة "صندوق التصادم" المحيط باللاعب أو حدود منطقة التصادم المحيطة به. وتلائمنا في هذا الصدد كائن من النوع <code>CapsuleShape2D</code>، لهذا انقر في "الفاحص" على المربع إلى جوار العنوان واختر "جديدة CapsuleShape2D". استخدم بعد ذلك مقبضي التحكم بالأبعاد (النقطتين الحمراوين) في نافذة المشهد لتغطية الأرسومة بالغلاف:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146866" href="https://academy.hsoub.com/uploads/monthly_2024_03/06_player_coll_shape.png.ca6b34378b0d79aa2a4f6aedebee38f7.png" rel=""><img alt="06 player coll shape" class="ipsImage ipsImage_thumbnailed" data-fileid="146866" data-unique="6j9mun2cm" src="https://academy.hsoub.com/uploads/monthly_2024_03/06_player_coll_shape.png.ca6b34378b0d79aa2a4f6aedebee38f7.png"> </a>
</p>

<p>
	عندما تنتهي من ذلك سيكون شكل مشهد اللاعب <code>Player</code> كالتالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146867" href="https://academy.hsoub.com/uploads/monthly_2024_03/07_player_scene_nodes.png.11a108b46af69dbfa9692f80a03b0f52.png" rel=""><img alt="07 player scene nodes" class="ipsImage ipsImage_thumbnailed" data-fileid="146867" data-unique="bz2o11j1l" src="https://academy.hsoub.com/uploads/monthly_2024_03/07_player_scene_nodes.png.11a108b46af69dbfa9692f80a03b0f52.png"> </a>
</p>

<p>
	تأكد من حفظ المشهد مجددًا بعد هذه التغييرات. سنضيف تاليًا سكربت إلى عقدة اللاعب لتحريكه ثم نُعدّ آلية لترصد التصادم لنعرف إذا ما اصطدم اللاعب بشيء ما.
</p>

<h2 id="-2">
	كتابة الشيفرة اللازمة لتحريك اللاعب
</h2>

<p>
	سنعمل في هذا القسم على كتابة شيفرة لتحريك اللاعب، وإعداده ليترصد التصدامات، لهذا، علينا إضافة بعض الخواص الوظيفية التي لا تقدمها العقد المتوفرة عن طريق إضافة سكربت أو <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A3%D9%83%D9%88%D8%A7%D8%AF-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r2244/" rel="">كود برمجي</a> إلى العقدة. انقر على العقدة <code>Player</code> ثم انقر على "إلحاق نص برمجي":
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146868" href="https://academy.hsoub.com/uploads/monthly_2024_03/08_edit_script.png.bd7207998212d61468f60e2b74d01e6c.png" rel=""><img alt="08 edit script" class="ipsImage ipsImage_thumbnailed" data-fileid="146868" data-unique="upkbt32gm" src="https://academy.hsoub.com/uploads/monthly_2024_03/08_edit_script.png.bd7207998212d61468f60e2b74d01e6c.png"> </a>
</p>

<p>
	لا داعي لتغيير أي شيئ في نافذة إلحاق نص برمجي، اترك كل شيء كما هو وانقر على زر "أنشئ".
</p>

<p>
	<strong>ملاحظة</strong>: إن كنت تريد إنشاء سكربت #C، اختر هذه اللغة من القائمة المنسدلة قبل النقر على "أنشئ".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146869" href="https://academy.hsoub.com/uploads/monthly_2024_03/09_attach_node_window.png.cab86fd0771cb930e9ae3825a8dc7cb3.png" rel=""><img alt="09 attach node window" class="ipsImage ipsImage_thumbnailed" data-fileid="146869" data-unique="9h66fxm6f" src="https://academy.hsoub.com/uploads/monthly_2024_03/09_attach_node_window.png.cab86fd0771cb930e9ae3825a8dc7cb3.png"> </a>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_9" style=""><span class="pln">extends </span><span class="typ">Area2D</span><span class="pln">

</span><span class="lit">@export</span><span class="pln"> var speed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">400</span><span class="pln"> </span><span class="com"># How fast the player will move (pixels/sec).</span><span class="pln">
var screen_size </span><span class="com"># Size of the game window.</span></pre>

<p>
	تسمح لنا التعليمة <code>export</code> قبل المتغير <code>speed</code> بضبط قيمته في نافذة الفاحص. ولهذا اﻷمر فائدته إن أردت تعديل قيمة المتغير بالطريقة نفسها التي تعدّل فيها خاصيات أي عقدة موجودة أصلًا في جودو. انقر اﻵن على العقدة <code>Player</code> وسترى الخاصية موجودة ضمن قسم "متغيرات السكربت" في حاوية الفاحص تحت نفس الاسم الذي يحمله ملف السكربت. وتذكر أن تغيير القيمة في هذا المكان سيلغي القيمة التي يحملها المتغير في السكربت.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146870" href="https://academy.hsoub.com/uploads/monthly_2024_03/10_export_variable.png.d2880aff39cfcc2c2d2c51f36e7ad72c.png" rel=""><img alt="10 export variable" class="ipsImage ipsImage_thumbnailed" data-fileid="146870" data-unique="jy1km12qz" src="https://academy.hsoub.com/uploads/monthly_2024_03/10_export_variable.png.d2880aff39cfcc2c2d2c51f36e7ad72c.png"> </a>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تحذير</strong>
	</p>

	<p>
		إن كنت تستخدم #C، لا بد من إعادة بناء ملفات التجميع assemblies المشروع كلما أردت عرض المتغيرات أو اﻹشارات المصدّرة إلى المحرر من الشيفرة. يمكنك بناء المشروع يدويًا بالنقر على الزر "بناء Build" أعلى يمين المحرر. كما تستطيع بدء عملية البناء من لوحة MSBuild بالنقر على كلمة MSBuild في أسفل نافذة المحرر لعرض اللوحة ثم النقر على الزر "Build".
	</p>
</blockquote>

<p>
	يتضمن السكربت <code>player.gd</code> تلقائيًا الدالتين <code>()ready_</code> و <code>()process_</code>. فإن لم تختر القالب الافتراضي للسكربت أنشئ هاتين الدالتين. وتُستدعى الدالة <code>()ready_</code> عندما تدخل عقدة شجرة المشاهد وهو وقت مناسب لمعرفة أبعاد نافذة اللعبة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_7" style=""><span class="pln">func _ready</span><span class="pun">():</span><span class="pln">
    screen_size </span><span class="pun">=</span><span class="pln"> get_viewport_rect</span><span class="pun">().</span><span class="pln">size</span></pre>

<p>
	بإمكاننا اﻵن استخدام الدالة <code>()process_</code> لتحديد ما يفعله اللاعب، وتُستدعى هذه الدالة من أجل كل إطار ونستخدمها لتحديث العناصر في لعبتنا والتي نتوقع أن تتغير أحيانًا. فمن أجل لاعبنا لا بد من:
</p>

<ul>
	<li>
		التحقق من وجود دخل.
	</li>
	<li>
		تحريكه في الاتجاه المطلوب.
	</li>
	<li>
		تشغيل الرسوم المتحركة المناسبة.
	</li>
</ul>

<p>
	كما ذكرنا علينا بداية التحقق من الدخل، أي هل يضغط اللاعب على زر معين مثلًا؟ ففي لعبتنا هناك عناصر إدخال لأربعة اتجاهات علينا أن نتحقق منها. عُرّفت إجراءات الدخل في إعدادات المشروع تحت عنوان "خريطة الإدخال". وفيها نستطيع تعريف أحداث مخصصة وتعيين أزرار مختلفة، وأحداث تتعلق بالفأرة وغيرها من المدخلات.
</p>

<p>
	انقر على المشروع، ثم إعدادات المشروع لتفتح نافذة اﻹعدادات، ثم انقر على النافذة الفرعية "خريطة الإدخال" في الأعلى. اكتب بعد ذلك "move_right" أي تحرك يمينًا في الشريط العلوي وانقر الزر "أضف" ﻹضافة الإجراء <code>move_right</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146871" href="https://academy.hsoub.com/uploads/monthly_2024_03/11_move_right_action.png.84aa252217f389189b66c9f9c0e46eeb.png" rel=""><img alt="11 move right action" class="ipsImage ipsImage_thumbnailed" data-fileid="146871" data-unique="iqb22bpgb" src="https://academy.hsoub.com/uploads/monthly_2024_03/11_move_right_action.png.84aa252217f389189b66c9f9c0e46eeb.png"> </a>
</p>

<p>
	علينا اﻵن أن نربط اﻹجراء بزر معين، لهذا انقر على أيقونة "+" إلى اليسار كي نفتح نافذة "تهيئة الحدث event configuration".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146872" href="https://academy.hsoub.com/uploads/monthly_2024_03/12_Adding_Action.png.310986933b0e482051969857152733c5.png" rel=""><img alt="12 adding action" class="ipsImage ipsImage_thumbnailed" data-fileid="146872" data-unique="v9o6n5j7w" src="https://academy.hsoub.com/uploads/monthly_2024_03/12_Adding_Action.png.310986933b0e482051969857152733c5.png"> </a>
</p>

<p>
	كل ما عليك الآن هو النقر على الزر الذي تريد ربطه بالحدث سواء زر لوحة مفاتيح أو زر الفأرة. انقر الآن مفتاح السهم اليميني على لوحة المفاتيح وسيظهر الخيار تلقائيًا في مربع "يتم رصد المدخلات.." انقر بعد ذلك على "حسنًا" لتعيين المفتاح.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146873" href="https://academy.hsoub.com/uploads/monthly_2024_03/13_assign_action_key.png.1bf110b44f02fe0345305d87da89e019.png" rel=""><img alt="13 assign action key" class="ipsImage ipsImage_thumbnailed" data-fileid="146873" data-unique="ea0f6rnfb" src="https://academy.hsoub.com/uploads/monthly_2024_03/13_assign_action_key.png.1bf110b44f02fe0345305d87da89e019.png"> </a>
</p>

<p>
	كرر نفس الخطوات لربط الحركات الثلاث الباقية كالتالي:
</p>

<ol>
	<li>
		اربط <code>move_left</code> بالسهم اليساري.
	</li>
	<li>
		اربط <code>move_up</code> بالسهم للأعلى.
	</li>
	<li>
		اربط <code>move_down</code> بالسهم للأسفل.
	</li>
</ol>

<p>
	يجب أن تظهر خارطة المدخلات كالتالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146874" href="https://academy.hsoub.com/uploads/monthly_2024_03/14_input_mapping_complete.png.3de86e8a67289e474d5cc041efb5fe14.png" rel=""><img alt="14 input mapping complete" class="ipsImage ipsImage_thumbnailed" data-fileid="146874" data-unique="8pvlj3hk0" src="https://academy.hsoub.com/uploads/monthly_2024_03/14_input_mapping_complete.png.3de86e8a67289e474d5cc041efb5fe14.png"> </a>
</p>

<p>
	انقر اﻵن على "إغلاق" ﻹغلاق إعدادات المشروع.
</p>

<p>
	<strong>ملاحظة</strong>: ربطنا مفتاح واحد بكل إجراء دخل، لكنك تستطيع أن تربط أكثر من مفتاح أو زر عصا تحكم أو زر فأرة بإجراء الدخل نفسه.
</p>

<p>
	تستطيع أن تقرر إذا ما ضُغط زر باستخدام العبارة <code>()Input.is_action_pressed</code> التي تعيد القيمة <code>true</code> إذا ضُغط الزر و<code>false</code> إن لم يُضغط.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_11" style=""><span class="pln">func _process</span><span class="pun">(</span><span class="pln">delta</span><span class="pun">):</span><span class="pln">
    var velocity </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">ZERO </span><span class="com"># The player's movement vector.</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"move_right"</span><span class="pun">):</span><span class="pln">
        velocity</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"move_left"</span><span class="pun">):</span><span class="pln">
        velocity</span><span class="pun">.</span><span class="pln">x </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"move_down"</span><span class="pun">):</span><span class="pln">
        velocity</span><span class="pun">.</span><span class="pln">y </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="typ">Input</span><span class="pun">.</span><span class="pln">is_action_pressed</span><span class="pun">(</span><span class="str">"move_up"</span><span class="pun">):</span><span class="pln">
        velocity</span><span class="pun">.</span><span class="pln">y </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">length</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
        velocity </span><span class="pun">=</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">normalized</span><span class="pun">()</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> speed
        $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">play</span><span class="pun">()</span><span class="pln">
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">stop</span><span class="pun">()</span></pre>

<p>
	بدأنا بضبط قيمة <code>velocity</code> على <code>(0, 0)</code> فلن يتحرك اللاعب افتراضيًا، وبعد ذلك تحققنا من كل المدخلات وأضفنا إلى المتغير <code>velocity</code> أو طرحنا منه للحصول على الاتجاه. فلو ضغطنا على السهم اليميني واليساري في نفس الوقت ستكون نتيجة المتجه <code>velocity</code> هي <code>(1, 1)</code>، وفي هذه الحالة نكون قد أضفنا حركة أفقية وعمودية في نفس الوقت، وسيتحرك اللاعب بشكل أسرع بالاتجاه القطري موازنة بالحالة التي يتحرك فيها أفقيًا فقط. لكن بإمكاننا منع حدوث هذا اﻷمر بتسوية قيمة السرعة بأن نضبط قيمتها على 1 ثم نضربه بالقيمة المطلوبة ولن تكون السرعة في الاتجاه القطري عندها أكبر.
</p>

<p>
	كما علينا التحقق فيما لو تحرّك اللاعب كي نستدعي الدالتين <code>()play</code> و <code>()stop</code> في AnimatedSprite2D
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تلميح</strong>
	</p>

	<p>
		<code>$</code> هو اختصار للدالة <code>()get_node</code>. فالكتابة <code>()AnimatedSprite2D.play$</code> تماثل العبارة البرمجية <code>()get_node("AnimatedSprite2D").play</code>
	</p>
</blockquote>

<p>
	يُعيد <code>$</code> عقدة معينة إن كانت موجودة في نفس المسار النسبي ويعيد <code>null</code> إن لم تكن موجودة في هذا المسار. وطالما أن AnimatedSprite2D هي عقدة ابن للعقدة الحالية، بإمكاننا استخدام <code>AnimatedSprite2D$</code>.
</p>

<p>
	وطالما حددنا الآن اتجاه الحركة، بإمكاننا تحديث موقع اللاعب. كما نستطيع باستخدام الدالة <code>()clamp</code> منع اللاعب من مغادرة الشاشة وتقييده ضمن مجال محدد. أضف الشيفرة التالية إلى أسفل الدالة <code>()process_</code> وانتبه لأن الشيفرة غير مزاحة بعملية indentation تحت التعليمة <code>else:</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_13" style=""><span class="pln">position </span><span class="pun">+=</span><span class="pln"> velocity </span><span class="pun">*</span><span class="pln"> delta
position </span><span class="pun">=</span><span class="pln"> position</span><span class="pun">.</span><span class="pln">clamp</span><span class="pun">(</span><span class="typ">Vector2</span><span class="pun">.</span><span class="pln">ZERO</span><span class="pun">,</span><span class="pln"> screen_size</span><span class="pun">)</span></pre>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تلميح</strong>
	</p>

	<p>
		يشير المعامل <code>delta</code> إلى طول اﻹطار (الوقت الذي يحتاجه اﻹطار حتى يكتمل). ويضمن استخدام هذه القيمة اتساق الحركة حتى لو تغيّر معدل اﻹطارات.
	</p>
</blockquote>

<p>
	انقر على الزر "شغل المشهد الحالي" أو انقر على F6 أو Cmd+R في ماك أو إس وتأكد من قدرتك على تحريك اللاعب ضمن المشهد في جميع الاتجاهات.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تحذير</strong>:
	</p>

	<p>
		إن ظهر خطأ في نافذة "منقح اﻷخطاء" ينص على التالي: "Attempt to call function 'play' in base 'null instance' on a null instance"، فمن المحتمل أن يعني هذا الخطأ أن اسم العقدة مكتوب بطريقة خاطئة، فأسماء العقد حساسة لحالة اﻷحرف ولا بد أن يُطابق <code>NodeName$</code> الاسم الذي تراه في شجرة المشاهد.
	</p>
</blockquote>

<h3 id="-3">
	اختيار الرسوم المتحركة
</h3>

<p>
	بإمكاننا تحريك اللاعب الآن، لكننا نحتاج إلى تغيير الرسم المتحرك الذي يمثّل الكائن وفقًا لاتجاهه. ليدنا الرسم "تحرّك" والذي يعرض اللاعب وهو يتحرك يمينًا، ولا بد من قلبه أفقيًا حتى يعبّر عن التحرك نحو اليسار باستخدام الخاصية <code>flip_h</code>. وكذلك لدينا الرسم "up" الذي يجب أن يُعكس عموديًا لتمثيل الحركة نحو اﻷسفل باستخدام الخاصية <code>flip_v</code>. لهذا عليك اضافة الشيفرة التالية إلى أسفل الدالة <code>()process_</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8849_16" style=""><span class="kwd">if</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">x </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">animation </span><span class="pun">=</span><span class="pln"> </span><span class="str">"walk"</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">flip_v </span><span class="pun">=</span><span class="pln"> false
    </span><span class="com"># اطلع على املاحظة التالية بخصوص اﻹسناد المنطقي</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">flip_h </span><span class="pun">=</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="kwd">elif</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">y </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">animation </span><span class="pun">=</span><span class="pln"> </span><span class="str">"up"</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">flip_v </span><span class="pun">=</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	<strong>ملاحظة</strong>: يُعد استخدام طريقة اﻹسناد المنطقي في هذه الشيفرة اختصارًا شائعًا. فما نفعله هو اختبار موازنة (منطقي) وإسناد قيمة منطقية، لهذا يمكننا تنفيذ اﻷمرين معًا. وما يفعله هذا الاختصار مطابق لعمل الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8849_18" style=""><span class="kwd">if</span><span class="pln"> velocity</span><span class="pun">.</span><span class="pln">x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">flip_h </span><span class="pun">=</span><span class="pln"> true
</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">flip_h </span><span class="pun">=</span><span class="pln"> false</span></pre>

<p>
	شغّل المشهد وتأكد من تغيّر الرسم مع تغير اتجاه الحركة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تلميح</strong>
	</p>

	<p>
		من اﻷخطاء الشائعة هنا كتابة أسماء الرسومات بشكل خاطئ. ولا بد أن يكون اسم الرسم المتحرك في لوحة "إطارات الرسومات المتحركة" مطابقًا لاسمه في الشيفرة. فإن اسميت الرسم <code>"Walk"</code> مثلًا فلا بد أن يبدأ بحرف كبير أيضًا في الشيفرة.
	</p>
</blockquote>

<p>
	عندما تتأكد أن كل شيء يعمل كما يجب، أضف السطر التالي إلى الدالة <code>()ready_</code> كي يختفي اللاعب في بداية اللعبة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_15" style=""><span class="pln">hide</span><span class="pun">()</span></pre>

<h3 id="-4">
	إعداد التصادمات
</h3>

<p>
	نريد من اللاعب <code>Player</code> أن يعرف متى يستطدم بالعدو، لكننا لم نصنع اﻷعداء بعد! لا بأس بذلك لأننا سنستخدم حاليًا إشارات جودو لننجز اﻷمر. أضف اﻷسطر التالية إلى أعلى السكربت. فإن كنت تستخدم GDScript، أضفها بعد العبارة <code>extends Area2D</code>، وإن كنت تستخدم <a href="https://academy.hsoub.com/programming/c-sharp/" rel="">لغة #C</a> ضعها بعد العبارة<br>
	<code>public partial class Player: Area2D</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_17" style=""><span class="pln">signal hit</span></pre>

<p>
	تُعرّف التعليمة السابقة إشارة خاصة باسم "hit" يبثها اللاعب (يرسلها) عندما يتصادم مع عدو. وسنستخدم الكائن <code>Area2D</code> لالتقاط هذه اﻹشارة. اختر العقدة <code>Player</code> وانقر على النافذة الفرعية "عقدة" ضمن لوحة "الفاحص" كي تعرض قائمة اﻹشارات التي يمكن للاعب بثها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146875" href="https://academy.hsoub.com/uploads/monthly_2024_03/15_hit_signal.png.286e4c534a74c63f6c05140d67e73cd7.png" rel=""><img alt="15 hit signal" class="ipsImage ipsImage_thumbnailed" data-fileid="146875" data-unique="1z7vozdn7" src="https://academy.hsoub.com/uploads/monthly_2024_03/15_hit_signal.png.286e4c534a74c63f6c05140d67e73cd7.png"> </a>
</p>

<p>
	لاحظ وجود إشارتنا المخصصة hit أيضًا ضمن تلك القائمة. وطالما أن العدو سيكون عقدة من النوع <code>RigidBody2D</code>، سنحتاج إلى الإشارة <code>body_entered(body: Node2D)</code>. أوجد تلك اﻹشارة في القائمة ثم انقر عليها بالزر اليميني واختر "يتصل" لتظهر نافذة "قم بوصل اﻹشارة إلى دالة". لا حاجة لتغيير أي شيء، بل انقر فقط على "وصل" وسيوّلد جودو تلقائيًا الدالة المناسبة في الشيفرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146876" href="https://academy.hsoub.com/uploads/monthly_2024_03/16_body_entered_code.png.aef013e611c46eb97943f2bf582d0ffb.png" rel=""><img alt="16 body entered code" class="ipsImage ipsImage_thumbnailed" data-fileid="146876" data-unique="6zx02102n" src="https://academy.hsoub.com/uploads/monthly_2024_03/16_body_entered_code.png.aef013e611c46eb97943f2bf582d0ffb.png"> </a>
</p>

<p>
	لاحظ اﻷيقونة الخضراء إلى يسار الشيفرة المخصصة للإشارة وتدل على أن إشارة متصلة مع هذه الدالة. أضف اﻵن الشيفرة التالية إلى الدالة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4215_13" style=""><span class="pln">func _on_body_entered</span><span class="pun">(</span><span class="pln">body</span><span class="pun">):</span><span class="pln">
    hide</span><span class="pun">()</span><span class="pln"> </span><span class="com"># يختفي اللاعب بعد أن يصطدم.</span><span class="pln">
    hit</span><span class="pun">.</span><span class="pln">emit</span><span class="pun">()</span><span class="pln">
    </span><span class="com"># Must be deferred as we can't change physics properties on a physics callback.</span><span class="pln">
    $CollisionShape2D</span><span class="pun">.</span><span class="pln">set_deferred</span><span class="pun">(</span><span class="str">"disabled"</span><span class="pun">,</span><span class="pln"> true</span><span class="pun">)</span></pre>

<p>
	في كل مرة يصدم بها العدو اللاعب ستُرسل اﻹشارة، ولا بد من تعطيل التصادم الخاص باللاعب كي لا نفعّل اﻹشارة <code>hit</code> أكثر من مرة.
</p>

<p>
	<strong>ملاحظة</strong>: قد ينتج عن تعطيل غلاف التصادم الخاص بالمنطقة خطأ إن حدث اﻷمر أثناء معالجة المحرّك للتصادمات. لهذا استخدم الدالة <code>()set_deferred</code> ﻹخبار المحرّك ألا يعطّل غلاف التصادم حتى يرى أن اﻷمر آمن.
</p>

<p>
	أضف أخيرًا دالة نستدعيها ﻹعادة ضبط اللاعب عندما تبدأ لعبة جديدة
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4215_15" style=""><span class="pln">func start</span><span class="pun">(</span><span class="pln">pos</span><span class="pun">):</span><span class="pln">
    position </span><span class="pun">=</span><span class="pln"> pos
    show</span><span class="pun">()</span><span class="pln">
    $CollisionShape2D</span><span class="pun">.</span><span class="pln">disabled </span><span class="pun">=</span><span class="pln"> false</span></pre>

<h2 id="-5">
	إنشاء شخصية العدو
</h2>

<p>
	حان الوقت اﻵن ﻹنشاء اﻷعداء الذي يجب على اللاعب تفاديهم. ولن يكون سلوكهم معقدًا جدًا بل سيتحركون عشوائيًا على أطراف الشاشة، يأخذون اتجاهًا عشوائيًا ويتحركون وفق خط مستقيم. نبدأ عملنا بإنشاء مشهد باسم <code>Mob</code> يشكل الأساس الذي نشتق منه أي عدد نحتاجه من هذه الكائنات في لعبتنا.
</p>

<h3 id="-6">
	إعداد العقدة
</h3>

<p>
	انقر على مشهد ثم مشهد جديد ثم أضف العقد التالية وفق الترتيب المبين:
</p>

<ul>
	<li>
		RigidBody2D
	</li>
	<li>
		AnimatedSprite2D
	</li>
	<li>
		CollisonShape2D
	</li>
	<li>
		VisibleOnScreenNotifier2D
	</li>
</ul>

<p>
	ولا تنسَ ضبط العقدة اﻷم كي لا يمكن اختيار اﻷبناء كما فعلنا سابقًا عند بناء شخصية اللاعب. اختر بعد ذلك العقدة <code>Mob</code> ثم اضبط قيمة الخاصية <code>Gravity Scale</code> على <code>0</code>، وذلك في قسم RigidBody2D ضمن الفاحص. يمنع هذا اﻷمر الأعداء من السقوط للأسفل.
</p>

<p>
	افتح المجموعة "Collision" الموجودة في اللوحة "CollisionObject2D" تحت "RigidBody2D" ضمن الفاحص. الغ بعد ذلك تفعيل الخيار <code>1</code> ضمن الخاصية <code>Mask</code> بالنقر عليه كي لا تتصادم اﻷعداء فيما بينها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146877" href="https://academy.hsoub.com/uploads/monthly_2024_03/17_mobs_prevent_collisions.png.253383e7b54443fb49ef1da5e37f56b3.png" rel=""><img alt="17 mobs prevent collisions" class="ipsImage ipsImage_thumbnailed" data-fileid="146877" data-unique="77s3wgly3" src="https://academy.hsoub.com/uploads/monthly_2024_03/17_mobs_prevent_collisions.png.253383e7b54443fb49ef1da5e37f56b3.png"> </a>
</p>

<p>
	اضبط العقدة كما فعلنا في مشهد اللاعب، وهنا نستخدم ثلاث رسومات هي <code>fly</code> و <code>swim</code> و <code>walk</code>، وهنالك صورتان لكل مشهد في المجلد art. تُضبط الخاصية <code>Animation Speed</code>  أي سرعة التحريك لكل رسم متحرك على حدة، لهذا اضبط كلًا منها على <code>3</code>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146878" href="https://academy.hsoub.com/uploads/monthly_2024_03/18_setting_up_enemy_animation.png.20433e167d32201d56444dc02862ced3.png" rel=""><img alt="18 setting up enemy animation" class="ipsImage ipsImage_thumbnailed" data-fileid="146878" data-unique="eebdne8sp" src="https://academy.hsoub.com/uploads/monthly_2024_03/18_setting_up_enemy_animation.png.20433e167d32201d56444dc02862ced3.png"> </a>
</p>

<p>
	بإمكانك اﻵن النقر على الزر "تشغيل الرسم المتحرك" إلى يسار "سرعة التحريك" لعرض الرسوم المتحركة.
</p>

<p>
	سنختار إحدى هذه الرسوم عشوائيًا حتى يكون للأعداء أشكال مختلفة، وكما هو الحال مع رسومات اللاعب لا بد من تصغير هذه الرسومات، وذلك بضبط الخاصية <code>Scale</code> على <code>(0.75, 0.75)</code>.
</p>

<p>
	علينا اﻵن إضافة غلاف <code>CapsuleShape2D</code> من أجل التصادمات كما فعلنا مع اللاعب. ولكي يتماشى الغلاف مع الرسم المتحرك لا بد من تدويره بضبط الخاصية <code>Rotation Degrees</code> على <code>90</code> تحت لوحة "Node2D" والقائمة "Transform" ضمن الفاحص)
</p>

<h3 id="-7">
	كتابة شيفرة تحريك العدو
</h3>

<p>
	أضف سكربت إلى العقدة <code>Mob</code> كما فعلنا سابقًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_19" style=""><span class="pln">extends </span><span class="typ">RigidBody2D</span></pre>

<p>
	نشغّل باستخدام الدالة <code>()ready_</code> الرسومات ونختار عشوائيًا أحد اﻷنواع الثلاث لهذه الرسوميات كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_21" style=""><span class="pln">func _ready</span><span class="pun">():</span><span class="pln">
    var mob_types </span><span class="pun">=</span><span class="pln"> $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">sprite_frames</span><span class="pun">.</span><span class="pln">get_animation_names</span><span class="pun">()</span><span class="pln">
    $AnimatedSprite2D</span><span class="pun">.</span><span class="pln">play</span><span class="pun">(</span><span class="pln">mob_types</span><span class="pun">[</span><span class="pln">randi</span><span class="pun">()</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> mob_types</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()])</span></pre>

<p>
	ما تفعله هذه الشيفرة هو الحصول على أسماء الرسومات من الخاصية <code>frames</code> للعقدة <code>AnimatedSprite2D</code>، وستكون النتيجة مصفوفة تضم اﻷنواع الثلاث: <code>["walk", "swim", "fly"]</code>. ثم نختار عشوائيًا رقمًا بين 0 و 2 لاختيار أحد اﻹطارات الثلاث من المصفوفة السابقة بتطبيق التعليمة <code>randi() % n</code>، والتي تختار عددًا صحيحًا عشوائيًا بين <code>0</code> و <code>n-1</code>.
</p>

<p>
	وأخيرًا نحتاج إلى شيفرة كي يحذف العدو نفسه عندما يغادر شاشة اللعبة. ولتنفيذ ذلك صل الإشارة <code>()Screen_exited</code> العائدة للعقدة <code>()VisibleOnScreenNotifier</code> إلى العقدة <code>Mob</code> (راجع فقرة وصل إشارة اللاعب التي نفّذناها سابقًا) ثم أضف الأمر <code>()queue_free</code> إلى الدالة التي تظهر في السكربت كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_1682_25" style=""><span class="pln">func _on_visible_on_screen_notifier_2d_screen_exited</span><span class="pun">():</span><span class="pln">
    queue_free</span><span class="pun">()</span></pre>

<p>
	وهكذا سيكتمل مشهد العدو.
</p>

<h2>
	الخلاصة
</h2>

<p>
	بهذا نكون قد وصلنا لنهاية مقالنا الحالي الذي أنشأنها فيه مشهدين من مشاهد اللعبة ثنائية الأبعاد في محرك جودو، تابع معنا المقال التالي الذي سنقوم فيه بضم المشهدين معًا والسماح للأعداء بالتكاثر على الشاشة والحركة لتحويل المشاهد إلى لعبة تعمل كما خططنا لها.
</p>

<p>
	ترجمة -وبتصرف- للمقالات: <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/02.player_scene.html" rel="external nofollow">Creating the Player scene</a> و <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/03.coding_the_player.html" rel="external nofollow">Coding the player</a> و <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/04.creating_the_enemy.html" rel="external nofollow">Creating the enemy</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D8%A8%D9%86%D8%A7%D8%A1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-r2280/" rel=""> تجهيز وضبط ملفات لعبة ثنائية البعد عبر محرك الألعاب Godot </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%81%D9%83%D8%A7%D8%B1-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D9%81%D9%8A%D8%AF%D9%8A%D9%88/" rel="">كيف تحصل على أفكار ألعاب فيديو ناجحة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">تعرف على أشهر لغات برمجة الألعاب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو Godot</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2281</guid><pubDate>Wed, 27 Mar 2024 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x62F;&#x621; &#x628;&#x62A;&#x637;&#x648;&#x64A;&#x631; &#x644;&#x639;&#x628;&#x629; &#x62B;&#x646;&#x627;&#x626;&#x64A;&#x629; &#x627;&#x644;&#x628;&#x639;&#x62F; &#x639;&#x628;&#x631; &#x645;&#x62D;&#x631;&#x643; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D8%A8%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-%D8%A7%D9%84%D8%A8%D8%B9%D8%AF-%D8%B9%D8%A8%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-godot-r2280/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/1076621314_.png.1ccbbc509bceb64e9c49af6a85274074.png" /></p>
<p>
	ننقلك في سلسلة المقالات التالية خطوة بخطوة لإنشاء لعبة كاملة ثنائية البعد باستخدام محرّك اﻷلعاب جودو Godot. وفي نهاية السلسلة ستكون قد أنجزت لعبة بسيطة كتلك الموضحة في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="146851" href="https://academy.hsoub.com/uploads/monthly_2024_03/01_dodge_preview.gif.084bb023f0832bfd7ad73b81bfa6fc3b.gif" rel=""><img alt="01 dodge preview" class="ipsImage ipsImage_thumbnailed" data-fileid="146851" data-unique="x0933friv" src="https://academy.hsoub.com/uploads/monthly_2024_03/01_dodge_preview.gif.084bb023f0832bfd7ad73b81bfa6fc3b.gif"> </a>
</p>

<p>
	وسنتعلم من خلال هذه السلسلة كيفية عمل <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2183/" rel="">محرّر محرك الألعاب جودو Godot</a>، وكيفية هيكلة المشروع، ومن ثم ستتعلم خطوات بناء اللعبة بشكل عملي.
</p>

<p>
	<strong>ملاحظة</strong>: هذا المقال هو مدخل إلى محرك اﻷلعاب جودو، ويفترض أنك تتمتع ببعض الخبرات البرمجية لاستخدام <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">لغات برمجة الألعاب</a> وبرمجة لعبتك الإلكترونية من خلالها. فإن كنت جديدًا في عالم البرمجة. ننصحك بالعودة إلى <a href="https://academy.hsoub.com" rel="external">أكاديمية حسوب</a> التي تضم عددًا كبيرًا من المقالات والمواضيع التي تناسب القادمين الجدد وتقدم أفضل <a href="https://academy.hsoub.com/store/c1-%d8%af%d9%88%d8%b1%d8%a7%d8%aa-%d8%aa%d8%b9%d9%84%d9%8a%d9%85%d9%8a%d8%a9/" rel="">الدورات التعليمية</a> للبرمجة من الصفر وحتى الاحتراف.
</p>

<p>
	سوف نطلق على لعبتا اسم "تفادي الزواحف Dodge the creeps"، ومن المفترض أن تبتعد شخصية اللعبة عن اﻷعداء قدر اﻹمكان.
</p>

<p>
	ستتعلم من خلال هذه السلسلة كيف تقوم بما يلي:
</p>

<ul>
	<li>
		تنشئ لعبة مكتملة ثنائية البعد باستخدام محرك الألعاب جودو.
	</li>
	<li>
		تهيكل مشروع لعبة بسيطة.
	</li>
	<li>
		تحرك <a href="https://academy.hsoub.com/programming/game-development/%D8%B4%D8%AE%D8%B5%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%86%D8%A7%D8%AC%D8%AD%D8%A9-r2212/" rel="">شخصية اللعبة</a> وتغيير شكلها.
	</li>
	<li>
		تنشر أعداء عشوائيًا.
	</li>
	<li>
		تعيد نتيجة اللعبة.
	</li>
</ul>

<h2>
	لماذا نطور لعبة ثنائية البعد 2D؟
</h2>

<p>
	إن كنت جديدًا في تطوير اﻷلعاب أو لا تألف بيئة جودو، ننصحك ان تبدأ بتعلم تصميم اﻷلعاب ثنائية البعد، فهي تسمح لك في تعلم بيئة العمل وترتاح فيها قبل أن تبدأ اﻷلعاب ثلاثية الأبعاد التي تميل أكثر إلى التعقيد.
</p>

<p>
	خُصِّصَ هذا المقال والمقالات اللاحقة للمبتدئين الذين لديهم أساسيات في التعامل مع محرك جودو، فإن كنت جديدًا في البرمجة ويصعب عليك كتابة الأكواد من الصفر، بإمكانك الاطلاع على <a href="https://github.com/godotengine/godot-demo-projects" rel="external nofollow">الشيفرة المصدرية</a> للعبة عبر جيت-هب وفهمها. كما حضرنا مسبقًا بعض الملحقات التي تحتاجها، لهذا سنقفز مباشرة إلى الشيفرة التي يمكنك <a href="https://github.com/godotengine/godot-docs-project-starters/releases/download/latest-4.x/dodge_the_creeps_2d_assets.zip" rel="external nofollow">تحميلها</a> من المستودع المخصص على جيت-هب.
</p>

<h2 id="">
	إعداد المشروع
</h2>

<p>
	سنُعّد في هذا المقال مشروعنا وننظمه، لهذا شغّل محرك ألعاب جودو وأنشئ مشروعًا جديدًا.
</p>

<p>
	ليس عليك سوى تحديد مسار مناسب لتخزين المشروع وبإمكانك ترك بقية القيم كما هي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146852" href="https://academy.hsoub.com/uploads/monthly_2024_03/02_new-project-button.png.c897935b291253a5bd70f540b0127898.png" rel=""><img alt="02 new project button" class="ipsImage ipsImage_thumbnailed" data-fileid="146852" data-unique="r6gbxt3xl" src="https://academy.hsoub.com/uploads/monthly_2024_03/02_new-project-button.thumb.png.b0575ca2176d295a05d0ae1b43fc4c77.png"> </a>
</p>

<p>
	بعدها <a href="https://github.com/godotengine/godot-docs-project-starters/releases/download/latest-4.x/dodge_the_creeps_2d_assets.zip" rel="external nofollow">عليك تحميل الأرشيف</a> الذي يتضمّن كافة ملفات الصور والمقاطع الصوتية التي سنستخدمها في صنع اللعبة ثنائية الأبعاد الخاصة بنا، ثم استخرج محتوياته وانقل المجلدين <code>‎/art</code> و <code>‎/fonts</code> إلى مجلد اللعبة.
</p>

<p>
	يجب أن يبدو مجلد اللعبة مشابهًا للقطة الشاشة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146853" href="https://academy.hsoub.com/uploads/monthly_2024_03/03_folder-content.png.0c22020ecbbcd192f84dc67664c9c93b.png" rel=""><img alt="03 folder content" class="ipsImage ipsImage_thumbnailed" data-fileid="146853" data-unique="vrlw9az1y" src="https://academy.hsoub.com/uploads/monthly_2024_03/03_folder-content.png.0c22020ecbbcd192f84dc67664c9c93b.png"> </a>
</p>

<p>
	صُممت هذه اللعبة لنمط العرض الشاقولي portrait، لهذا لا بد من تعديل قياس نافذة اللعبة. انقر على المشروع ثم اختر إعدادات المشروع لفتح نافذة اﻹعدادات ثم افتح في العمود اليميني القائمة "عرض display" ثم انقر على "نافذة window". واضبط بعد ذلك اتساع نافذة العرض viewport width على 480 وارتفاعها على 720.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146854" href="https://academy.hsoub.com/uploads/monthly_2024_03/04_setting-project-width-and-height.png.568b95d4b737d48b6c7008055e422a6d.png" rel=""><img alt="04 setting project width and height" class="ipsImage ipsImage_thumbnailed" data-fileid="146854" data-unique="lvqw9y8q5" src="https://academy.hsoub.com/uploads/monthly_2024_03/04_setting-project-width-and-height.png.568b95d4b737d48b6c7008055e422a6d.png"> </a>
</p>

<p>
	وتحت الخيار "تمدد Stretch " اضبط "الوضع Mode" على القيمة <code>canvas_items</code> ونسبة العرض على القيمة <code>keep</code>، حيث يساهم هذان الخياران في اتساق العرض على شاشات مختلفة الأبعاد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146855" href="https://academy.hsoub.com/uploads/monthly_2024_03/05_setting-stretch-mode.png.cbc4e2ebdba1190ab58c8e091724ef3b.png" rel=""><img alt="05 setting stretch mode" class="ipsImage ipsImage_thumbnailed" data-fileid="146855" data-unique="s0ztj4u5w" src="https://academy.hsoub.com/uploads/monthly_2024_03/05_setting-stretch-mode.png.cbc4e2ebdba1190ab58c8e091724ef3b.png"> </a>
</p>

<h2 id="-1">
	تنظيم المشروع
</h2>

<p>
	سنصنع في هذا المشروع ثلاثة مشاهد مستقلة هي <code>Player</code> و <code>Mob</code> و<code>HUD</code> بحيث تجتمع كلها في المشهد الرئيسي <code>Main</code>.
</p>

<p>
	ومن اﻷفضل في المشاريع اﻷكبر أن تنشئ مجلدًا يضم المشاهد المختلفة والسكربتات الملحقة بها، لكن لمشروع صغير كهذا، بإمكانك تخزينها في المجلد الجذري للمشروع الذي يُعرّف بالعنوان <code>//:res</code> . وستجد مجلد المشروع في حاوية "نظام الملفات" في الزاوية اليسارية السفلى.
</p>

<p style="text-align: center;">
	<img alt="filesystem_dock.png" class="ipsImage ipsImage_thumbnailed" data-fileid="146857" data-ratio="98.41" data-unique="0ffgftkq7" width="314" src="https://academy.hsoub.com/uploads/monthly_2024_03/filesystem_dock.png.70be29003210df8106191da863079ff7.png">
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على أولى مراحل برمجة لعبة ثنائية الأبعاد في <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك الألعاب</a> جودو Godot، وبدأنا بتحديد الشخصيات والمشاهد التي تضمها اللعبة، وحددنا طريقة تنظيم ملفاتها، وندعوك لمتابعة السلسلة التالية من هذه المقالات لتتعرف على الخطوات التالية العملية لإنجاز اللعبة وبرمجتها.
</p>

<p>
	ترجمة -وبتصرف- للمقالين: <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html" rel="external nofollow">your first 2D game</a> و <a href="https://docs.godotengine.org/en/stable/getting_started/first_2d_game/01.project_setup.html" rel="external nofollow">Setting up the project</a> من توثيق جودو الرسمي.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-%D9%88%D8%B7%D8%B1%D8%AD-%D8%A7%D9%84%D8%A3%D8%B3%D8%A6%D9%84%D8%A9-%D8%AD%D9%88%D9%84%D9%87-r2267/" rel="">تعلم الميزات الجديدة في محرك الألعاب جودو وطرح الأسئلة حوله</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sqlite-r2241/" rel="">إعداد محرك الألعاب جودو Godot للعمل مع قاعدة البيانات SQLite</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2280</guid><pubDate>Fri, 22 Mar 2024 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x631;&#x624;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x635;&#x645;&#x64A;&#x645;&#x64A;&#x629; &#x644;&#x645;&#x62D;&#x631;&#x643; &#x627;&#xFEF7;&#x644;&#x639;&#x627;&#x628; &#x62C;&#x648;&#x62F;&#x648; Godot</title><link>https://academy.hsoub.com/programming/game-development/%D8%A7%D9%84%D8%B1%D8%A4%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%8A%D8%A9-%D9%84%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2278/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/185601764_.png.bc40fff64d14c79759738c5b6ee1c8a1.png" /></p>
<p>
	سنشرح في هذا المقال التصميم الذي يميز محرك ألعاب جودو عن غيره، فكل محرك ألعاب مختلف عن اﻵخر وله تصمصم فريد يلبي احتياجات مختلفة، ويقود هذا اﻷمر إلى سياقات عمل مختلفة وطرق مختلفة في هيكلة اﻷلعاب.
</p>

<p>
	نساعدك في هذا المقال على فهم طريقة عمل محرك الألعاب جودو، فما نعرضه ليس قائمة بالميزات ولا مقارنة بين المحركات. ولكي تعرف ما يناسبك من محركات، لابد من اختبارها بنفسك وفهم تصميمها ومحدوديتها.
</p>

<h2 id="">
	التصميم كائني التوجه
</h2>

<p>
	يتبنى <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك الألعاب</a> جودو مفهوم التصميم كائني التوجه كأساس له من خلال نظام المشاهد المرن والتسلسل الهرمي للعقد. كما يحاول الابتعاد عن اﻷنماط البرمجية المعقدة كي يقدم طريقة واضحة ومباشرة لهيكلة ألعابك.
</p>

<p>
	من خلال استخدام محرك جودو، يمكنك بناء مشاهد متنوعة تكون بمثابة مكونات جاهزة لإعادة استخدامها داخل مشروعك. على سبيل المثال يمكنك إنشاء مشهد لأضواء وامضة BlinkingLight وآخر لمصابيح مكسورة BrokenLantern. يحتوي كل مشهد على خصائصه الخاصة، مثل طريقة تفاعل الضوء مع المشهد أو تغييره لونه، ويمكنك جمع هذه المشاهد في مشهد أكبر.
</p>

<p>
	فمثلاً، عند بناء مدينة مليئة بالمصابيح المكسورة، يمكن تغيير خصائص الأضواء الوامضة كاللون أو سرعة الوميض بشكل موحد في جميع المصابيح داخل المدينة. بذلك، يصبح لديك القدرة على التحكم في حالة المصابيح بشكل مركزي، فتعديل الضوء الوامض في مشهد واحد، سيعدل المصابيح المكسورة في كامل المدينة. هذه الطريقة في  إدارة المشاهد وتغيير الحالات فعالة وتسهل تطوير ألعاب معقدة.
</p>

<p>
	وفوق كل ذلك يدعم جودو الوراثة وهو أحد المبادئ الأساسية في البرمجة كائنية التوجه <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-oop/" rel="">oop</a>، فقد يكون مشهد جودو سلاحًا أو شخصية أو غرضًا ما أو بابًا أو مستوى أو جزء من مستوى أو أي شيء آخر  تريده. ويعمل المشهد عمل الصنف class في الشيفرة الصرفة، ما عدا أنك حر في تصميمه من خلال المحرر مستخدمًا الشيفرة فقط أو مزيجًا من الاثنين.
</p>

<p>
	تختلف المشاهد في جودو عن الكائنات الجاهزة prefab في محركات اﻷلعاب ثلاثية اﻷبعاد اﻷخرى مثل محرك Unity في إمكانية الوراثة عنها أو توسيعها. فقد تُنشئ ساحرًا بتوسعة مشهد الشخصية مثلًا. وعند تحديث الشخصية في المحرر ستتحدث معها شخصية الساحر أيضًا. سيمكنك ذلك من بناء مشروعك كي يتطابق التصميم مع هيكلية الشيفرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146773" href="https://academy.hsoub.com/uploads/monthly_2024_03/01_engine_design.png.ba77c574f638d1b2c1a7df0a1a3ac21c.png" rel=""><img alt="01 engine design" class="ipsImage ipsImage_thumbnailed" data-fileid="146773" data-unique="3n8x4skco" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/01_engine_design.png.ba77c574f638d1b2c1a7df0a1a3ac21c.png"> </a>
</p>

<p>
	وتجدر الملاحظة أن جودو يقدم أنواعًا مختلفة من الكائنات تدعى عقدًا Nodes، ولكل منها غاية محددة. والعقد أجزاء من شجرة وترث دائمًا من العقدة اﻷب وصولًا إلى الصنف الرئيسي <code>Node</code>. وعلى الرغم من وجود عقد في جودو مثل اﻷشكال المتصادمة التي تستخدمها فيزيائية العقدة اﻷب، تُعد معظم العقد مستقلة عن بعضها. وبعبارة أخرى، لا تعمل العقد كما تعمل المكونات components في محركات ألعاب أخرى.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146774" href="https://academy.hsoub.com/uploads/monthly_2024_03/02_engine_design_nodes.png.6a4dec72f3224da380ca6d105ff51bc7.png" rel=""><img alt="02 engine design nodes" class="ipsImage ipsImage_thumbnailed" data-fileid="146774" data-unique="6z5e9ljzq" style="width: 200px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/02_engine_design_nodes.png.6a4dec72f3224da380ca6d105ff51bc7.png"> </a>
</p>

<p>
	فالعقد <code>Sprite2D</code> و <code>Node2D</code> و <code>CanvasItem</code> و <code>Node</code>، تمتلك جميع الخاصيات والميزات للأصناف اﻵباء كالتحويلات أو القدرة على رسم أشكال محددة وتصييرها باستخدام معالج لوني shader محدد.
</p>

<h2 id="-1">
	حزم حصرية بالكامل
</h2>

<p>
	يحاول محرك الألعاب جودو تزويد المستخدمين بأدوات خاصة تلبي معظم احتياجاتهم. إذ يمتلك المحرك فضاء عمل مخصص لكتابة السكربتات، ومحرر رسوميات، ومحرر خرائط، ومحرر معالج لوني، ومنقح، ومحلل أداء، باﻹضافة إلى قدرته على عرض التغييرات مباشرة على جهازك المحلي أو جهاز متصل عبر الشبكة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146775" href="https://academy.hsoub.com/uploads/monthly_2024_03/03_engine_design_tools.png.07e2dc331334de7f3c5c874705d934c2.png" rel=""><img alt="03 engine design tools" class="ipsImage ipsImage_thumbnailed" data-fileid="146775" data-unique="n3lwqsc3s" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/03_engine_design_tools.png.07e2dc331334de7f3c5c874705d934c2.png"> </a>
</p>

<p>
	إن الغاية من ذلك كله تقديم حزمة متكاملة من اﻷدوات ﻹنشاء اﻷلعاب تحسين تجربة المستخدمين مثل Blender لتصميم النماذج ثلاثية الأبعاد، وبإمكانك بالطبع العمل مع برامج خارجية نظرًا لدعمه للإضافات plugin، والتي تستطيع أن تنشئها بنفسك أيضًا لتلبية احتياجات خاصة في المشروع.
</p>

<p>
	ويعود وجود لغة GDScript الخاصة بجودو إلى هذا السبب جزئيًا إضافة إلى دعمه لغة <a href="https://academy.hsoub.com/programming/c-sharp/" rel="">#C</a>. فلغة GDScript مصممة لتلائم حاجات المطورين والمصممين ومتكاملة تمامًا مع المحرّك والمحرر. وتتيح لك GDScript كتابة شيفرة اعتمادًا على صياغة اﻹزاحة أو المسافات البادئة indentation، وتتعرف على اﻷنواع، وتزودك بميزة اﻹكمال التلقائي. وتُعد هذه اللغة من <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">لغات برمجة الألعاب</a> وتوفر شيفرة سهلة ومفهومة وتضم أنواعًا مخصصة مثل <code>Vectors</code> و <code>Colors</code>.
</p>

<p>
	ومع GDExtension يمكنك كتابة شيفرة عالية اﻷداء باستخدام لغات مصرّفة مثل <a href="https://academy.hsoub.com/programming/java/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-java-r2275/" rel="">C</a> و <a href="https://academy.hsoub.com/programming/cpp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-c-r802/" rel="">++C</a> و <a href="https://academy.hsoub.com/programming/rust/" rel="">Rust</a> و<a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> (باستخدام Cython) دون إعادة تصريف المحرّك.
</p>

<p>
	<strong>ملاحظة</strong>: لا يقدم فضاء العمل ثلاثي الأبعاد نفس عدد الميزات التي يقدمها ثنائي اﻷبعاد، ويحتاج إلى برامج خارجية أو إضافات لإنشاء التضاريس، وتحريك <a href="https://academy.hsoub.com/programming/game-development/%D8%B4%D8%AE%D8%B5%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%86%D8%A7%D8%AC%D8%AD%D8%A9-r2212/" rel="">شخصيات الألعاب</a> المعقدة وهكذا. مع ذلك، يزودك جودو بواجهة برمجية متكاملة لتوسعة وظائف المحرر باستخدام شيفرة اللعبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146776" href="https://academy.hsoub.com/uploads/monthly_2024_03/04_engine_design_fsm_plugin.png.c5cc61dd95c572528f6acdfd55e2b850.png" rel=""><img alt="04 engine design fsm plugin" class="ipsImage ipsImage_thumbnailed" data-fileid="146776" data-unique="7f5cdagr2" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/04_engine_design_fsm_plugin.thumb.png.ca51b74177819f9a5724b802878f2ad3.png"> </a>
</p>

<h2 id="-2">
	محرك مفتوح المصدر
</h2>

<p>
	يقدم جودو قاعدة برمجية مفتوحة المصدر بالكامل وفق ترخيص MIT. ويعني ذلك أن كل التقنيات التي تأتي معه هي مفتوحة المصدر أيضًا. وقد طوّرت معظم أجزاء المحرك من الصفر من قبل مساهمين. ويمكن لأي شخص استخدام اﻹضافات المناسبة لمشروعه ولا يعني ذلك أن تشحن هذه اﻹضافات مع المحرك. من اﻷمثلة عليها نجد Google AdMob أو FMOD.
</p>

<p>
	وتعني القاعدة البرمجية مفتوحة المصدر من ناحية أخرى أن بإمكانك التعلم من محرك الالعاب وتوسيعه كما تشاء، وتستطيع تنقيح اﻷلعاب بسهولة، إذ يطبع جودو رسائل الخطأ من خلال متتبع المكدس stack tracer.
</p>

<h2 id="-3">
	المحرك مُطوَّر من مجتمعه الخاص
</h2>

<p>
	يُطوّر محرك الألعاب جودو من قبل مجتمعه الخاص، فهو منهم ولهم ولجميع <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطوري اﻷلعاب</a>، وحاجات ونقاشات المستخدمين هو اﻷساس الذي يقود تطوير نواته. وتركّز الميزات الجديدة التي يقدمها مطورو النواة على ما يقدم الفائدة لمعظم مستخدميه، والقلة فقط من مطوري النواة يعملون رسميًا بدوام كامل. لكن المشروع يضم أكثر من 600 مساهم حتى لحظة كتابة هذه المقالة. فالمبرمجون المساهمون يعملون على تطوير الميزات التي يحتاجونها لأنفسهم لهذا سترى تحسينات من جميع النواحي عند كل إصدار رئيسي للمحرك.
</p>

<h2 id="-4">
	محرر جودو هو في الواقع لعبة جودو
</h2>

<p>
	محرر جودو هو الأداة التي تستخدمها لبناء ألعابك، وهو يعمل مباشرة على نفس المحرك الذي يشغل اللعبة، وبالتالي عندما تكتب الشيفرة أو تصمم المشاهد، فستتمكن من اختبارها فورًا داخل المحرر أي بإمكانك استخدام نفس الشيفرة في مشاهد ألعابك أو بناء إضافات وتوسيع المحرر ويعطي ذلك مصداقية ومرونة لواجهة المستخدم. فعندما تستخدم التعليمة <code>tool@</code> ستتمكن من تشغيل شيفرة اللعبة ضمن المحرر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146777" href="https://academy.hsoub.com/uploads/monthly_2024_03/05_engine_design_rpg_in_a_box.png.fce6bf9634d9e45dc9d8fb43d8a2352b.png" rel=""><img alt="05 engine design rpg in a box" class="ipsImage ipsImage_thumbnailed" data-fileid="146777" data-unique="pkwex4zna" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/05_engine_design_rpg_in_a_box.thumb.png.2cf58713fc92b1b2665b79311df7b799.png"> </a>
</p>

<p style="text-align: center;">
	محرر RPG in a Box هو محرر صمم باستخدام جودو 2 ويستخدم واجهة جودو الرسومية لمنظومته البرمجية المبنية على أساس العقد
</p>

<p>
	ضع التعليمة <code>tool@</code> في بداية ملف GDScript وستعمل الشيفرة ضمن المحرر. سيساعدك ذلك على إدراج وتصدير الإضافات وإنشاء إضافة مخصصة مثل محررات مخصصة للمراحل أو إنشاء سكربتات لها نفس العقد وترتبط بنفس الواجهة البرمجية التي تستخدمها في مشروعك.
</p>

<p>
	<strong>ملاحظة</strong>: كُتب محرر جودو بالكامل باستخدام لغة ++C وصُرّف إلى الصيغة الثنائية. ويعني ذلك أنه من غير الممكن إدراجه كمشروع نمطي على شكل ملف <code>project.godot</code>.
</p>

<h2 id="-5">
	يوفر جودو محركين ثنائي الأبعاد وثلاثي الأبعاد
</h2>

<p>
	يوفّر جودو محركين مخصصين ثنائي وثلاثي البعد. وكنتيجة لذلك ستكون وحدة القياس اﻷساسية للمشهد ثنائي البعد هي البكسل. وعلى الرغم من أن المحركين منفصلين، فيمكنك تصيير المشهد ثنائي البعد في المحرك ثلاثي البعد والعكس صحيح، كما يمكنك كذلك تضمين الشخصيات والواجهات ثنائية البعد في العالم ثلاثي اﻷبعاد.
</p>

<h2 id="-6">
	الخلاصة
</h2>

<p>
	بهذا تكون قد وصلت لنهاية مقال اليوم الذي ألقينا فيه نظرة عامة عن تصميم محرك الألعاب مفتوح المصدر جودو Godot، ووضحنا أسلوب التصميم المتبع في هذا المحرك وكيفية استخدامه في تطوير الألعاب، وأهم الميزات التي يدعمها مثل التصميم كائني التوجه والوراثة، بالإضافة إلى الأدوات والميزات الحصرية المتوفرة في المحرك، ودعمه لتصميم الألعاب ثنائية وثلاثية الأبعاد مع إمكانية تفاعلهما معًا في تطوير الألعاب، وسلطنا الضوء على الجهود المبذولة من قبل مجتمع مطوري جودو في تطوير المحرك وتحسينه باستمرار لضمان أفضل تجربة استخدام.
</p>

<p>
	ترجمة -وبتصرف- لمقال: <a href="https://docs.godotengine.org/en/stable/getting_started/introduction/godot_design_philosophy.html" rel="external nofollow">Godot's design philosophy</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-%D9%88%D8%B7%D8%B1%D8%AD-%D8%A7%D9%84%D8%A3%D8%B3%D8%A6%D9%84%D8%A9-%D8%AD%D9%88%D9%84%D9%87-r2267/" rel="">تعلم الميزات الجديدة في محرك الألعاب جودو وطرح الأسئلة حوله</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sqlite-r2241/" rel="">إعداد محرك الألعاب جودو Godot للعمل مع قاعدة البيانات SQLite</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">تعرف على أهمية صناعة الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">أشهر أنواع الألعاب الإلكترونية</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2278</guid><pubDate>Fri, 15 Mar 2024 12:05:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x645;&#x64A;&#x632;&#x627;&#x62A; &#x627;&#x644;&#x62C;&#x62F;&#x64A;&#x62F;&#x629; &#x641;&#x64A; &#x645;&#x62D;&#x631;&#x643; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x62C;&#x648;&#x62F;&#x648; &#x648;&#x637;&#x631;&#x62D; &#x627;&#x644;&#x623;&#x633;&#x626;&#x644;&#x629; &#x62D;&#x648;&#x644;&#x647;</title><link>https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-%D9%88%D8%B7%D8%B1%D8%AD-%D8%A7%D9%84%D8%A3%D8%B3%D8%A6%D9%84%D8%A9-%D8%AD%D9%88%D9%84%D9%87-r2267/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/1348058783_.png.627de0e174b9b8e34320fafae824a6cf.png" /></p>
<p>
	يُعد جودو محرّك ألعاب غني بالميزات، وهنالك الكثير لتتعلمه. لهذا سنشرح في هذا المقال كيفية استخدام دليل العمل على اﻹنترنت، والمراجع إلى الشيفرة والانضمام إلى مجتمع جودو لتعلم ميزات وتقنيات جديدة.
</p>

<h2 id="-1">
	الاستفادة القصوى من هذا المقال
</h2>

<p>
	ما سنوضحه في هذا المقال هو طريقة التعامل دليل الاستخدام "user manual" الخاص بمحرك ألعاب جودو والذي يوثّق جميع مفاهيم محرّك الألعاب وميزاته المتاحة. فعندما تتعلم موضوعًا جديدًا، يمكنك البدء في تصفح القسم المخصص لهذا الموضوع في دليل المستخدم هذا. إذ تتيح لك القائمة اليمينية استكشاف مواضيع عامة عن محرك الألعاب، بينما يساعدك شريط البحث على إيجاد صفحات محددة. فإن وجدت صفحة خاصة بالموضوع ستكون مرتبطة غالبًا بصفحات أخرى متعلقة به
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="145890" href="https://academy.hsoub.com/uploads/monthly_2024_03/01_manual_search.png.ef9649acede84d0d0a09f5592f27bb38.png" rel=""><img alt="01 manual search" class="ipsImage ipsImage_thumbnailed" data-fileid="145890" data-unique="6mhxrasek" src="https://academy.hsoub.com/uploads/monthly_2024_03/01_manual_search.png.ef9649acede84d0d0a09f5592f27bb38.png"> </a>
</p>

<p>
	يترافق هذا الدليل مع مراجع للأصناف "class reference" تشرح لك كل صنف أو دالة أو خاصية متاحة في جودو. فبينما يتحدث الدليل عن الميزات العامة والمفاهيم وكيفية استخدام المحرر، يتحدث مرجع اﻷصناف عن طريقة استخدام الواجهة البرمجية المستخدمة في كتابة سكربتات جودو Godot. وبإمكانك الوصول إلى معلومات هذا المرجع عبر اﻹنترنت أو محليًا.
</p>

<p>
	فكي تتمكن من تصفحها محليًا عبر محرر جودو كل ما عليك هو بالانتقال إلى "مساعدة Help" &gt; "البحث في المساعدة Search Help" أو بالضغط على المفتاح F1:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="145891" href="https://academy.hsoub.com/uploads/monthly_2024_03/02_manual_class_reference_search-2.png.981b67fbad7466fd36d01ca754419fcc.png" rel=""><img alt="02 manual class reference search 2" class="ipsImage ipsImage_thumbnailed" data-fileid="145891" data-unique="70rklza1w" src="https://academy.hsoub.com/uploads/monthly_2024_03/02_manual_class_reference_search-2.png.981b67fbad7466fd36d01ca754419fcc.png"> </a>
</p>

<p>
	أما إن أردت البحث عن طريق اﻹنترنت انتقل إلى قسم <a href="https://docs.godotengine.org/en/stable/classes/index.html#doc-class-reference" rel="external nofollow">مرجع اﻷصناف</a>، وستدلك صفحة المرجع على ما يلي:
</p>

<ol>
	<li>
		أين هو موقع الصنف في التسلسل الهرمي، إذ يمكنك النقر على الروابط العليا للانتقال إلى الأصناف اﻵباء والاطلاع على الخاصيات والتوابع الموروثة.
	</li>
	<li>
		ملخص عن وظيفة الصنف وتوضيح حالات استخدامه.
	</li>
	<li>
		شرح خاصيات الصنف وتوابعه و إشاراته و معداته وثوابته.
	</li>
	<li>
		الربط مع صفحات الدليل التي تشرح الصنف أكثر.
	</li>
</ol>

<p>
	<strong>ملاحظة</strong>: إن كان دليل المستخدم أو مرجع الأصناف مفقودًا أو لم يحو على معلومات كافية، يمكنك فتح طلب من <a href="https://github.com/godotengine/godot-docs/issues" rel="external nofollow">مستودع توثيق جودو</a> على جيت هب للإبلاغ عن اﻷمر.
</p>

<p>
	بإمكانك النقر مع الضغط على المفتاح Ctrl على أية رابط نصي يمثل اسم صنف أو خاصية أو تابع أو إشارة أو ثابت للانتقال إليه.
</p>

<h2 id="-2">
	تعلم التفكير مثل المبرمجين
</h2>

<p>
	إن موضوع تعلم <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">أساسيات البرمجة</a> وطريقة تفكير <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطوري اﻷلعاب</a> خارج سياق توثيق جودو لكنه أمر أساسي لك إن اردت أن تصبح مطور ألعاب . لذا إن كنت جديدًا في عالم البرمجة وكنت مهتمًا بتخصص برمجة وصناعة الألعاب الإلكترونية فننصحك بأن تُلمَّ قبل ذلك بأياسيات البرمجة قبل البدء، ويمكنك الاعتماد على أحد المصدرين التاليين:
</p>

<ol>
	<li>
		<a href="https://academy.hsoub.com/" rel="">أكاديمية حسوب</a> التي تقدم لك كمًا كبيرًا من المقالات المتخصصة بتعلم مختلف لغات البرمجة إضافة إلى <a href="https://academy.hsoub.com/#courses" rel="">دورات تدريبية عملية</a> تبدأ بك من الصفر وحتى الاحتراف صممها وقدمها مبرمجون محترفون على دراية كاملة بمتطلباتك وتطلعاتك.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/" rel="external">موسوعة حسوب</a> التي تعد أكبر مرجع باللغة العربية لتوثيق أشهر لغات البرمجة ومن بينها Python و JavaScript  والعديد من اللغات والتقنيات الأخرى.
	</li>
</ol>

<h2 id="-3">
	التعلّم من خلال مجتمع جودو
</h2>

<p>
	يتميز محرّك جودو بمجتمع يتطور ويزداد تعداده باستمرار. فإن واجهتك مشكلة ما وأردت المساعدة في فهم طريقة عمل شيء ما، بإمكانك سؤال مستخدمين آخرين ينتمون إلى أي من <a href="https://godotengine.org/community" rel="external nofollow">مجتمعات جودو النشطة</a>.
</p>

<p>
	وأفضل مكان لطرح اﻷسئلة وإيجاد حلول لاسئلة طرحت مسبقًا هو <span ipsnoautolink="true">الموقع الرسمي للأسئلة واﻷجوبة <a href="https://ask.godotengine.org/" rel="external nofollow">ask.godotengine</a></span><span style="display: none;"> </span><span style="display: none;">   </span>. إذ تظهر الإجابات في نتائج محرّك البحث وتُخزّن ليستفيد اﻵخرون من النقاشات التي تدور في المنصة.
</p>

<p>
	وبمجرد أن تطرح سؤالًا، بإمكانك أن تستخدم رابطه لمشاركته في منصات أخرى. لكن قبل أن تطرح سؤالًا، تأكد من وجود أجوبة مسبقة عنه في هذه المنصة أو ابحث عنها باستخدام محرّك البحث الذي تفضلّه.
</p>

<h3>
	الطريقة الصحيحة لطرح الأسئلة حول محرك جودو
</h3>

<p>
	إن طرحك للسؤال بشكل جيد وتقديم تفاصيل دقيقة يساعد اﻵخرين في اﻹجابة عن سؤالك بسرعة. وننصحك عند طرح السؤال أن يتضمن المعلومات التالية:
</p>

<ol>
	<li>
		<p>
			<strong>وصف الغاية من السؤال</strong>: يجب أن تشرح ما الذي تحاول فعله من وجهة نظر تصميمية. فإن لم تتمكن من تصور طريقة لتطبيق الحل، قد تكون هناك حلول أخرى أبسط لتحقيق نفس الغاية.
		</p>
	</li>
	<li>
		<p>
			<strong>مشاركة رسالة الخطأ كما هي تمامًا</strong>: إن كان هناك خطأ. انسخ رسالة الخطأ بدقة من المنقح بالنقر على أيقونة "انسخ الخطأ Copy Error". فمعرفة رسالة الخطأ تساعد أعضاء المجتمع في تحديد السبب الذي أدى لوقوع المشكلة.
		</p>
	</li>
	<li>
		<p>
			<strong>مشاركة عينة من الشيفرة</strong>: إن كان الخطأ في الشيفرة. فلن يتمكن اﻵخرون من مساعدتك في حل المشكلة دون رؤية الشيفرة. لذا شارك الشيفرة على شكل نص مباشرة بنسخ ولصق جزء من الشيفرة في رسالتك أو استخدام مواقع مثل <a href="https://pastebin.com/" rel="external nofollow">Pastebin</a> لمشاركة الملفات الطويلة.
		</p>
	</li>
	<li>
		<p>
			<strong>مشاركة لقطة شاشة</strong>: لحاوية المشهد في المحرر إضافة إلى شيفرتك. فالشيفرة التي تكتبها تؤثر على عقد عقد المشاهد. إذًا عليك التفكير بالمشاهد كجزء من شيفرتك المصدرية.
		</p>

		<p>
			كذلك لا تستخدم هاتف محمول لالتقاط الصور، فالدقة المنخفضة والانعكاسات قد تُصعّب فهم الصورة. لهذا استخدم الأداة التي يوفّرها نظام التشغيل لديك لالتقاط صورة للشاشة (مثل الزر Print Screen). كما يمكنك استخدام <a href="https://getsharex.com/" rel="external nofollow">ShareX</a> في ويندوز مثلًا أو <a href="https://flameshot.org/" rel="external nofollow">FlameShot</a> في لينكس.
		</p>
	</li>
	<li>
		<p>
			<strong>مشاركة فيديو للعبتك وهي تعمل</strong>: أمر مفيد جدّا. يمكنك استخدام برامج مثل <a href="https://obsproject.com/" rel="external nofollow">OBS Studio</a> أو <a href="https://www.screentogif.com/" rel="external nofollow">Screen to GIF</a> لالتقاط فيديو لسطح مكتبك، ثم استخدام خدمات مثل <a href="https://streamable.com/" rel="external nofollow">streamable</a> أو مزوّد سحابي لرفع ومشاركة الفيديو.
		</p>
	</li>
	<li>
		<p>
			<strong>اﻹشارة إلى نسخة جودو التي تستخدمها</strong>: وخاصة إن لم تكن النسخة مستقرة stable version. لأن الجواب قد يختلف نتيجة لتغير الميزات والواجهة باستمرار.
		</p>
	</li>
</ol>

<p>
	باتباعك اﻹرشادات السابقة ستزيد فرص حصولك على الجواب الدقيق الذي تبحث عنه، وسيوفر وقتك ووقت اﻷشخاص الذين يساعدونك في حل مشكلتك.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="487" id="ips_uid_8859_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="تصميم الألعاب وبرمجة الألعاب" width="866" data-embed-src="https://www.youtube.com/embed/NwMtWKGrH8U"></iframe>
</p>

<h2 id="-4">
	مصادر تعليمية حول محرك الألعاب جودو
</h2>

<p>
	إن كنت تبحث عن دورات حول إنشاء نوع لعبة إلكترونية مثل خطوات إنشاء لعبة تقمص الأدوار "Role-Playing Games" أو غيرها من <a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">أنواع الألعاب الإلكترونية</a>، ننصحك بالاطلاع على قسم المصادر والدورات التعليمية <a href="https://docs.godotengine.org/en/stable/community/tutorials.html#doc-community-tutorials" rel="external nofollow">Tutorials and resources</a> الذي يعرض محتوى متخصصًا يقدمه مجتمع جودو.
</p>

<p>
	وإذا كنت مهتمًا بمعرفة المزيد من التفاصيل عن محرك ألعاب جودو <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">Godot </a>أو لغة برمجة الألعاب GDScript وطريقة تطوير الألعاب ثنائية الأبعاد وثنائية الأبعاد باللغة العربية، فننصحك بالاطلاع على سلسلة المقالات المنشورة في أكاديمية حسوب تحت وسم <a href="https://academy.hsoub.com/tags/godot/" rel="">godot</a>، كما يمكنك الاطلاع على العديد من المقالات المفيدة في قسم مقالات <a href="https://academy.hsoub.com/programming/game-development/" rel="">صناعة الألعاب</a> الذي ينشر بصورة دورية العديد من المقالات التي تفيدك كمطور ألعاب. ويمكنك كذلك طرح أي سؤال أو مشكلة تعترضك خلال برمجة لعبتك الخاصة في <a href="https://academy.hsoub.com/questions/" rel="">قسم الأسئلة والأجوبة</a>  في الأكاديمية أو في <a href="https://io.hsoub.com/" rel="external">مجتمع حسوب IO</a>.
</p>

<h2 id="-5">
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على طريقة الاستفادة من الميزات الجديدة التي يوفرها لك محرك الألعاب جودو Godot وأهمية التفكير البرمجي لك كمطور ألعاب وكيفية طرح سؤال حول أي مشكلة تقنية تصادفك خلال صناعة لعبتك بطريقة صحيحة وحلها بسرعة وكفاءة، وأخيرًا ختمنا المقال بمصادر تعليمية مفيدة حول Godot وتطوير الألعاب.
</p>

<p>
	ترجمة -وبتصرف- لمقال: <a href="https://docs.godotengine.org/en/stable/getting_started/introduction/learning_new_features.html" rel="external nofollow">Learning new features</a> من توثيق جودو الرسمي
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D9%86%D8%A7%D8%A1-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7-%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%B4%D8%A7%D8%B4%D8%A7%D8%AA-%D8%A7%D9%84%D9%84%D9%85%D8%B3-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%91%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-r2255/" rel="">دليلك الشامل إلى بناء كاميرا خاصة بشاشات اللمس في محرّك اﻷلعاب جودو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2183/" rel="">تعرف على محرر محرك اﻷلعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sqlite-r2241/" rel="">إعداد محرك الألعاب جودو Godot للعمل مع قاعدة البيانات SQLite</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-%D8%B9%D9%84%D9%89-%D8%A8%D8%B9%D8%B6-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%B9%D8%AA%D8%A7%D8%AF-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AF%D8%B9%D9%88%D9%85-r2235/" rel="">تشغيل محرك الألعاب جودو على بعض أنواع العتاد غير المدعوم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">تعرف على أشهر لغات برمجة الألعاب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2267</guid><pubDate>Thu, 07 Mar 2024 12:02:00 +0000</pubDate></item><item><title>&#x62F;&#x644;&#x64A;&#x644;&#x643; &#x627;&#x644;&#x634;&#x627;&#x645;&#x644; &#x625;&#x644;&#x649; &#x628;&#x646;&#x627;&#x621; &#x643;&#x627;&#x645;&#x64A;&#x631;&#x627; &#x62E;&#x627;&#x635;&#x629; &#x628;&#x634;&#x627;&#x634;&#x627;&#x62A; &#x627;&#x644;&#x644;&#x645;&#x633; &#x641;&#x64A; &#x645;&#x62D;&#x631;&#x651;&#x643; &#x627;&#xFEF7;&#x644;&#x639;&#x627;&#x628; &#x62C;&#x648;&#x62F;&#x648;</title><link>https://academy.hsoub.com/programming/game-development/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D9%86%D8%A7%D8%A1-%D9%83%D8%A7%D9%85%D9%8A%D8%B1%D8%A7-%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%B4%D8%A7%D8%B4%D8%A7%D8%AA-%D8%A7%D9%84%D9%84%D9%85%D8%B3-%D9%81%D9%8A-%D9%85%D8%AD%D8%B1%D9%91%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-r2255/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_02/-----------.png.97ce3aa27c6691e0a10497e5bd932b94.png" /></p>
<p>
	سنعمل في هذا المقال على بناء كاميرا لشاشة لمس في محرك الألعاب جودو كي يتمكن اللاعب من تحريك الكاميرا حول محورها وتكبير وتصغير وتدوير الكاميرا عن طريق اللمس.
</p>

<h2 id="">
	تهيئة الكاميرا ثنائية البعد
</h2>

<p>
	افتح <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2183/" rel="">محرك الألعاب جودو </a>وأنشئ مشروعك الأول، وابدأ بعقدة من النوع <a href="https://docs.godotengine.org/en/stable/classes/class_camera2d.html" rel="external nofollow"><code>CameraD2</code></a>، ولجعلها حساسة للمس، سنضيف سكريبت يدير العملية، وذلك بالنقر عليها بالزر الأيمن للفأرة ثم اختيار "إلحاق نص برمجي attach script" ولنسمّه "TouchCameraController.gd".
</p>

<p>
	<strong>ملاحظة</strong> أضفنا أيقونة إلى المشهد لكي نرى الكائن الذي يتحرك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144579" href="https://academy.hsoub.com/uploads/monthly_2024_02/01_adding_camer.png.91d25aea20128245d6cea40fe9b097e3.png" rel=""><img alt="01 adding camer" class="ipsImage ipsImage_thumbnailed" data-fileid="144579" data-unique="dozq4dry5" src="https://academy.hsoub.com/uploads/monthly_2024_02/01_adding_camer.png.91d25aea20128245d6cea40fe9b097e3.png"> </a>
</p>

<h2 id="-1">
	إعداد الكاميرا
</h2>

<p>
	نحتاج بداية إلى مجموعة من المتغيرات للتحكم بالكاميرا التي تمثلها في جودو العقدة <code>Camera2D</code>. تمثل هذه المتغيرات سرعة الحركة المحورية وسرعة التكبير والتصغير، وسرعة الدوران، وأخرى للتحكم في إمكانية التحريك أو التكبير أو التدوير. وإضافة إلى ذلك، ننشئ متغيرات لتخزين حالة الكاميرا ومدخلات اللمس. إليك طريقة تعريف المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_6" style=""><span class="pln">extends </span><span class="typ">Camera2D</span><span class="pln">

</span><span class="lit">@export</span><span class="pln"> var zoom_speed</span><span class="pun">:</span><span class="pln"> float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln">
</span><span class="lit">@export</span><span class="pln"> var pan_speed</span><span class="pun">:</span><span class="pln"> float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.0</span><span class="pln">
</span><span class="lit">@export</span><span class="pln"> var rotation_speed</span><span class="pun">:</span><span class="pln"> float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.0</span><span class="pln">
</span><span class="lit">@export</span><span class="pln"> var can_pan</span><span class="pun">:</span><span class="pln"> bool
</span><span class="lit">@export</span><span class="pln"> var can_zoom</span><span class="pun">:</span><span class="pln"> bool
</span><span class="lit">@export</span><span class="pln"> var can_rotate</span><span class="pun">:</span><span class="pln"> bool

var start_zoom</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pln">
var start_dist</span><span class="pun">:</span><span class="pln"> float
var touch_points</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
var start_angle</span><span class="pun">:</span><span class="pln"> float
var current_angle</span><span class="pun">:</span><span class="pln"> float</span></pre>

<p>
	قمنا في البداية بتوسيع الصنف Camera2D في Godot الذي يمثل كاميرا ثنائية الأبعاد 2D في جودو ثم حددنا مجموعة المتغيرات التي يمكن تعديلها وهي:
</p>

<ul>
	<li>
		<code>zoom_speed</code>: قيمة عددية تحدد سرعة عملية التكبير والتصغير للكاميرا.
	</li>
	<li>
		<code>pan_speed</code>: قيمة عددية تحدد سرعة عملية التحريك الجانبي للكاميرا.
	</li>
	<li>
		<code>rotation_speed</code>: قيمة عددية تحدد سرعة عملية تدوير الكاميرا.
	</li>
	<li>
		<code>can_pan</code>: قيمة بوليانية تحدد إمكانية التحريك الجانبي للكاميرا.
	</li>
	<li>
		<code>can_zoom</code>: قيمة بوليانية تحدد إمكانية التكبير أو التصغير للكاميرا.
	</li>
	<li>
		<code>can_rotate</code>: قيمة بوليانية تحدد إمكانية تدوير الكاميرا.
	</li>
</ul>

<p>
	ثم عرفنا المتغيرات التي ستخزن معلومات عن اللمس وهي:
</p>

<ul>
	<li>
		<code>start_zoom</code> لتخزين قيمة بداية عملية التكبير أو التصغير الحالي للكاميرا.
	</li>
	<li>
		<code>start_dist</code> لتخزين المسافة بين نقاط اللمس عند بداية التكبير أو التصغير.
	</li>
	<li>
		<code>touch_points</code> لتخزين مواقع نقاط اللمس على الشاشة لاستخدامها في حسابات التكبير والتدوير.
	</li>
	<li>
		<code>start_angle</code> لتخزين زاوية بداية التدوير لحساب الزاوية المطلوبة للتدوير.
	</li>
	<li>
		<code>current_angle</code> لتخزين الزاوية الحالية لعملية التدوير لتحديث تدوير العنصر المرئي بشكل مستمر.
	</li>
</ul>

<h2 id="-2">
	تحريك الكاميرا حول محورها
</h2>

<p>
	لنبدأ اﻵن بتحريك الكاميرا حول محورها، وهي الحركة اﻷبسط التي تنفذها الكاميرا في المشهد. سنحتاج إلى وسيلة لترصّد بعض أحداث الدخل، لهذا سنتجاوز override الدالة <code>(input(event_</code> للتحقق من أحداث اللمس touch والسحب drag على الشاشة والاستجابة لها بالشكل المناسب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_8" style=""><span class="pln">func _input</span><span class="pun">(</span><span class="pln">event</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> event </span><span class="kwd">is</span><span class="pln"> </span><span class="typ">InputEventScreenTouch</span><span class="pun">:</span><span class="pln">
        _handle_touch</span><span class="pun">(</span><span class="pln">event</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">elif</span><span class="pln"> event </span><span class="kwd">is</span><span class="pln"> </span><span class="typ">InputEventScreenDrag</span><span class="pun">:</span><span class="pln">
        _handle_drag</span><span class="pun">(</span><span class="pln">event</span><span class="pun">)</span></pre>

<p>
	تخزّن الدالة <code>(handle_touch(event_</code> موقع كل نقطة لُمست على الشاشة ضمن القاموس <code>touch_points</code> وتستخدم دليل اللمس touch index كمفتاح، وهذا أساسي لتتبع المواقع التي تُلمس على الشاشة. كما سنضبط قيمة المتغير <code>start_dist</code> على <code>0</code> إن كان عدد النقاط التي لُمست أقل من 2:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_10" style=""><span class="pln">func _handle_touch</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenTouch</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">pressed</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">.</span><span class="pln">erase</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        start_dist </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	بإمكاننا تحريك الكاميرا حول محورها بالاستفادة من نقطة لمس واحدة، وذلك باستخدام الدالة <code>(handle_drag(event_</code> المعرفة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_12" style=""><span class="pln">func _handle_drag</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenDrag</span><span class="pun">):</span><span class="pln">
    touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position

    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> can_pan</span><span class="pun">:</span><span class="pln">
        offset </span><span class="pun">-=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">relative </span><span class="pun">*</span><span class="pln"> pan_speed</span></pre>

<p>
	إن شغّلت اللعبة على محاكي أندرويد سترى كيف تتحرك الكاميرا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="144580" href="https://academy.hsoub.com/uploads/monthly_2024_02/02_pan_camera.gif.4514c58078549db18a05e7cae76b9fc8.gif" rel=""><img alt="02 pan camera" class="ipsImage ipsImage_thumbnailed" data-fileid="144580" data-unique="z4mdkldza" src="https://academy.hsoub.com/uploads/monthly_2024_02/02_pan_camera.gif.4514c58078549db18a05e7cae76b9fc8.gif"> </a>
</p>

<h2 id="-3">
	إضافة ميزة التكبير والتصغير
</h2>

<p>
	سنضيف اﻵن إمكانية التكبير والتصغير (تقريب وإبعاد)، لهذا سنعدّل الدالة <code>(handle_touch(event_</code> كي نعالج حالة وجود نقطتي لمس والتي سنحسب فيها المسافة اﻷولية بينهما ونخزّنها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_14" style=""><span class="pln">func _handle_touch</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenTouch</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">pressed</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">.</span><span class="pln">erase</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        var touch_point_positions </span><span class="pun">=</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">values</span><span class="pun">()</span><span class="pln">
        start_dist </span><span class="pun">=</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">distance_to</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
        start_zoom </span><span class="pun">=</span><span class="pln"> zoom
        start_dist </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	نضيف بعد ذلك إمكانية التحكم بالتكبير والتصغير إلى الدالة <code>handle_drag(event)_</code>، فعند وجود نقطتي لمس، نحسب المسافة الحالية بينهما وبناء عليها نضبط التكبير والتصغير:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_16" style=""><span class="pln">func _handle_drag</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenDrag</span><span class="pun">):</span><span class="pln">
    touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position
    </span><span class="com"># Handle 1 touch point</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> can_pan</span><span class="pun">:</span><span class="pln">
        offset </span><span class="pun">-=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">relative </span><span class="pun">*</span><span class="pln"> pan_speed   </span><span class="com"># Handle 2 touch points    elif touch_points.size() == 2 and can_zoom:</span><span class="pln">
        var touch_point_positions </span><span class="pun">=</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">values</span><span class="pun">()</span><span class="pln">
        var current_dist </span><span class="pun">=</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">distance_to</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">

        var zoom_factor </span><span class="pun">=</span><span class="pln"> start_dist </span><span class="pun">/</span><span class="pln"> current_dist
        zoom </span><span class="pun">=</span><span class="pln"> start_zoom </span><span class="pun">/</span><span class="pln"> zoom_factor

        limit_zoom</span><span class="pun">(</span><span class="pln">zoom</span><span class="pun">)</span><span class="pln"> </span><span class="com"># This is about to be created!</span></pre>

<p>
	نستخدم الدالة <code>(limit_zoom(zoom</code> لمنع التكبير أو التصغير من تجاوز الحدود وسيقف التكبير أو التصغير عند حد معين:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_18" style=""><span class="pln">func limit_zoom</span><span class="pun">(</span><span class="pln">new_zoom</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span></pre>

<p>
	انقر على زر التشغيل لترى النتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="144581" href="https://academy.hsoub.com/uploads/monthly_2024_02/03_zoom_camera.gif.c7f82c6ed56c871a4001264bd2fa3dcd.gif" rel=""><img alt="03 zoom camera" class="ipsImage ipsImage_thumbnailed" data-fileid="144581" data-unique="3g8rq35cw" src="https://academy.hsoub.com/uploads/monthly_2024_02/03_zoom_camera.gif.c7f82c6ed56c871a4001264bd2fa3dcd.gif"> </a>
</p>

<h2 id="-4">
	إضافة الدوران
</h2>

<p>
	لنضف أخيرًا إمكانية تدوير الكاميرا، لهذا سنقيس الزاوية الأولية بين نقطتي اللمس من خلال الدالة <code>handle_touch(event)_</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_20" style=""><span class="pln">func _handle_touch</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenTouch</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">pressed</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">.</span><span class="pln">erase</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        var touch_point_positions </span><span class="pun">=</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">values</span><span class="pun">()</span><span class="pln">
        start_dist </span><span class="pun">=</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">distance_to</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">     start_angle </span><span class="pun">=</span><span class="pln"> get_angle</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
        start_zoom </span><span class="pun">=</span><span class="pln"> zoom
    </span><span class="kwd">elif</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        start_dist </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	نضيف بعد ذلك إمكانية التحكم بالدوران ضمن الدالة <code>handle_drag(event)_</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_22" style=""><span class="pln">func _handle_drag</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenDrag</span><span class="pun">):</span><span class="pln">
    touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position

    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> can_pan</span><span class="pun">:</span><span class="pln">
            offset </span><span class="pun">-=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">relative </span><span class="pun">*</span><span class="pln"> pan_speed
    </span><span class="kwd">elif</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        var touch_point_positions </span><span class="pun">=</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">values</span><span class="pun">()</span><span class="pln">
        var current_dist </span><span class="pun">=</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">distance_to</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
        var current_angle </span><span class="pun">=</span><span class="pln"> get_angle</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln"> </span><span class="com">#this will be created below</span><span class="pln">

        var zoom_factor </span><span class="pun">=</span><span class="pln"> start_dist </span><span class="pun">/</span><span class="pln"> current_dist
        </span><span class="kwd">if</span><span class="pln"> can_zoom</span><span class="pun">:</span><span class="pln">
            zoom </span><span class="pun">=</span><span class="pln"> start_zoom </span><span class="pun">/</span><span class="pln"> zoom_factor
        </span><span class="kwd">if</span><span class="pln"> can_rotate</span><span class="pun">:</span><span class="pln">
            rotation </span><span class="pun">-=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">current_angle </span><span class="pun">-</span><span class="pln"> start_angle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> rotation_speed
            start_angle </span><span class="pun">=</span><span class="pln"> current_angle </span><span class="com"># حدث الزاوية اﻷولية إلى الزاوية الحالية</span><span class="pln">

        limit_zoom</span><span class="pun">(</span><span class="pln">zoom</span><span class="pun">)</span></pre>

<p>
	تٌستخدم الدالة <code>(get_angle(p1, p2</code> لحساب الزاوية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_24" style=""><span class="pln">func get_angle</span><span class="pun">(</span><span class="pln">p1</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">,</span><span class="pln"> p2</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-&gt;</span><span class="pln"> float</span><span class="pun">:</span><span class="pln">
    var delta </span><span class="pun">=</span><span class="pln"> p2 </span><span class="pun">-</span><span class="pln"> p1
    </span><span class="kwd">return</span><span class="pln"> fmod</span><span class="pun">((</span><span class="pln">atan2</span><span class="pun">(</span><span class="pln">delta</span><span class="pun">.</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> delta</span><span class="pun">.</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> PI</span><span class="pun">),</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> PI</span><span class="pun">))</span></pre>

<p>
	جرّب تدوير اﻷيقونة اﻵن!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="144582" href="https://academy.hsoub.com/uploads/monthly_2024_02/04_rotate_camera.gif.5f62dd2d3072db1d7ad8369a290ac84a.gif" rel=""><img alt="04 rotate camera" class="ipsImage ipsImage_thumbnailed" data-fileid="144582" data-unique="2lksfr49e" src="https://academy.hsoub.com/uploads/monthly_2024_02/04_rotate_camera.gif.5f62dd2d3072db1d7ad8369a290ac84a.gif"> </a>
</p>

<h2 id="-5">
	السكريبت المكتمل
</h2>

<p>
	إليك الشيفرة الكاملة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9842_26" style=""><span class="pln">extends </span><span class="typ">Camera2D</span><span class="pln">

</span><span class="lit">@export</span><span class="pln"> var zoom_speed</span><span class="pun">:</span><span class="pln"> float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln">
</span><span class="lit">@export</span><span class="pln"> var pan_speed</span><span class="pun">:</span><span class="pln"> float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.0</span><span class="pln">
</span><span class="lit">@export</span><span class="pln"> var rotation_speed</span><span class="pun">:</span><span class="pln"> float </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1.0</span><span class="pln">
</span><span class="lit">@export</span><span class="pln"> var can_pan</span><span class="pun">:</span><span class="pln"> bool
</span><span class="lit">@export</span><span class="pln"> var can_zoom</span><span class="pun">:</span><span class="pln"> bool
</span><span class="lit">@export</span><span class="pln"> var can_rotate</span><span class="pun">:</span><span class="pln"> bool

var start_zoom</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pln">
var start_dist</span><span class="pun">:</span><span class="pln"> float
var touch_points</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
var start_angle</span><span class="pun">:</span><span class="pln"> float
var current_angle</span><span class="pun">:</span><span class="pln"> float

func _ready</span><span class="pun">():</span><span class="pln">
    start_zoom </span><span class="pun">=</span><span class="pln"> zoom

func _input</span><span class="pun">(</span><span class="pln">event</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> event </span><span class="kwd">is</span><span class="pln"> </span><span class="typ">InputEventScreenTouch</span><span class="pun">:</span><span class="pln">
            _handle_touch</span><span class="pun">(</span><span class="pln">event</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">elif</span><span class="pln"> event </span><span class="kwd">is</span><span class="pln"> </span><span class="typ">InputEventScreenDrag</span><span class="pun">:</span><span class="pln">
            _handle_drag</span><span class="pun">(</span><span class="pln">event</span><span class="pun">)</span><span class="pln">

func _handle_touch</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenTouch</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">pressed</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        touch_points</span><span class="pun">.</span><span class="pln">erase</span><span class="pun">(</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        var touch_point_positions </span><span class="pun">=</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">values</span><span class="pun">()</span><span class="pln">
        start_dist </span><span class="pun">=</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">distance_to</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
        start_angle </span><span class="pun">=</span><span class="pln"> get_angle</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
        start_zoom </span><span class="pun">=</span><span class="pln"> zoom
    </span><span class="kwd">elif</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        start_dist </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

func _handle_drag</span><span class="pun">(</span><span class="pln">event</span><span class="pun">:</span><span class="pln"> </span><span class="typ">InputEventScreenDrag</span><span class="pun">):</span><span class="pln">
    touch_points</span><span class="pun">[</span><span class="pln">event</span><span class="pun">.</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">position

    </span><span class="kwd">if</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> can_pan</span><span class="pun">:</span><span class="pln">
            offset </span><span class="pun">-=</span><span class="pln"> event</span><span class="pun">.</span><span class="pln">relative </span><span class="pun">*</span><span class="pln"> pan_speed
    </span><span class="kwd">elif</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
        var touch_point_positions </span><span class="pun">=</span><span class="pln"> touch_points</span><span class="pun">.</span><span class="pln">values</span><span class="pun">()</span><span class="pln">
        var current_dist </span><span class="pun">=</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">distance_to</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">
        var current_angle </span><span class="pun">=</span><span class="pln"> get_angle</span><span class="pun">(</span><span class="pln">touch_point_positions</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> touch_point_positions</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">

        var zoom_factor </span><span class="pun">=</span><span class="pln"> start_dist </span><span class="pun">/</span><span class="pln"> current_dist
        </span><span class="kwd">if</span><span class="pln"> can_zoom</span><span class="pun">:</span><span class="pln">
            zoom </span><span class="pun">=</span><span class="pln"> start_zoom </span><span class="pun">/</span><span class="pln"> zoom_factor
        </span><span class="kwd">if</span><span class="pln"> can_rotate</span><span class="pun">:</span><span class="pln">
            rotation </span><span class="pun">-=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">current_angle </span><span class="pun">-</span><span class="pln"> start_angle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> rotation_speed
            start_angle </span><span class="pun">=</span><span class="pln"> current_angle </span><span class="com"># Update the start_angle to the current_angle for the next drag event</span><span class="pln">

        limit_zoom</span><span class="pun">(</span><span class="pln">zoom</span><span class="pun">)</span><span class="pln">

func limit_zoom</span><span class="pun">(</span><span class="pln">new_zoom</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.1</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> new_zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="pln">
        zoom</span><span class="pun">.</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pln">

func get_angle</span><span class="pun">(</span><span class="pln">p1</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">,</span><span class="pln"> p2</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Vector2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-&gt;</span><span class="pln"> float</span><span class="pun">:</span><span class="pln">
    var delta </span><span class="pun">=</span><span class="pln"> p2 </span><span class="pun">-</span><span class="pln"> p1
    </span><span class="kwd">return</span><span class="pln"> fmod</span><span class="pun">((</span><span class="pln">atan2</span><span class="pun">(</span><span class="pln">delta</span><span class="pun">.</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> delta</span><span class="pun">.</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> PI</span><span class="pun">),</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> PI</span><span class="pun">))</span></pre>

<h2 id="-6">
	الخلاصة
</h2>

<p>
	صممنا في هذا المقال سكريبت كاميرا تتجاوب مع أفعال اللمس على الشاشة في محرك الألعاب جودو 4، ويمكنها التحرك حول محورها أو التكبير والتصغير أو الدوران. انتبه فقط إلى ضرورة ربط السكريبت بعقدة من النوع <code>Camera2D</code> واستمتع بعملك!
</p>

<p>
	ترجمة -وبتصرف- لمقال <a href="https://finepointcgi.io/2023/06/16/building-a-touchscreen-camera-in-godot-4-a-comprehensive-guide/" rel="external nofollow">Building a touchscreen camera in Godot 4: A comprehensive guide</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-%D8%B9%D9%84%D9%89-%D8%A8%D8%B9%D8%B6-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%B9%D8%AA%D8%A7%D8%AF-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AF%D8%B9%D9%88%D9%85-r2235/" rel="">تشغيل محرك الألعاب جودو على بعض أنواع العتاد غير المدعوم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">تعرف على أشهر محركات الألعاب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">تعرف على أشهر لغات برمجة الألعاب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2255</guid><pubDate>Thu, 22 Feb 2024 00:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x635;&#x62F;&#x651;&#x631; &#x623;&#x635;&#x648;&#x644; &#x627;&#x644;&#x644;&#x639;&#x628;&#x629; &#x645;&#x646; &#x628;&#x644;&#x64A;&#x646;&#x62F;&#x631; Blender &#x625;&#x644;&#x649; &#x645;&#x62D;&#x631;&#x651;&#x643; &#x627;&#xFEF7;&#x644;&#x639;&#x627;&#x628; Godot &#x628;&#x641;&#x639;&#x627;&#x644;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/game-development/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D8%AF%D9%91%D8%B1-%D8%A3%D8%B5%D9%88%D9%84-%D8%A7%D9%84%D9%84%D8%B9%D8%A8%D8%A9-%D9%85%D9%86-%D8%A8%D9%84%D9%8A%D9%86%D8%AF%D8%B1-blender-%D8%A5%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D9%91%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-godot-%D8%A8%D9%81%D8%B9%D8%A7%D9%84%D9%8A%D8%A9-r2250/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_02/BlenderGodot.png.4b9a08388549d5cc8113e5a3b8021566.png" /></p>
<p>
	نتحدث في مقالنا عن أمثل الطرق ﻹعداد وتصدير الأصول أو الموجودات assets من بليندر Blender إلى محرّك اﻷلعاب جودو Godot، ونغطي خلاله العمل مع الخامات texture والتعامل مع قنوات لونية مختلفة، وبعض الإعدادات الشائعة لملفات المشاهد ثلاثية اﻷلعاب gLTF، ثم نتحدث عن فعالية استخدام هذه التنسيق.
</p>

<h2 id="texture">
	إعداد الخامة Texture
</h2>

<p>
	عليك بداية إعداد الخامة texture، لهذا يمكنك الانتقال فورًا إلى التحرير اللوني shading، وقد تلاحظ وجود كائنين. والسبب في ذلك أننا سنستعرض تقنيتين مختلفتين لهما فائدة كبيرة جدًا، وستلاحظ أن معاملات الكائن اﻷول جاهزة وفي مكانها.
</p>

<p>
	وفي الفقرات التالية نوفر لك دليلًا سريعَا يوضح الدمج مع بقية الأصول التصميمية في ملف gLTF الذي سنصدّره والذي يستخدم لنقل وتحميل النماذج ثلاثية الأبعاد.
</p>

<h3 id="alphaalbedo">
	القناة Alpha وخريطة Albedo
</h3>

<p>
	تمثّل Albedo الخريطة اللونية التي يمكن سحبها إلى القاعدة اللونية Base Color. وإن وجدت القناة Alpha، سيتوجب عليك سحبها إلى مكانها. أما خريطة Albedo فهي الخريطة اللونية التي تحتاجها وبإمكانك سحبها إلى القاعدة اللونية.
</p>

<p>
	وبالعودة إلى قناة Alpha، وإن كان لديك أية قناة قد هيأتها سابقًا، فعليك وضعها ضمن القسم Alpha. وإن أردتها أن تعمل ضمن <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك اﻷلعاب</a> الذي تريده، انتقل إلى المواد material وبعدها إلى وضع المزج blend mode وغيّرها إلى اقتصاص ألفا Alpha clip. وتذكر أن الطريقة التي تُعد فيها القناة هنا هي نفسها التي ستظهر عندما يتطلب اﻷمر تغيير بعض اﻹعدادات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144198" href="https://academy.hsoub.com/uploads/monthly_2024_02/01_Alpha_and_albedo.png.3ba2d17af9c4223621a01b7c3489063f.png" rel=""><img alt="01 alpha and albedo" class="ipsImage ipsImage_thumbnailed" data-fileid="144198" data-unique="9r6xbnj8o" src="https://academy.hsoub.com/uploads/monthly_2024_02/01_Alpha_and_albedo.png.3ba2d17af9c4223621a01b7c3489063f.png"> </a>
</p>

<p>
	ستجد في لوحة المواد لديك نمطًا للمزج تصل إليه كالتالي viewport display ثم settings ثم Blend Mode، وسيؤثر ذلك على طريقة عرض محرك اﻷلعاب لخرائطك:
</p>

<ol>
	<li>
		<strong>واضح Opaque</strong>: وهو اﻹعداد الافتراضي، تُرى فيه المواد بشكل كامل ولا يسمح بأي وضع شفاف، أي يتجاهل هذا الخيار أية معلومات تقدمها القناة Alpha ويتعامل مع المواد على أنها ظاهرة تمامًا.
	</li>
	<li>
		<strong>اقتصاص ألفا Alpha clip</strong>: ويُعرف هذا النمط أيضًا باختبار ألفا Alpha Test أو الاقتصاص Cutout، ويستخدم معلومات قناة Alpha ﻹنشاء فصل ثنائي واضح بين المناطق كاملة الوضوح وكاملة الشفافية. وهذا أمر مثالي للكائنات التي تتمتع بشفافية محددة بدقة مثل الأسوار وأوراق اﻷشجار أو القصاصات الورقية، إذ لا تريد حينها مناطق نصف شفافة.
	</li>
	<li>
		<strong>تظليل ألفا Alpha Hashed</strong>: يسمح هذا النمط باﻷوضاع نصف الشفافة للمواد، ويعطي أفضل النتائج عند تجميع الكائنات الشفافة فوق بعضها على شكل طبقات. يستخدم نمط التشويش العشوائي dithered pattern لمحاكاة الشفافية، وينتج عنه خامة مشوشة لكنها تعطي توزيعًا أفضل عمومًا للسطوح الشفافة مقارنة بنمط مزج ألفا Alpha Blend.
	</li>
	<li>
		<strong>مزج ألفا Alpha Blend</strong>: يسمح هذا النمط بالوضع نصف الشفاف الكامل، وهو مثالي لمواد مثل الزجاج أو السوائل، إذ يمزج قناة Alpha مع القناة اللونية ليعطي تمثيلًا دقيقًا للشفافية. مع ذلك قد يواجه هذا النمط مشاكل مع توزيع العمق اللوني وخاصة عند تتداخل عدة كائنات شفافة.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144199" href="https://academy.hsoub.com/uploads/monthly_2024_02/02_blend_mode.png.d2a6d73c9a9e1a949b8ca869ac009aac.png" rel=""><img alt="02 blend mode" class="ipsImage ipsImage_thumbnailed" data-fileid="144199" data-unique="x3xqvn6jn" src="https://academy.hsoub.com/uploads/monthly_2024_02/02_blend_mode.thumb.png.1042dbfecc92fcaae5e50526ec274f1b.png"> </a>
</p>

<h2 id="">
	المظهر المعدني والخشونة
</h2>

<p>
	يستخدم مخطط عمل يعتمد على التصيير الفيزيائي Physical Based Rendering ليحاكي المواد الحقيقة في محركات اﻷلعاب ثلاثية اﻷبعاد.
</p>

<h3 id="-1">
	الخرائط المعدنية
</h3>

<p>
	تحدد الخرائط المعدنية Metallic Maps أية أقسام من نموذجك لها مظهر معدني وتلك التي ليس لها هذا المظهر. ففي الخامة ذات التدرجات الرمادية، تعبر القيمة (1.0) للون اﻷبيض أن السطح معدني، بينما تعبر القيمة (0.0) عن سطح غير معدني. وعليك الانتباه إلى أن هذه الخاصية قد تكون ثنائية وغير متدرجة في أغلب اﻷحيان، فإما أن يكون السطح معدنيًا أو غير معدني. لهذا سيكون لهذه الخريطة قيم سوداء تمامًا أو بيضاء تمامًا غالبًا، ونادرًا ما تستخدم قيم تدريجية (رمادية).
</p>

<h3 id="-2">
	خرائط الخشونة
</h3>

<p>
	تتحكم خرائط الخشونة Roughness Maps بتفصيل نعومة أسطح المواد وتحدد مدى الخشونة أو النعومة التي تبديها. ففي هذه اﻷرضية ذات التدرج الرمادي، تشير قيم اللون اﻷبيض إلى سطح خشن، يعكس الضوء باتجاهات مختلفة، معطيًا مظهرًا ليس لامعًا. بينما تشير قيم اللون الأسود إلى سطح ناعم يعكس الضوء باتجاهات محددة أكثر، معطيًا مظهرًا لامعًا. لكن كيف يمكن تصدير كل ذلك؟
</p>

<h3 id="-3">
	كيف تُنفّذ هذه الإعدادات لتصديرها لاحقًا
</h3>

<p>
	من الجيد فصل اﻷرضيات التي تحجب محيط الكائن وخرائط الخشونة والمظهر المعدني (ORM اختصارًا) وإسنادها إلى القناتين اللونيتين الزرقاء والخضراء وهو طريقة جيدة في حزم اﻷرضيات لجعلها أكثر فعالية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144200" href="https://academy.hsoub.com/uploads/monthly_2024_02/03_separate_textures.png.9f2cd94a60f490cc518e60a6530cb2fe.png" rel=""><img alt="03 separate textures" class="ipsImage ipsImage_thumbnailed" data-fileid="144200" data-unique="rycvdwfy1" src="https://academy.hsoub.com/uploads/monthly_2024_02/03_separate_textures.thumb.png.acd1ea3e46561edf8a13f1aa754ae2b3.png"> </a>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		إن لم تكن جميع الخامات محزّمة، فكل ما عليك فعله هو توصيل الخرائط مباشرة وسيعمل كل شيء جيدًا
	</p>
</blockquote>

<p>
	وعندما يكون لديك عدة خرائط متصلة مع خرائط ORM ستُجمّع كلها ضمن خامة ORM واحدة. وتأكد من ضبط خرائط الخشونة والمظهر المعدني والخرائط النمطية normal map على قيم غير لونية كي يكون الفضاء اللوني صحيحًا وبالتالي ستنقل البيانات بشكل صحيح. وتذكر أيضًا أن أية تغييرات تجريها على اﻷرضيات ستُصدّر أيضًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144201" href="https://academy.hsoub.com/uploads/monthly_2024_02/04_packing_textures.png.14d1d30097d1af116c085785b66083f6.png" rel=""><img alt="04 packing textures" class="ipsImage ipsImage_thumbnailed" data-fileid="144201" data-unique="elraxmh7j" src="https://academy.hsoub.com/uploads/monthly_2024_02/04_packing_textures.thumb.png.a9c094e0f5a16397a02711295c4154fe.png"> </a>
</p>

<h2 id="-4">
	حجب محيط المادة
</h2>

<p>
	إن حجب المحيط Ambient Occlusion عملية مزعجة للكثيرين، وخاصة عند تصديرها من بليندر. والحل اﻷبسط هو تحديد عقدة الخامة ومضاعفتها بالضغط على المفتاحين Shift + D، ثم تجميعها بالضغط على المفتاحين CTRL + G والذي يُنشئ مجموعة من اﻷرضيتين في الوسط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144202" href="https://academy.hsoub.com/uploads/monthly_2024_02/05_texture_duplicate.png.102fa803a08376354341e546280edf9a.png" rel=""><img alt="05 texture duplicate" class="ipsImage ipsImage_thumbnailed" data-fileid="144202" data-unique="svw48ycax" src="https://academy.hsoub.com/uploads/monthly_2024_02/05_texture_duplicate.png.102fa803a08376354341e546280edf9a.png"> </a>
</p>

<p>
	احذف الخريطة الموجودة في الوسط:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144203" href="https://academy.hsoub.com/uploads/monthly_2024_02/06_texture_middle_map_delet.png.a4d4ac210ca79c774c172f3531d137d4.png" rel=""><img alt="06 texture middle map delet" class="ipsImage ipsImage_thumbnailed" data-fileid="144203" data-unique="1yephpyl3" src="https://academy.hsoub.com/uploads/monthly_2024_02/06_texture_middle_map_delet.png.a4d4ac210ca79c774c172f3531d137d4.png"> </a>
</p>

<p>
	ستجد على اليمين المدخلات inputs والمخرجات outputs ضمن النافذة الفرعية "Group":
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144204" href="https://academy.hsoub.com/uploads/monthly_2024_02/07_inputs_outputs.png.21a48d6377cb4ca10540d39cacfeb01f.png" rel=""><img alt="07 inputs outputs" class="ipsImage ipsImage_thumbnailed" data-fileid="144204" data-unique="andge5z0n" src="https://academy.hsoub.com/uploads/monthly_2024_02/07_inputs_outputs.png.21a48d6377cb4ca10540d39cacfeb01f.png"> </a>
</p>

<p>
	أزل المدخلات فلن نحتاجها، ثم غيّر اسم الشعاع Vector تحت المدخلات إلى Occlusion وغيّر نوعه إلى <code>float</code>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144205" href="https://academy.hsoub.com/uploads/monthly_2024_02/08_texture_delet_outputs.png.3eff4434459f4c50f787a5ca194c049b.png" rel=""><img alt="08 texture delet outputs" class="ipsImage ipsImage_thumbnailed" data-fileid="144205" data-unique="4q3t8wj93" src="https://academy.hsoub.com/uploads/monthly_2024_02/08_texture_delet_outputs.png.3eff4434459f4c50f787a5ca194c049b.png"> </a>
</p>

<p>
	اضغط على Tab وستظهر عقدة مجموعة جديدة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144206" href="https://academy.hsoub.com/uploads/monthly_2024_02/09_new_group_node.png.a2762b02fcade06c52c7c537edec2d63.png" rel=""><img alt="09 new group node" class="ipsImage ipsImage_thumbnailed" data-fileid="144206" data-unique="su2fgm1cn" src="https://academy.hsoub.com/uploads/monthly_2024_02/09_new_group_node.png.a2762b02fcade06c52c7c537edec2d63.png"> </a>
</p>

<p>
	غيّر اسم العقدة إلى "glTF Settings" كما في الصورة التالية تمامًا، فأي خطأ سيمنعه من العمل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144207" href="https://academy.hsoub.com/uploads/monthly_2024_02/10_change_node_name.png.24ffc9a8c0c274875a94e29e85f8369d.png" rel=""><img alt="10 change node name" class="ipsImage ipsImage_thumbnailed" data-fileid="144207" data-unique="o5cmen25t" src="https://academy.hsoub.com/uploads/monthly_2024_02/10_change_node_name.png.24ffc9a8c0c274875a94e29e85f8369d.png"> </a>
</p>

<p>
	صل اﻵن خريطة الحجب إلى عقدة المجموعة "glTF Settings":
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144208" href="https://academy.hsoub.com/uploads/monthly_2024_02/11_connect_occlusion_map.png.f78b5fd06812d6d11babaf9a01c2480f.png" rel=""><img alt="11 connect occlusion map" class="ipsImage ipsImage_thumbnailed" data-fileid="144208" data-unique="gl4tsp9ky" src="https://academy.hsoub.com/uploads/monthly_2024_02/11_connect_occlusion_map.png.f78b5fd06812d6d11babaf9a01c2480f.png"> </a>
</p>

<h2 id="-5">
	تصدير الخريطة النمطية
</h2>

<p>
	الخريطة النمطية normal map هو نمط من اﻷرضيات المستخدمة في النماذج ثلاثية اﻷبعاد لمحاكاة التفاصيل الصغيرة للسطح مثل النتوءات دون الحاجة ﻹضافة مضلعات جديدة في النموذج.
</p>

<p>
	تُعد الخريطة النمطية بسيطة، واحرص على عدم استخدام قيم لونية عند ضبطها ثم صلها مع عقدة الخرائط النمطية وبعدها إلى normal. هذه هي الطريقة اﻷبسط لتصديرها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144209" href="https://academy.hsoub.com/uploads/monthly_2024_02/12_exporting_normal_map.png.bfb06c5790483bd5dffa7aed754ce886.png" rel=""><img alt="12 exporting normal map" class="ipsImage ipsImage_thumbnailed" data-fileid="144209" data-unique="1yatnxgai" src="https://academy.hsoub.com/uploads/monthly_2024_02/12_exporting_normal_map.png.bfb06c5790483bd5dffa7aed754ce886.png"> </a>
</p>

<h2 id="-6">
	إعدادات إضافية أخرى
</h2>

<p>
	ستجد في نافذة اﻹعدادات settings الخيار "Backface Culling" (ويعني إخفاء الوجه عند النظر من الخلف)، فإن فعّلته هنا سيُفعّل في محرًك اﻷلعاب الذي تنقل ملف اﻹعدادات إليه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144210" href="https://academy.hsoub.com/uploads/monthly_2024_02/13_backface_culling.png.c0ad3fe8430d7d739585d61ffd499616.png" rel=""><img alt="13 backface culling" class="ipsImage ipsImage_thumbnailed" data-fileid="144210" data-unique="ukzab95lf" src="https://academy.hsoub.com/uploads/monthly_2024_02/13_backface_culling.png.c0ad3fe8430d7d739585d61ffd499616.png"> </a>
</p>

<p>
	عند تفعيل هذا الخيار، يتحقق محرك الرسوميات من توجّه كل مضلّع، فغن كان مواجهًا للكاميرا فسيُصيّر بشكل اعتيادي، وإن كان معاكسًا لها، سيتجاوزه محرّك الألعاب ولن يصيّره. ولهذا الأمر إيجابيات على اﻷداء، فهو يقلل عدد المضلعات التي يجدر بالمحرّك معالجتها بشكل واضح.
</p>

<p>
	ولكي تعمل هذه التقنية جيدًا، ينبغي أن يكون النموذج مغلقًا بالشكل الصحيح، أي لا يحتوي أية ثقوب تسمح بالنظر من خلالها إلى الوجه الخلفي لمضلعات أخرى. فإن فّعلّ خيار إخفاء الوجه عند النظر من الخلف وكان هناك ثقوب، فستظهر بعض أجزاء النموذج وكأنها مفقودة عند النظر من زاوية معينة.
</p>

<p>
	ومن المهم الانتباه إلى أن تفعيل هذا الخيار ليس محبذًا النماذج المسطحة والرقيقة مثل اﻷوراق او غيرها من المواد الشفافة أو نصف الشفافة والتي يمكن أن يُرى منها وجهي المضلع، بعد ذلك يمكنك تصدر الكائن بالانتقال إلى File ثم Export GLTF.
</p>

<h2 id="gltf">
	ما الذي يجب تذكره عند تصدير GLTF؟
</h2>

<p>
	ينبغي الانتباه إلى عدة أشياء عند تصدير GLTF، لهذا سنناقش إعدادات تصدير النموذج ثلاثي اﻷبعاد بصيغة GLTF:
</p>

<ul>
	<li>
		<p>
			<strong>التنسيق Format</strong>: أكثر التنسيقات استخدامًا هو صيغة GLB الثنائية، لأنها تضم النموذج ثلاثي اﻷبعاد واﻷرضيات في ملف واحد. مع ذلك يعطيك تنسيقا (glTF(GLTF + BIN + textures و glTF Embedded تحكمًا أوسع لأنهما يفصلان بين المكونات. ويُعد تنسيق (glTF(GLTF + BIN + textures مفيدُا إن أردت مشاركة اﻷرضيات مع كائنات أخرى.
		</p>
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144211" href="https://academy.hsoub.com/uploads/monthly_2024_02/14_gltf_format.png.a5fbd61e747435caf7a2697897039885.png" rel=""><img alt="14 gltf format" class="ipsImage ipsImage_thumbnailed" data-fileid="144211" data-unique="g600mxghp" src="https://academy.hsoub.com/uploads/monthly_2024_02/14_gltf_format.png.a5fbd61e747435caf7a2697897039885.png"> </a>
</p>

<ul>
	<li>
		<p>
			<strong>التضمين include</strong>: تحدد في هذا القسم أية أجزاء من ملف بلندر ستصدره. فالخيار "خيارات منتقاة Selected Options" يُصدّر فقط النماذج التي اخترتها، وجميع الخيارات في المجموعة الفعّالة حاليًا في حال اخترت "المجموعة الفعالة Active Collection".
		</p>
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144212" href="https://academy.hsoub.com/uploads/monthly_2024_02/15_gtlf_include.png.f31693af09e8347e422a515ec0b7ff7b.png" rel=""><img alt="15 gtlf include" class="ipsImage ipsImage_thumbnailed" data-fileid="144212" data-unique="mq4ckqhpn" src="https://academy.hsoub.com/uploads/monthly_2024_02/15_gtlf_include.thumb.png.74b0c21a09ea9c822045fbffdb02d589.png"> </a>
</p>

<ul>
	<li>
		<strong>التحويل transform</strong>: إن كنت تواجه مشاكل مع توجّه النموذج في محرّك اﻷلعاب، بإمكانك تغيير المحورين "أعلى Up" و "للأمام Forward". وتذكّر اختلاف التوجّهات في محركات الألعاب المختلفة.
	</li>
	<li>
		<strong>تصدير المواد Material Export</strong>: عليك التأكد من تفعيل هذا الخيار.
	</li>
	<li>
		<strong>الصور Images</strong>: بإمكانك اختيار صيغة الصور التي تريدها من هذا القسم.
	</li>
	<li>
		هندسة النموذج <strong>Geometry</strong><span><span>: </span></span><span>يتضمن هذا القسم خيارات التصدير المتعلقة بهندسة النموذج، فإذا كان نموذجك يستخدم ألوان Vertex فعّل الخيار المتعلق به وإلا فقم بتعطيله، اما </span><span>خيار Apply Modifiers فهو يطبق جميع المعدلات على النموذج الخاص بك قبل التصدير.</span>
	</li>
	<li>
		<strong>التحريك Animation</strong>: يساعدك هذا القسم في تصدير الرسوم المتحركة، وبإمكانك تصدير الرسوم المتحركة النمطية normal animations ومفاتيح الشكل shape keys ورسوم اﻷغلفة skinning كي تتحكم بها في محرّك اﻷلعاب الذي تريد.
	</li>
</ul>

<h2 id="gltf-1">
	إدراج ملف glTF في محرك اﻷلعاب جودو
</h2>

<p>
	عند اكتمال تصدير الملف، افتح محرّك اﻷلعاب جودو واستورد هذا الملف. وتأكد أن الصور المضمّنة في تنسيق glTf Embedded قد ضُبطت على "استخراج اﻷرضيات". ومن المفترض أن يتلائم الملف المصدّر جيدًا.
</p>

<p>
	في حالتنا الموضحة بالصور التالية، اخترنا اقتصاص ألفا Alpha clip عند التصدير، لكنه ظهر في <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">محرك ألعاب جودو</a> على شكل مقص ألفا Alpha Scissor.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144213" href="https://academy.hsoub.com/uploads/monthly_2024_02/16_alpha_scissor.png.16c9c37fc2d0f6bada366b536b703b2e.png" rel=""><img alt="16 alpha scissor" class="ipsImage ipsImage_thumbnailed" data-fileid="144213" data-unique="96cujkphe" src="https://academy.hsoub.com/uploads/monthly_2024_02/16_alpha_scissor.png.16c9c37fc2d0f6bada366b536b703b2e.png"> </a>
</p>

<p>
	لاحظ كيف ظهرت الخرائط بالشكل الصحيح في جودو! وقد تلاحظ كيف تبدو غريبة ومليئة بألوان زاهية، يُدعى هذا اﻷمر خامة ORM أي أن اﻷرضيات قد حُزّمت ضمن خرائط مختلفة وأقنية مختلفة للخامة مما يجعل هذه الخرائط أكثر فعالية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144214" href="https://academy.hsoub.com/uploads/monthly_2024_02/17_packed_maps.png.febfbb309684373cee955b9254d10680.png" rel=""><img alt="17 packed maps" class="ipsImage ipsImage_thumbnailed" data-fileid="144214" data-unique="37393mwcy" src="https://academy.hsoub.com/uploads/monthly_2024_02/17_packed_maps.thumb.png.f5c0a728989ee1e4a87eded4fff6bda7.png"> </a>
</p>

<p>
	وقد تلاحظ أيضًا ظهور قسم الانبعاثات Emision والخريطة النمطية Normal Map أيضًا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="144215" href="https://academy.hsoub.com/uploads/monthly_2024_02/18_emission_sec.png.aefff5880d0b0861d1c3b791fd3d7582.png" rel=""><img alt="18 emission sec" class="ipsImage ipsImage_thumbnailed" data-fileid="144215" data-unique="2xoi4s3ee" src="https://academy.hsoub.com/uploads/monthly_2024_02/18_emission_sec.png.aefff5880d0b0861d1c3b791fd3d7582.png"> </a>
</p>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	باتباعك الخطوات التي شرحناها في هذا المقال، ستتمكن من تصدير عناصر أو أصول الألعاب الخاصة بك بفعالية من بليندر إلى <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">جودو Godot</a>. لا تتردد في ترك أية تساؤلات أو اقتراحات في قسم التعليقات أسفل الصفحة لتعم الفائدة لجميع المهتمين <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">بتصميم الألعاب الإلكترونية</a>.
</p>

<p>
	ترجمة -وبتصرف- لمقال: <a href="https://finepointcgi.io/2023/06/16/how-to-efficiently-export-assets-from-blender-to-your-game-engine/" rel="external nofollow">How to Efficiently export Assets from Blender to your game engine</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/3d/blender/%D8%A8%D9%84%D9%86%D8%AF%D8%B1-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%91%D9%85-%D9%88%D8%AA%D8%AD%D8%B1%D9%91%D9%83-%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D9%86%D9%85%D8%B0%D8%AC%D8%A9-%D8%A7%D9%84%D8%AC%D8%B3%D9%85-%D9%88%D8%A7%D9%84%D8%B1%D8%A3%D8%B3-r425/" rel="">بلندر للمبتدئين: كيف تصمّم وتحرّك روبوت - نمذجة الجسم والرأس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/3d/blender/%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%91%D9%85-%D9%88%D8%AA%D8%AD%D8%B1%D9%91%D9%83-%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%AE%D8%A7%D9%85%D8%A7%D8%AA-%D8%A8%D9%84%D9%86%D8%AF%D8%B1-%D9%88%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-%D8%A7%D9%84%D8%B4%D9%83%D9%84-r431/" rel="">كيف تصمّم وتحرّك روبوت: خامات بلندر ومفاتيح الشكل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/3d/blender/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D8%AC%D8%B3%D9%85-%D8%AB%D9%84%D8%A7%D8%AB%D9%8A-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%D9%84%D8%B4%D8%AC%D8%B1%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%A8%D9%84%D9%86%D8%AF%D8%B1-r718/" rel="">إنشاء مجسم ثلاثي الأبعاد لشجرة باستخدام برنامج بلندر</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2250</guid><pubDate>Wed, 21 Feb 2024 12:00:01 +0000</pubDate></item><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x645;&#x62D;&#x631;&#x643; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x62C;&#x648;&#x62F;&#x648; Godot &#x644;&#x644;&#x639;&#x645;&#x644; &#x645;&#x639; &#x642;&#x627;&#x639;&#x62F;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; SQLite</title><link>https://academy.hsoub.com/programming/game-development/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-sqlite-r2241/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_02/GodotSQLite.png.dcd94b252ad93771391196b71beade61.png" /></p>
<p>
	نتحدث في هذا المقال عن استخدام محرر قواعد البيانات SQLite للعمل مع جودو، ونعرض بداية اﻷسباب التي تدفع مطوري اﻷلعاب للعمل مع محرر قواعد بيانات أصلًا، ونتعرف بعدها على محرر قواعد البيانات SQLite والذي يُعد قاعدة بيانات مضمّنة صغيرة تسمح للمستخدم تخزين البيانات والاستعلامات ضمنها.
</p>

<p>
	لكن لماذا على استخدام قاعدة بيانات هذه؟ إن الميزة المفيدة لهذه القاعدة هو قدرتها على استيعاب كل البيانات في منطقة واحدة، واﻷهم من كل ذلك هو القدرة على الحصول على البيانات بأبسط طريقة.
</p>

<p>
	حتى تبدأ العمل معنا في هذا المقال، افتح محرك الألعاب جودو وأنشئ مشروعًا جديدًا.
</p>

<h2 id="">
	إعداد قاعدة البيانات
</h2>

<p>
	إذا كنت <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور ألعاب</a> إلكترونية فقد تحتاج لاستخدام <a href="https://academy.hsoub.com/devops/servers/databases/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">قواعد البيانات</a> في لعبتك من أجل تخزين بيانات اللاعبين وحفظ المستوى أو النقاط التي حصلوا عليها، ولتجهيز قاعدة البيانات <a href="https://academy.hsoub.com/devops/servers/databases/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%84%D8%A7%D9%82%D9%8A%D8%A9-sqlite-%D9%85%D8%B9-mysql-%D9%85%D8%B9-postgresql-r72/" rel="">SQLite</a> التي سنستخدمها في هذا المقال، حمّل متصفح قواعد البيانات <a href="https://sqlitebrowser.org/dl/" rel="external nofollow">DB Browser for SQLite</a> الذي يساعدك في إدارة قاعدة البيانات من خلال واجهة رسومية يمكنك من خلالها إنشاء قاعدة البيانات وتحريرها بسهولة.
</p>

<p>
	سنبدأ بإنشاء قاعدة بيانات جديدة، لهذا افتح متصفح قاعدة البيانات وانقر على النافذة "قاعدة بيانات جديدة New Database". وانتقل بعد ذلك إلى المجلد الذي يضم مشروع جودو الذي أنشأته سابقًا وأنشئ ضمنه مجلدًا جديدًا يحمل الاسم "datastore"، فلنختر الاسم "data" لقاعدة بياناتنا الجديدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143227" href="https://academy.hsoub.com/uploads/monthly_2024_02/01_new_sqlite_db.png.aa4b12c08e172ff9b746ae435a66ddc2.png" rel=""><img alt="01 new sqlite db" class="ipsImage ipsImage_thumbnailed" data-fileid="143227" data-unique="idqd0ep8d" src="https://academy.hsoub.com/uploads/monthly_2024_02/01_new_sqlite_db.png.aa4b12c08e172ff9b746ae435a66ddc2.png"> </a>
</p>

<p>
	تظهر بعد ذلك نافذة "تحرير تعريف الجدول Edit table definition"، اختر عندها الاسم "Scoreboard" لهذا الجدول وسنخزن في هذا الجدول نتيجة كل لاعب أو عدد النقاط التي حصل عليها في اللعبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143228" href="https://academy.hsoub.com/uploads/monthly_2024_02/02_create_table.png.816a9b30c89901830b22bd71654903d1.png" rel=""><img alt="02 create table" class="ipsImage ipsImage_thumbnailed" data-fileid="143228" data-unique="akt6ncins" src="https://academy.hsoub.com/uploads/monthly_2024_02/02_create_table.png.816a9b30c89901830b22bd71654903d1.png"> </a>
</p>

<p>
	لنبدأ بإنشاء أول اﻷعمدة "id" بالنقر على الزر "Add"، وستكون عناصره من النوع الصحيح INTEGER وانقر على الخيارات "غير فارغ NN" و"تزايد تلقائي AI"، مما يسمح له بأن يكون مرجعًا لنا للحصول على البيانات من الجدول أو إلحاق بيانات أخرى.
</p>

<p>
	أنشئ تاليًا حقلًا field نصيًا TEXT وسمه "name" وذلك لتخزين اسم المستخدم الذي نريد معرفة نتيجته. ويستخدم النوع السابق لتخزين أكثر من ا تيرابايت من البيانات النصية، فانتبه إلى ذلك! ثم أنشئ أخيرًا حقل النتيجة "score" واجعله من النوع الصحيح INTEGER.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143229" href="https://academy.hsoub.com/uploads/monthly_2024_02/03_table_fields.png.fe4805357f020351b7d50c825f8112fd.png" rel=""><img alt="03 table fields" class="ipsImage ipsImage_thumbnailed" data-fileid="143229" data-unique="36s9g8fi9" src="https://academy.hsoub.com/uploads/monthly_2024_02/03_table_fields.png.fe4805357f020351b7d50c825f8112fd.png"> </a>
</p>

<p>
	انقر اﻵن على الزر "موافق OK" وانتقل إلى مشاهدة قاعدة البيانات من خلال النقر على "تصفح البيانات Browse Data"، وسترى جدولك وقد ظهر. بإمكانك اﻵن من هذه النافذة أن تدخل البيانات يدويًا إن أردت، وذلك بالنقر على أيقونة اﻹضافة ومن ثم إدخال ما تريد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143230" href="https://academy.hsoub.com/uploads/monthly_2024_02/04_browse_data.png.820ebd5aac731b1aa19306810c830e5e.png" rel=""><img alt="04 browse data" class="ipsImage ipsImage_thumbnailed" data-fileid="143230" data-unique="tg35fwt4v" src="https://academy.hsoub.com/uploads/monthly_2024_02/04_browse_data.png.820ebd5aac731b1aa19306810c830e5e.png"> </a>
</p>

<p>
	إن انتقلنا إلى "تنفيذ استعلام execute SQL"سترى المكان الذي تنفذ فيه الاستعلامات التي نريد على قاعدة البيانات. سنجرّب الاستعلامات بإدخال بعض البيانات، لهذا اكتب الاستعلام التالي:
</p>

<pre class="ipsCode">insert into scoreboard (name,score) values ('nori',50),('finepointcgi',20)
</pre>

<p>
	عند تنفيذ هذا الاستعلام على النحو التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143231" href="https://academy.hsoub.com/uploads/monthly_2024_02/05_insert_SQL.png.d7f10e185435577923dc3c9e51e16fe1.png" rel=""><img alt="05 insert sql" class="ipsImage ipsImage_thumbnailed" data-fileid="143231" data-unique="1sd0kkz6t" src="https://academy.hsoub.com/uploads/monthly_2024_02/05_insert_SQL.png.d7f10e185435577923dc3c9e51e16fe1.png"> </a>
</p>

<p>
	سترى النتيجة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143232" href="https://academy.hsoub.com/uploads/monthly_2024_02/06_insert_result.png.55195a5848450136f19771a620ff00df.png" rel=""><img alt="06 insert result" class="ipsImage ipsImage_thumbnailed" data-fileid="143232" data-unique="ox6ot14y2" src="https://academy.hsoub.com/uploads/monthly_2024_02/06_insert_result.png.55195a5848450136f19771a620ff00df.png"> </a>
</p>

<p>
	وعند تنفيذ الاستعلام <code>Select * from scoreboard</code>، سترى نتيجة عملك. ولننتقل اﻵن إلى محرك الألعاب جودو من أجل استكمال عملية ربطه مع قاعدة البيانات SQLite.
</p>

<h2 id="sqlite">
	تنزيل اﻹضافة الخاصة بقاعدة البيانات SQlite
</h2>

<p>
	لننتقل اﻵن إلى جودو ثم نفتح النافذة الفرعية "مكتبة الأصول أو مكتبة الموجودات Asset library" التي تمثل مستودعًا لأي أدوات أو موارد إضافية تريد تضمينها في اللعبة، ثم اكتب sqlite واختر الإضافة التي تملك الرقم 2shady4u فهي إضافة جيدة وذات أداء مستقر. جرّب بعد ذلك تثبيتها وانتظر لحين اكتمال التنزيل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143233" href="https://academy.hsoub.com/uploads/monthly_2024_02/07_sql_pugin_download.png.55e49900add6e6a5fc22402b6838e874.png" rel=""><img alt="07 sql pugin download" class="ipsImage ipsImage_thumbnailed" data-fileid="143233" data-unique="5cdgbqiv8" src="https://academy.hsoub.com/uploads/monthly_2024_02/07_sql_pugin_download.thumb.png.cbaa30a40ab3730dfcd2cdedf306af2e.png"> </a>
</p>

<p>
	سنضيف تاليًا عقدة، لهذا سننشئ سكريبت ونسمّيه "MainSystem.gd" وسيحتوي هذا الملف على كافة السكريبتات والتعليمات التي تتفاعل مع البيانات، لذا علينا تحميل أن نقوم بتحميل قاعدة البيانات في بدايته، وكي تتمكن من القيام بالتحميل المسبق للبيانات عليك استخدام الدالة <code>preload</code> مع تمرير العنوان التالي لوسيط لهذه الدالة:
</p>

<p style="text-align: left;">
	<code>res://addons/godot-sqlite/bin/gdsqlite.gdns</code>
</p>

<h2 id="-1">
	إدخال بيانات إلى قاعدة البيانات
</h2>

<p>
	الآن انسخ الشيفرة التالية إلى ملف السكريبت الذي أنشأته في الخطوة السابقة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4329_12" style=""><span class="pln">const </span><span class="typ">SQLite</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> preload</span><span class="pun">(</span><span class="str">"res://addons/godot-sqlite/bin/gdsqlite.gdns"</span><span class="pun">)</span><span class="pln">
var db
var db_name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"res://DataStore/database"</span><span class="pln">

func _ready</span><span class="pun">():</span><span class="pln">
    db </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SQLite</span><span class="pun">.</span><span class="pln">new</span><span class="pun">()</span><span class="pln">
    db</span><span class="pun">.</span><span class="pln">path </span><span class="pun">=</span><span class="pln"> db_name
func commitDataToDB</span><span class="pun">():</span><span class="pln">
    db</span><span class="pun">.</span><span class="pln">open_db</span><span class="pun">()</span><span class="pln">
    var tableName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"PlayerInfo"</span><span class="pln">
    var dict </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">()</span><span class="pln">
    dict</span><span class="pun">[</span><span class="str">"Name"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"this is a test user"</span><span class="pln">
    dict</span><span class="pun">[</span><span class="str">"Score"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5000</span><span class="pln">

    db</span><span class="pun">.</span><span class="pln">insert_row</span><span class="pun">(</span><span class="pln">tableName</span><span class="pun">,</span><span class="pln">dict</span><span class="pun">)</span></pre>

<p>
	ننشئ في الكود أعلاه المتغيرين <code>db</code> و <code>db_name</code> بعد تحميل قاعدة البيانات، ونسند للثاني عنوان قاعدة البيانات <code>"res://DataStore/database"</code>. ومن أجل تهيئة قاعدة البيانات، نستدعي التابع <code>()SQLite.new</code> داخل الدالة <code>()ready</code> ونسند قيمته إلى المتغير <code>db</code>، وسيُهيئ ذلك صنفًا لإعداد قاعدة البيانات.
</p>

<p>
	نحتاج بعد ذلك إلى ضبط مسار قاعدة البيانات كالتالي <code>db.path= db_name</code> ونضيف بعدها دالة جديدة تُدعى <code>()commiteDataToDB</code> سنستخدمها ﻹيصال البيانات إلى قاعدة البيانات.
</p>

<p>
	ننشئ ضمن الدالة <code>()commiteDataToDB</code> قناة<a href="https://academy.hsoub.com/devops/servers/databases/mysql/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D9%85%D8%AD-%D8%A8%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%B9%D9%86-%D8%A8%D8%B9%D8%AF-%D8%A8%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-mysql-r403/" rel=""> اتصال مع قاعدة البيانات</a> لهذا نستدعي التابع <code>()db.open_db</code> الذي يهيئ قناة الاتصال مع قاعدة البيانات ويسمح لنا بتنفيذ <a href="https://academy.hsoub.com/programming/sql/%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85-%D8%B9%D9%86-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-sql-r588/" rel="">استعلامات</a> عليها. ولاختيار اسمٍ للجدول، نعرّف متغيرًا بالاسم <code>tablename</code> ونضبطه قيمته على <code>"PlayerInfo"</code>. ثم ننشئ قاموسًا <code>dict</code> يحدد المعلومات التي نريد <a href="https://academy.hsoub.com/programming/sql/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%AF%D8%B1%D8%A7%D8%AC-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-sql-r2226/" rel="">إدراجها في قاعدة البيانات</a>، ويكون مفتاح القاموس بمثابة العمود والقيمة بمثابة الصف عند إضافة معلومات القاموس إلى قاعدة البيانات من خلال التعليمة <code>INSERT</code>.
</p>

<p>
	نستدعي أخيرًا الدالة <code>(db.insert_row(tableName,dict</code> ﻹضافة القاموس (الذي يمثل المُدخل الجديد) إلى قاعدة البيانات.
</p>

<h2 id="-2">
	قراءة البيانات من قاعدة البيانات
</h2>

<p>
	كما هو الحال عند الكتابة إلى قاعدة البيانات، لا بد من فتح قناة اتصال مع قاعدة البيانات واختيار الجدول الذي نريد القراءة منه. ثم ننشئ بعد ذلك الاستعلام الذي نريد باستدعاء التابع <code>()db.query</code> وكتابة تعليمات الاستعلام ضمنه كمعامل نصي. وبمجرد استدعاء هذا التابع سيتصل مع قاعدة البيانات وينفذ الاستعلام ويخزن النتيجة ضمن المصفوفة <code>query_result</code>.
</p>

<p>
	لا بد بعد ذلك من التنقل بين عناصر المصفوفة من العنصر 0 وصولًا إلى آخر عنصر الذي تمثله الخاصية <code>size</code> للمصفوفة <code>query_result</code> للحصول على الكائنات الموجودة في قاعدة البيانات، ومن ثم طباعة النتيجة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4329_10" style=""><span class="pln">func readFromDB</span><span class="pun">():</span><span class="pln">    
    db</span><span class="pun">.</span><span class="pln">open_db</span><span class="pun">()</span><span class="pln">
    var tableName </span><span class="pun">=</span><span class="pln"> </span><span class="str">"PlayerInfo"</span><span class="pln">
    db</span><span class="pun">.</span><span class="pln">query</span><span class="pun">(</span><span class="str">"select * from "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> tableName </span><span class="pun">+</span><span class="pln"> </span><span class="str">";"</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> db</span><span class="pun">.</span><span class="pln">query_result</span><span class="pun">.</span><span class="pln">size</span><span class="pun">()):</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Qurey results "</span><span class="pun">,</span><span class="pln"> db</span><span class="pun">.</span><span class="pln">query_result</span><span class="pun">[</span><span class="pln">i</span><span class="pun">][</span><span class="str">"Name"</span><span class="pun">],</span><span class="pln"> db</span><span class="pun">.</span><span class="pln">query_result</span><span class="pun">[</span><span class="pln">i</span><span class="pun">][</span><span class="str">"Score"</span><span class="pun">])</span></pre>

<h2 id="-3">
	الخلاصة
</h2>

<p>
	هذا هو اﻷمر برمّته! فقد تعلمنا في مقال اليوم طريقة إضافة البيانات إلى قاعدة بيانات ومن ثم تعاملنا معها. ولعللك لاحظت أن استخدام قواعد البيانات أسهل وأسرع من استخدام الملفات لتخزين البيانات في لعبتك الإلكترونية. وتسمح لك باسترجاع البيانات التي تحتاجها فقط بدلًا من قراءة الكثير من الملفات. وعندما ترى أن بياناتك أضخم من عدة ملفات، من الجيد عندها الانتقال إلى قاعدة بيانات.
</p>

<p>
	ترجمة وبتصرف للمقال: <a href="https://finepointcgi.io/2021/11/12/setting-up-godot-to-work-with-sqlite/" rel="external nofollow">Setting up Godot to work with SQLite</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/" rel="">تعرف على أهمية صناعة الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2183/" rel="">تعرف على محرر محرك اﻷلعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/databases/%D9%83%D9%8A%D9%81-%D9%88%D9%85%D8%AA%D9%89-%D9%86%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-sqlite-r111/" rel="">كيف ومتى نستخدم SQLite</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2241</guid><pubDate>Sat, 10 Feb 2024 12:07:00 +0000</pubDate></item><item><title>&#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x645;&#x62D;&#x631;&#x643; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x62C;&#x648;&#x62F;&#x648; &#x639;&#x644;&#x649; &#x628;&#x639;&#x636; &#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x639;&#x62A;&#x627;&#x62F; &#x63A;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x62F;&#x639;&#x648;&#x645;</title><link>https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-%D8%B9%D9%84%D9%89-%D8%A8%D8%B9%D8%B6-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%B9%D8%AA%D8%A7%D8%AF-%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AF%D8%B9%D9%88%D9%85-r2235/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_01/4.png.6df20e38188b91bc0551c51f93e968e2.png" /></p>
<p>
	نتحدث في هذا المقال عن بعض المشاكل التي يتعرض لها مستخدمو محرك الألعاب جودو Godot 4 عند محاولة العمل على عتاد لا يدعمه محرّك اﻷلعاب. فإن كنت تعمل على أجهزة حواسيب مصنّعة قبل عام 2013، فقد لا تملك برامج تشغيل العتاد Vulkan حيث تدعم هذه الأجهزة  OpenGL 3.0 فقط من أجل عرض الرسومات ثلاثية الأبعاد على حاسوبك.
</p>

<p>
	وبالتالي إذا حاولت تشغيل محرك الألعاب جودو 4 ضمن بيئة عمل وهمية VirtualBox، ففي هذه الحالة قد تصادفك بعض العقبات. وسنوضح لك في هذا المقال طريقة للالتفاف على تلك المشاكل والعقبات وسبل حلها، فإذا كانت لديك أي مشكلات في التعامل مع إقلاع محرك ألعاب جودو 4 على جهازك تابع معنا قراءة هذا المقال.
</p>

<h2 id="">
	أين تكمن المشكلة في جودو 4؟
</h2>

<p>
	لنفترض أن ثبّت <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">محرك ألعاب جودو</a> 4 وأنت متحمس بالفعل لبدء العمل على <a href="https://academy.hsoub.com/programming/game-development/" rel="">صناعة لعبتك الإلكترونية</a>، ثم نقرت نقرة مزدوجة على أيقونة البرنامج، وفوجئت بطهور رسالة خطأ تخبرك بفشل تهيئة برنامج تشغيل بطاقة الفيديو لديك لأنها لا تدعم Vulkan أو OpenGL كما هو موضح في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143002" href="https://academy.hsoub.com/uploads/monthly_2024_01/01_godot_launch_error.png.aab12df649218aab1127ccf12d33f49c.png" rel=""><img alt="01 godot launch error" class="ipsImage ipsImage_thumbnailed" data-fileid="143002" data-unique="o87x79p3b" src="https://academy.hsoub.com/uploads/monthly_2024_01/01_godot_launch_error.png.aab12df649218aab1127ccf12d33f49c.png"> </a>
</p>

<p id="-1">
	لحل هذه المشكلة أمامك خيارات سنشرحهمها في الفقرات التالية.
</p>

<h2>
	تحديث برامج تشغيل العتاد أو الالتفاف على الموضوع
</h2>

<p>
	لديك اﻵن خياران، الأول هو أن تحدّث برنامج تشغيل بطاقة الفيديو لديك من خلال التوجه إلى موقع الويب الخاص بمصنع بطاقة العرض لديك، ومن ثم تنزيل وتثبيت آخر إصدار لهذه البطاقة. وفي حال لم يكن الخيار الأول متاحًا لديك، يمكن في هذه الحالة فتح محرر سطر اﻷوامر <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">Command prompt</a> أو الطرفية على جهازك ثم تكتب الأمر <code>Godot</code>، بعدها ابحث عن الملف التنفيذي للمحرك جودو، ثم شغله بعد إضافة الوسيط التالي لأمر التشغيل كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_5259_13">&gt;Godot_v4.2.1-beta3_mono_win64.exe --rendering-drive opengl3</pre>

<p>
	كما هو هو مبين في الشاشة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143003" href="https://academy.hsoub.com/uploads/monthly_2024_01/02_renderning_workaround.png.ff446d2ac8c6f067e7476f9a7d262bca.png" rel=""><img alt="02 renderning workaround" class="ipsImage ipsImage_thumbnailed" data-fileid="143003" data-unique="1285p29uw" src="https://academy.hsoub.com/uploads/monthly_2024_01/02_renderning_workaround.png.ff446d2ac8c6f067e7476f9a7d262bca.png"> </a>
</p>

<p id="play">
	ستعمل هذه الحيلة في أغلب اﻷحيان وسيُحمّل برنامج جودو ويعمل بشكل صحيح على جهازك.
</p>

<h2>
	حل مشكلة النقر على زر التشغيل Play
</h2>

<p>
	قد يبدو كل شيء على ما يرام  حتى الآن، لكن قد تفاجئ بعد أن تنقر على زر التشغيل، بظهور رسالة الخطأ نفسها من جديد. لا تقلق يمكنك أيضًا إصلاح هذا الأمر من خلال الانتقال إلى القائمة مشروع Project ثم اختيار إعدادات المشروع Project Settings وبعدها ثم بتفعيل  الخيار إعدادات متقدمة Advanced Settings كما في الصورة التالية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143004" href="https://academy.hsoub.com/uploads/monthly_2024_01/03_play_error_soluation.png.3849f89c2c31fb666e7009cca22de496.png" rel=""><img alt="03 play error soluation" class="ipsImage ipsImage_thumbnailed" data-fileid="143004" data-unique="nmfksvzgy" src="https://academy.hsoub.com/uploads/monthly_2024_01/03_play_error_soluation.png.3849f89c2c31fb666e7009cca22de496.png"> </a>
</p>

<p>
	بعد أن تظهر لك النافذة أعلاه انتقل ذلك إلى قسم المحرر Editor ثم اختر الخيار تشغيل Run ثم اجعل قيمة المتغير Main Run Arguments كما يلي:<br>
	<code>rendering-drive opengl3--</code> وانقر بعد ذلك على زر إغلاق Close ومن المفترض أن يعمل زر التشغيل بشكل صحيح ودون أي مشكلات.
</p>

<h2 id="vitrualbox">
	خطوات إضافية للعمل على VitrualBox أو على جهاز محدد
</h2>

<p>
	إن كنت تعمل على الجهاز الافتراضي VirtualBox، أو لم تنجح الخطوات السابقة لحل المشكلة، عليك في هذه الحالة اتباع بعض الخطوات الإضافية. انتقل إلى المتصفح وحمّل برامج تشغيل العتاد <a href="https://github.com/pal1000/mesa-dist-win" rel="external nofollow">Mesa dist Windows</a> في حال كان نظام تشغيل حاسوبك هو ويندوز <a href="https://academy.hsoub.com/apps/operating-systems/windows/" rel="">Windows</a>، أما إن كنت تعمل على إحدى توزيعات نظام التشغيل لينكس <a href="https://academy.hsoub.com/apps/operating-systems/linux/" rel="">Linux</a> فلن تحتاج إلى ذلك. حمّل اﻹصدار MingW من برنامج تشغيل العتاد Mesa وبرنامج ضغط الملفات 7-Zip الذي سوف تحتاجه لاستخراج ملفات برنامج تشغيل العتاد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143005" href="https://academy.hsoub.com/uploads/monthly_2024_01/04_mesa_elease.png.ca4fa9a8da6f6da1adcc3c5f415f29cc.png" rel=""><img alt="04 mesa elease" class="ipsImage ipsImage_thumbnailed" data-fileid="143005" data-unique="hcibh2mat" src="https://academy.hsoub.com/uploads/monthly_2024_01/04_mesa_elease.png.ca4fa9a8da6f6da1adcc3c5f415f29cc.png"> </a>
</p>

<p>
	عند اكتمال عملية التنزيل انتقل إلى مجلّد تنزيلات downloads، ثم استخرج الملفات باستخدام البرنامج 7-zip ثم افتح المجلد الناتج وشغّل الملف System Wide Deploy الذي سيخبرك بأنه سيثبّت برامج تشغيل العتاد OpenGL الخاص بالحواسب المكتبية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143006" href="https://academy.hsoub.com/uploads/monthly_2024_01/05_mesa_install.png.3795a9fadc5318a05350a8c6986ff97d.png" rel=""><img alt="05 mesa install" class="ipsImage ipsImage_thumbnailed" data-fileid="143006" data-unique="bhoz3g61o" src="https://academy.hsoub.com/uploads/monthly_2024_01/05_mesa_install.png.3795a9fadc5318a05350a8c6986ff97d.png"> </a>
</p>

<h2 id="-2">
	اختبار برامج تشغيل العتاد
</h2>

<p>
	عليك تاليًا اختبار كلا برنامجي تشغيل العتاد OpenGL الخاص بسطح المكتب، ومايكروسوفت OpenGL على DirectX 3D12. سيعمل برامج تشغيل العتاد الأول على المعالج المركزي CPU وسيحاول الثاني العمل على المعالج الرسومي GPU.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		إن استطعت استخدام مايكروسوفت OpenGL على DirectX 3D12 فهذا سيقدّم أداءً أفضل.
	</p>
</blockquote>

<h2 id="4">
	تشغيل جودو 4
</h2>

<p>
	عد مجددًا إلى محرر سطر اﻷوامر واكتب الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_1160_12"> Godot –rendering-driver opengl3 </pre>

<p>
	ويجب أن يعمل جودو كما هو مطلوب، وتذكر أن ما فعلناه هنا هو الالتفاف حول المشكلة، فلا تتوقع أداءً استثنائيًا! لكن على اﻷقل ستشغّل محرك ألعاب جودو 4 بصورة صحيحة.
</p>

<p>
	أما إن كنت تعمل على <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B1%D8%B6-%D9%85%D9%88%D8%AC%D8%B2-%D9%84%D8%A3%D8%B4%D9%87%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r631/" rel="">توزيعة لينكس</a> منت Mint، فلن تحتاج لعملية الالتفاف تلك، وسيعمل جودو حتى على العتاد غير المدعوم لأن برنامج تشغيل العتاد Mesa مضمّن معه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="143007" href="https://academy.hsoub.com/uploads/monthly_2024_01/06_godot.png.358b9facde83dae56077f4a6f117895b.png" rel=""><img alt="06 godot" class="ipsImage ipsImage_thumbnailed" data-fileid="143007" data-unique="673l8gu2r" src="https://academy.hsoub.com/uploads/monthly_2024_01/06_godot.thumb.png.e6d2affbb87f0726bc927b79fddaef58.png"> </a>
</p>

<h2 id="-3">
	الخلاصة
</h2>

<p>
	قد يكون تشغيل محرك الألعاب جودو 4 على عتاد لا يدعمه أمرًا صعبًا على <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب الإلكترونية</a>، لكن حل هذه المشكلة ليس مستحيلًا! كل ما عليك هو تجربة الخطوات التي شرحناها في المقال وتستأنف العمل على جودو، وإن واجهتك أي مشكلة في التعامل مع محرك الألعاب جودو لا تتردد في طرحها في قسم التعليقات أسفل المقال لنساعدك على حلها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://finepointcgi.io/2023/06/19/title-making-godot-4-work-on-some-unsupported-hardware/" rel="external nofollow">Making Godot 4 work on (some)unsupported hardware</a>
</p>

<h2>
	اقرأ أيضّا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot/" rel="">مدخل إلى محرك الألعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D8%B1-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%EF%BB%B7%D9%84%D8%B9%D8%A7%D8%A8-%D8%AC%D9%88%D8%AF%D9%88-godot-r2183/" rel="">تعرف على محرر محرك اﻷلعاب جودو Godot</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">تعرف على أشهر محركات الألعاب Game Engines</a>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2235</guid><pubDate>Sat, 03 Feb 2024 12:09:01 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x623;&#x647;&#x645;&#x64A;&#x629; &#x635;&#x646;&#x627;&#x639;&#x629; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x627;&#x644;&#x625;&#x644;&#x643;&#x62A;&#x631;&#x648;&#x646;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2228/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_01/--.png.10f719a570d36421f06ea4e2277aac27.png" /></p>
<p>
	تعد صناعة الألعاب الإلكترونية أحد القطاعات التقنية الأكثر نموَا، نظرًا لتزايد شعبية الألعاب الإلكترونية بين الأشخاص من مختلف الفئات العمرية حول العالم، فإذا كنت ترغب بالدخول إلى عالم تصميم الألعاب وبرمجتها تابع هذا المقال لتتعرف أكثر على مفهوم صناعة الألعاب، وتكتشف أهمية هذا القطاع وكيف يمكن أن تصبح مطور ألعاب محترف.
</p>

<h2 id="">
	ما المقصود بصناعة الألعاب؟
</h2>

<p>
	يشير مصطلح صناعة الألعاب الإلكترونية إلى العملية الكاملة بداية من توليد فكرة اللعبة وصولًا لتحويلها إلى منتج نهائي قابل للاستخدام. ويجب أن تتضمن ألعاب الفيديو العديد من الميزات وآليات اللعب المختلفة التي تعمل بشكل منسجم وجذاب كي تمنح اللاعب تجربة لعب أفضل وتبقيه اللاعب مستمتعًا ومنسجمًا في اللعب. تتطلب صناعة الألعاب المرور بمجموعة من المراحل حيث يتطلب إنشاء لعبة إلكترونية بداية وضع فكرة اللعبة ثم تحديد شخصياتها وطريقة اللعب بها ويعدها تبدأ مرحلة برمجة اللعبة واختبارها وتصحيح أي أخطاء في برمجتها أو منطق لعبها، وتكرر هذه العملية مرات عدة حتى الوصول إلى النموذج النهائي للعبة.
</p>

<p>
	ويساهم في صناعة الألعاب مجموعة من المتخصصين أهمهم مصممو الألعاب ومبرمجو الألعاب، حيث ينشئ مصممو ألعاب الفيديو السمات المميزة للألعاب الإلكترونية بما في ذلك الشخصيات والأهداف والتحديات والمستويات والإعدادات وقصة اللعبة. ويتعاونون مع المبرمجين الذين يكتبون الكود البرمجي الكامل لتحقيق هذه السمات وقد تتضمن صناعة الألعاب مجموعة أخرى من المساهمين مثل الكتاب ومصممي الشخصيات ومصممي التأثيرات الصوتية وغير ذلك من الموظفين التقنيين والمبدعين، والهدف في النهاية هو إنشاء لعبة ممتعة تجعل اللاعب يدمن هذه اللعبة وينسى نفسه فيها.
</p>

<h2 id="-1">
	ما الفرق بين تصميم اللعبة وبرمجة اللعبة؟
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141978" href="https://academy.hsoub.com/uploads/monthly_2024_01/--.png.9a109c3eb452a1f18e472a13f263911f.png" rel=""><img alt="برمجة وتصميم الألعاب" class="ipsImage ipsImage_thumbnailed" data-fileid="141978" data-ratio="62.60" data-unique="7sqtwo5hb" style="width: 400px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_01/--.thumb.png.9b015fbc56aea3cbf3ef9f4f915c679b.png"></a>
</p>

<p>
	تتطلب صناعة الألعاب وجود تكامل بين تصميم اللعبة الإلكترونية وبرمجتها، وعلى الرغم من أن مفهومي تصميم الألعاب وبرمجة الألعاب قد يبدوان متشابهين إلا أنهما مجالان مختلفان تمامًا في الواقع، ويلعب كل منهما دورًا مختلفًا في تطوير الألعاب الإلكترونية. يركز تصميم اللعبة على الجانب الإبداعي وتخطيط الهيكل العام للعبة ويسعى لتحقيق المظهر الجمالي والتصميم الجذاب لعناصر اللعبة، في حين تركز برمجة اللعبة على الجانب التقني وكتابة كامل الشيفرات البرمجية التي تحقق التصور الذي تم في مرحلة التصميم والعمل على تحسينها وصيانتها بصورة مستمرة.
</p>

<p>
	ويتمثل الاختلاف الرئيسي بين <a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">تصميم الألعاب</a> و<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8%D8%9F-r2068/" rel="">برمجة الألعاب</a> في أن مصطلح تصميم الألعاب يشير إلى الجانب الإبداعي والجمالي من اللعبة، بينما يقصد ببرمجة الألعاب كتابة التعليمات البرمجية ومعالجة الجوانب التقنية المختلفة المرتبطة بها.
</p>

<p>
	ويستخدم مصممو الألعاب برامج مختلفة من أبرزها برامج التصميم الرسومي مثل بليندر Blender و مايا Maya لتصميم عناصر وشخصيات اللعبة وبرامج وضع تخطيط اللعبة ووضع التصور العام لها مثل Ludo أو Nuclino، في حين يستخدم مبرمجو الألعاب محركات الألعاب ولغات برمجة الألعاب وغيرها من التقنيات المختلفة لتنفيذ رؤية مصمم اللعبة وإنشاء بيئة اللعب التي تدمج الرسومات والصوت والرسوم المتحركة وغيرها من العناصر.
</p>

<p>
	والجدير بالملاحظة بأن هذه التخصصات في صناعة الألعاب تكون عادة في الألعاب المتطورة التي تحتاج لعمل ضخم وفريق متكامل، أما في الألعاب البسيطة فقد يقوم شخص واحد بصناعة اللعبة والاعتماد على رسومات ومصادر جاهزة في برمجتها.
</p>

<h2 id="-2">
	أهمية قطاع الألعاب الإلكترونية في سوق العمل
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141979" href="https://academy.hsoub.com/uploads/monthly_2024_01/--.png.6e71045a017d52a0eedf487776ab38fe.png" rel=""><img alt="صناعة الألعاب الإلكترونية" class="ipsImage ipsImage_thumbnailed" data-fileid="141979" data-ratio="62.60" data-unique="rb24uzi2i" style="width: 400px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_01/--.thumb.png.f3dccfa9b762aff041a215d971ed7c6e.png"> </a>
</p>

<p>
	يحظى مجال تطوير وبرمجة ألعاب الفيديو بمكانة مهمة في سوق العمل، نظرًا للطلب الكبير على صناعة الألعاب وتطويرها، والحاجة المستمرة للمطورين والمبدعين والمصممين القادرين على ابتكار وتنفيذ أفكار جديدة ودمجها في الألعاب وطرحها في السوق. وتعد صناعة الألعاب من المجالات عالية الربحية فهي تدر إيرادات تزيد على إيرادات صناعة الموسيقى والأفلام، وقد بلغت الحصة السوقية لصناعة الألعاب في العالم حوالي 280 مليار دولار أمريكي عام 2023 ويتوقع أن ينمو حجم سوق الألعاب العالمي إلى 665.77 مليار دولار أمريكي بحلول عام 2030 بمعدل نمو سنوي يقارب 13% (<a href="https://www.fortunebusinessinsights.com/gaming-market-105730" rel="external nofollow">المصدر</a>).<br>
	وإليك بعض الأسباب التي تجعلك تفكر في العمل في مجال صناعة وتطوير الألعاب:
</p>

<ul>
	<li>
		 فرص وظيفية مربحة.
	</li>
	<li>
		اتباع الشغف بصناعة لعبتك الخاصة.
	</li>
	<li>
		صناعة الألعاب دائمة التطور.
	</li>
	<li>
		ارتفاع الطلب على صانعي الألعاب.
	</li>
	<li>
		ضمان مستقبل وظيفي رائع.
	</li>
</ul>

<p>
	لنناقش كل سبب من الأسباب الوادرة أعلاه بمزيد من التفصيل ونكتشف أهميتها.
</p>

<h3 id="-3">
	فرص وظيفية مربحة
</h3>

<p>
	تنمو صناعة الألعاب بسرعة نظرًا للتطور التقني المتسارع، وتعتمد هذه الصناعة على التطويرات المستمرة والحاجة إلى توليد أفكار جديدة مما يعني زيادة عدد الوظائف الشاغرة في تصميم الألعاب وبرمجتها وزيادة الطلب على مصممي الألعاب المحترفين ورسامي شخصيات وبيئات الألعاب الثنائية والثلاثية الأبعاد.
</p>

<h3 id="-4">
	اتباع الشغف بصناعة لعبتك الخاصة
</h3>

<p>
	إذا كنت مهتمًا بمجال الألعاب الإلكترونية فهذه فرصتك لتستغل اهتمامك وشغفك وتحوله إلى مهنة، فسواء كنت مهتمًا بتطوير قصة لعبة مليئة بالمغامرة تحاكي الألعاب التي تحبها، أو لديك أفكار لتصميم لعبة جديدة بآليات لعب فريدة، أو إضفاء الحيوية على شخصيات لعبة تحبها ولديك فكرة لتطوير وتحسين طريقة لعبها، فإن مجال صناعة الألعاب هو وسيلة رائعة لتوجيه شغفك إلى وظيفة مجزية وتحويل أفكارك المميزة لواقع ملموس، وبالمناسبة يصل معظم مطوري الألعاب إلى مسارهم المهني بعد الانغماس في لعب ألعاب الفيديو، ولذلك فإنهم يشعرون بالرضا الوظيفي أكثر من الموظفين في مهن أخرى.
</p>

<h3 id="-5">
	صناعة الألعاب دائمة التطور
</h3>

<p>
	مع تقدم التقنية المتسارع وظهور تقنيات الواقع الافتراضي والواقع المعزز وتقنيات الذكاء الاصطناعي تتطور صناعة الألعاب الإلكترونية بصورة كبيرة وتنتشر أعداد كبيرة من الألعاب الإلكترونية تدمج هذه التقنيات المتقدمة في آليات اللعب الأمر الذي زاد من عدد محبي ألعاب الفيديو والمهتمين بشراء ولعب هذه الألعاب الحديثة وزاد الطلب على مطوري الألعاب المبدعين القادرين على إنشاء ألعاب بمفاهيم جديدة تجذب أكبر عدد من اللاعبين.
</p>

<h3 id="-6">
	ارتفاع الطلب على صانعي الألعاب
</h3>

<p>
	تشهد صناعة ألعاب الفيديو العالمية طلبًا متزايدًا في سوق العمل، خاصةً بسبب انتشار الألعاب الإلكترونية الجماعية متعددة اللاعبين التي تزيد حماس اللاعب وألعاب الجوال التي يمكن لعبها من أي مكان بسهولة وازدياد الطلب على الألعاب يعني بدوره زيادة الطلب على صانعيها وزيادة رواتبهم حيث أن المؤهلين في هذا المجال يتقاضون رواتب عالية تصل إلى أكثر من 5000 دولار شهريًا وفقًا لموقع <a href="https://www.statista.com/statistics/1344836/game-development-salary-by-level-and-gender-ukraine/" rel="external nofollow">statista</a>. وبالتالي إذا كان لديك شغف بالألعاب الإلكترونية بمختلف أنواعها وأردت أن تضمن مستقبلك وتحظى بوظيفة لها مكانة في مستقبل البرمجة فإن مجال صناعة الألعاب مجال مناسب لك تمامًا.
</p>

<h2 id="-7">
	كيف تبدأ في مجال صناعة ألعاب الفيديو؟
</h2>

<p>
	يعد مجال صناعة ألعاب الفيديو من المجالات التي تحتاج لتوفر عدة مهارات ومتطلبات. وإليك أهم المهارات والخطوات التي يجب أن تأخذها في الحسبان إذا كنت مهتمًا في دخول هذا المجال:
</p>

<ul>
	<li>
		<p>
			<strong>الحصول على التعليم اللازم</strong>: يجب أن تبدأ بتعلم أساسيات صناعة الألعاب وترسيخ معرفتك في مجال البرمجة والحصول على الدورات التدريبية ذات الصلة، ستجد في أكاديمية حسوب الكثير من الدروس والمقالات المفيدة حول <a href="https://academy.hsoub.com/programming/game-development/" rel="">صناعة الألعاب</a> باللغة العربية.
		</p>
	</li>
	<li>
		<p>
			<strong>تعزيز مهارتك في الرياضيات والفيزياء</strong>: تساعد الرياضيات في تحسين مهاراتك في برمجة الألعاب وتحريك شخصيات اللعبة، بينما تساعد الفيزياء في تطوير حركة الشخصية وجعلها تبدو واقعية.
		</p>
	</li>
	<li>
		<p>
			<strong>تنمية مهاراتك في تقنيات صناعة الألعاب</strong>: تحتاج لتعمل أساسيات <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">لغات برمجة الألعاب</a> مثل لغة C وC++‎ وجافا، وتعلم طريقة استخدام إحدى <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محركات الألعاب</a> مثل Unreal Engine أوUnity أو Godot التي تسهل عليك إنشاء اللعبة.
		</p>
	</li>
	<li>
		<p>
			<strong>تعزيز مهارات سرد القصص</strong>: تتيح لك مهارات سرد القصص تعديل تجربة اللعب عن طريق تغيير السرد، مما يعني إنشاء أفكار جديدة للعبة.
		</p>
	</li>
	<li>
		<p>
			<strong>التواصل مع المهتمين في مجال صناعة الألعاب</strong>: يساعدك التواصل مع صناع الألعاب شخصيًا أو عبر الإنترنت والانضمام للمنتديات وشبكات التواصل الاجتماعي الخاصة ببرمجة وتصميم الألعاب على التعرف على المبدعين والاستفادة من تجربتهم.
		</p>
	</li>
	<li>
		<p>
			<strong>صناعة ألعابك الخاصة</strong>: لا تكتفي بالمعلومات النظرية بل طبق ما تتعلمه في تطوير وبرمجة ألعابك الخاصة مهما كانت بسيطة فهذا يعزز ما تتعلمه ويساعدك على بناء معرض أعمال يثبت خبرتك والعثور على فرصة عمل بسرعة.
		</p>
	</li>
	<li>
		<p>
			<strong>ابحث عن وظائف تطوير الألعاب للمبتدئين:</strong> عندما تكتسب خبرة كافية في صناعة الألعاب يمكنك البحث عن فرصة عمل في شركة ألعاب أو العمل كمستقل وتطوير ألعابك الخاصة فالخبرة المهنية لا تقل أهمية عن التعليم وتساعدك على بناء أساس متين في تطوير ألعاب الفيديو. نادرًا ما تتطلب وظائف اختبار الألعاب تدريبًا متخصصًا أو درجة علمية كل ما تحتاجه هو معرض أعمال يثبت خبرتك ومهاراتك.
		</p>
	</li>
</ul>

<p>
	هل تطمح لتصبح مطور ألعاب فيديو محترف وتحويل شغفك إلى مهارة عملية بأفضل طريقة ممكنة. ستحقق لك دورة تطوير الألعاب من أكاديمية حسوب هذا الهدف، حيث ستتعلم كيف تبني ألعابك الخاصة من الصفر حتى الاحتراف بإشراف خبراء محترفين.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير الألعاب
		</p>

		<p class="banner-subtitle">
			ابدأ رحلة صناعة الألعاب ثنائية وثلاثية الأبعاد وابتكر ألعاب ممتعة تفاعلية ومليئة بالتحديات.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/game-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/game-development/" rel=""><img alt="دورة تطوير الألعاب" src="https://academy.hsoub.com/learn/assets/images/courses/game-development.png"></a>
	</div>
</div>

<h2>
	مهارت أساسية للنجاح في مجال صناعة الألعاب
</h2>

<p>
	لكي تنجح كمطور ألعاب فأنت تحتاج إلى امتلاك المهارات الفنية والكفاءة التقنية العالية لمجموعة من المهارات الأخرى والتي تشمل:
</p>

<ul>
	<li>
		فهم كيفية إنشاء تجربة مستخدم جيدة ومحسنة.
	</li>
	<li>
		مهارات متقدمة في سرد القصص وتأليف سيناريو اللعبة.
	</li>
	<li>
		مهارات في <a href="https://academy.hsoub.com/devops/servers/databases/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%87%D8%A7-r519/" rel="">تصميم قواعد البيانات</a>.
	</li>
	<li>
		خبرة في تطوير دورة حياة اللعبة.
	</li>
	<li>
		الاطلاع على أحدث اتجاهات الألعاب وأفضل الممارسات والتقنيات.
	</li>
	<li>
		مهارات في <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%86%D8%B7%D9%82%D9%8A-%D9%81%D9%8A-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r2095/" rel="">التفكير المنطقي</a> والقدرة على حل المشاكل بشكل فعال.
	</li>
	<li>
		العمل الجماعي ومهارات التواصل الجيد.
	</li>
</ul>

<h2 id="-9">
	ما هي لغات البرمجة المستخدمة في صناعة الألعاب؟
</h2>

<p>
	يمكن برمجة الألعاب باستخدام مجموعة متنوعة من لغات البرمجة كل منها لها ميزاتها وخصائصها، وأهم هذه اللغات:
</p>

<ul>
	<li>
		<strong>لغة C++‎</strong>: تعد من أفضل لغات البرمجة لتطوير الألعاب نظرًا لسرعتها وسهولة استخدامها واعتمادها على نطاق واسع كما تستخدم لغة C++‎ مع العديد من محركات الألعاب التي تمكّن المبرمجين من إنشاء الألعاب وتطوير بيئاتها بسهولة.
	</li>
	<li>
		<strong>لغة جافا</strong>: تتميز لغة بكونها لغة سهلة ومتعددة الاستخدامات ويمكن استعمالها لصناعة ألعاب الجوال التي تعمل على أجهزة أندرويد و iOS، كما أنها تعمل على أي <a href="https://academy.hsoub.com/apps/operating-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">نظام تشغيل</a> بما في ذلك ويندوز ولينكس حيث يمكن تشغيل الألعاب المطورة باستخدام لغة جافا على العديد من المنصات بفضل ميزة آلة جافا الافتراضية <a href="https://academy.hsoub.com/programming/java/%D8%A2%D9%84%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-java-virtual-machine-r964/" rel="">JVM</a>.
	</li>
	<li>
		<strong>لغة HTML5 و JavaScript</strong>: تستخدم لغة <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-html5-%D9%88%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5%D9%87%D8%A7-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-r4/" rel="">HTML5</a> مع لغة جافا سكريبت <a href="https://academy.hsoub.com/javascript/" rel="">JavaScript</a> في تطوير <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD-r767/" rel="">ألعاب المتصفح</a> فهاتان اللغتان تعملان على الويب وتوفران للمطور مرونة كبيرة في هيكلة اللعبة وتسهل مشاركة اللعبة مع الآخرين.
	</li>
	<li>
		<strong>لغة ‎C#‎</strong>: تعد لغة البرمجة <a href="https://academy.hsoub.com/programming/cpp/" rel="">C#‎</a> خيارًا شائعًا في مجال صناعة الألعاب فهي توفر مجموعة كبيرة من المكتبات والأدوات اللازمة لتطوير الألعاب والتطبيقات المختلفة كما أنها اللغة الافتراضية المستخدمة في <a href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20unity3d/" rel="">محرك الألعاب Unity</a>. كما يمكنك التعرف على مزيد من المعلومات حول لغات البرمجة المستخدمة في صناعة الألعاب بالاطلاع عىل مقال <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">تعرف على أشهر لغات برمجة الألعاب</a>.
	</li>
</ul>

<h2 id="-8">
	الخلاصة
</h2>

<p>
	نأمل أن يكون هذا المقال قد ساعدك على تكوين فكرة جيدة عن كل ما يخص مجال صناعة الألعاب وتصميمها وبرمجتها، وأهمية قطاع الألعاب في سوق العمل، وتعرفت على أهم المهارات التي تحتاجها لتصبح مطور ألعاب ناجح.
</p>

<p>
	فإذا كنت مهتمًا بهذا المجال الرائد وترغب بدخوله والتخصص به فابدأ من الآن بتنمية خبراتك ومهاراتك واستمر في التعلم حتى تتمكن من صناعة ألعاب مميزة وتحصل على فرصة العمل التي تحلم بها وتحظى بمستقبل وظيفي رائع.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/" rel="">تعرف على أفضل برنامج تصميم الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%B4%D8%AE%D8%B5%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%86%D8%A7%D8%AC%D8%AD%D8%A9-r2212/" rel="">شخصيات الألعاب الإلكترونية الناجحة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">تعرف على أشهر محركات الألعاب Game Engines</a>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2228</guid><pubDate>Wed, 31 Jan 2024 12:01:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x623;&#x641;&#x636;&#x644; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C; &#x62A;&#x635;&#x645;&#x64A;&#x645; &#x627;&#x644;&#x623;&#x644;&#x639;&#x627;&#x628; &#x627;&#x644;&#x625;&#x644;&#x643;&#x62A;&#x631;&#x648;&#x646;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/game-development/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-r2227/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_01/----.png.319f53583458df0552ead3c44c897ee1.png" /></p>
<p>
	سنعرفك في مقال اليوم على مجال تصميم الألعاب الذي يعد أحد أهم مراحل تطوير الألعاب الإلكترونية والذي يتطلب الكثير من المهارات التصميمية والإبداعية من أجل الحصول على ألعاب تفاعلية جذابة تنال إعجاب اللاعبين وتحفزهم على استخدامها واللعب بها باستمرار، ونوضح أهم الخطوات المتبعة في تصميم الألعاب الإلكترونية وأفضل برنامج تصميم ألعاب يساعدك لتأدية مهامك في تصميم الألعاب باحترافية ونجاح.
</p>

<h2 id="">
	أهمية تصميم الألعاب
</h2>

<p>
	تنمو صناعة الألعاب الإلكترونية بوتيرة سريعة ويزداد عدد مستخدميها حول العالم بشكل كبير ففي عصرنا الحالي نجد الجميع متسمرًا أمام الشاشات للتسلية واللعب، حيث توفر الألعاب الإلكترونية شكلاً محببًا من أشكال الترفيه للاعبين من جميع الأعمار والخلفيات وتوفر لهم وسيلة للاستمتاع والتفاعل مع الآخرين، ويمكن استخدامها أيضًا كأداة للتعلم من خلال تطوير ألعاب تعليمية هادفة تساهم في تنمية المهارات وتركز على <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%86%D8%B7%D9%82%D9%8A-%D9%81%D9%8A-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r2095/" rel="">التفكير المنطقي</a> وحل المشكلات، كما تعد الألعاب الإلكترونية اليوم ظاهرة ثقافية مجتمعية مهمة.
</p>

<p>
	لذا برزت الحاجة لإنتاج ألعاب جديدة ومبتكرة، وبالتالي ازداد الطلب على مطوري ومصممي الألعاب في جميع أنحاء العالم وأصبحت <a href="https://academy.hsoub.com/programming/game-development/" rel="">صناعة الألعاب الإلكترونية</a> من أهم القطاعات التكنولوجية الموجودة في سوق العمل والتي توفر فرص عمل لمجموعة كبيرة من المحترفين وتقدم لهم مصدر دخل هائل. ويتميز مجال تصميم الألعاب الإلكترونية عن غيره من <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">المجالات البرمجية</a> بكونه مجالًا إبداعيًا رائعًا يسمح لك بالتعبير عن شغفك في تصميم اللعبة التي تتخيلها وإنشاء تجارب لعب ممتعة وجذابة، وإلى جانب ذلك يمكّنك هذا المجال من تحقيق عوائد مالية كبيرة بمجرد حصولك على الخبرة والمهارة الكافية.
</p>

<h2 id="-1">
	الفرق بين تصميم الألعاب وبرمجة الألعاب
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141975" href="https://academy.hsoub.com/uploads/monthly_2024_01/-----.png.2ec6b407727ebc555f3d146503587e59.png" rel=""><img alt="الفرق بين تصميم الألعاب وبرمجة الألعاب" class="ipsImage ipsImage_thumbnailed" data-fileid="141975" data-ratio="62.60" data-unique="if14mwgqr" style="width: 400px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_01/-----.thumb.png.5f190c857800237c48a925a4f064f409.png"> </a>
</p>

<p>
	تمر عملية إنشاء الألعاب الإلكترونية بعدة مراحل، ولعل أهم مرحلتين أساسيتين هما مرحلة تصميم اللعبة game design ومرحلة برمجة اللعبة game programming، حيث تركز مرحلة تصميم اللعبة على الجانب الإبداعي وقد تندرج تحتها العديد من التخصصات الفرعية، حيث يتضمن تصميم الألعاب العديد من المهام بدءًا من تحديد فكرة اللعبة، وتصميم مستويات اللعبة ووضع قواعد وخطوات اللعب والتحديات في كل مستوى، إضافة إلى تصميم عوالم اللعبة أي الأماكن التي تجري فيه أحداث اللعبة والتي قد تكون بسيطة وبدائية كغرفة صغيرة أو معقدة كمنظر خارجي في الطبيعة، وتصميم شخصيات اللعبة وملابسها والأسلحة التي تستخدمها.
</p>

<p>
	كما تهتم مرحلة تصميم الألعاب بتحديد التأثيرات الصوتية التي ستصدر عند كل سلوك محدد في اللعبة، وقد تشمل كذلك كتابة قصة اللعبة لجعلها محفزة للعب وغيرها الكثير من التفاصيل المتعلقة بتوصيف كل ما يتعلق بتصميم اللعبة الإلكترونية، ويكون الناتج النهائي لمرحلة التصميم وثيقة تسمى وثيقة تصميم اللعبة <strong>G</strong>ame <strong>D</strong>esign <strong>D</strong>ocument أو اختصارًا <strong>GDM</strong> وهي وثيقة وصفية تتضمن سردًا نصيًا ومخططات عامة وصورًا توصف اللعبة بالكامل ويعتمد عليها كمرجع أساسي لباقي أعضاء فريق تطوير الألعاب.
</p>

<p>
	أما مرحلة تطوير الألعاب فهي تبدأ بعد الانتهاء من تصميم اللعبة وتحديد كل عناصرها ويشمل كتابة كافة التعليمات البرمجية التي تحول التصور الذي وضعه مصمم الألعاب إلى واقع فعلي وإجراء كافة التحسينات والتطويرات والصيانة المطلوبة على اللعبة. الجدير بالذكر أن هذه المراحل المفصلة تعتمد عادة في استوديوهات الألعاب الكبيرة والمتخصصة التي يعمل فيها فريق عمل كامل ومتخصص يضم مبرمجين ومصممين وفنانين وكتاب وغيرهم من الاختصاصيين يعمل كل منهم على تطوير جانب محدد من اللعبة، أما في الألعاب البسيطة التي لا تتضمن الكثير من التعقيدات فستكون الأمور أبسط ويمكنك أن تقوم بنفسك بكافة المراحل لصناعة اللعبة الخاصة بك.
</p>

<p>
	ففي بدايات تطوير الألعاب كان تطوير الألعاب بحاجة لمعرفة قوية بالبرمجة والتقنية، أما اليوم فإن الدخول في هذا المجال سهل بفضل الاعتماد على مصادر جاهزة للحصول على موارد اللعبة من صور وتصاميم مثل Turbo Squid ثم تبرمجها من خلال أحد <a href="https://academy.hsoub.com/programming/game-development/%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">لغات برمجة الألعاب</a> مثل <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> أو <a href="https://academy.hsoub.com/programming/cpp/" rel="">C++</a>‎ أو <a href="https://academy.hsoub.com/programming/c-sharp/" rel="">C#</a>‎ أو باستخدام <a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محركات الألعاب</a> التي تسهل عملية التطوير وتوفر كل ما تحتاجه لإنشاء ألعاب الكترونية متكاملة في مكان واحد وبأقل قدر ممكن من التعليمات البرمجية أو ربما دون الحاجة لكتابة تعليمات برمجية على الإطلاق فبعض برامج تطوير الألعاب تمكنك من صنع لعبة متكاملة من خلال السحب والإفلات.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			هل ترغب في تصميم ألعاب فيديو مشوقة ومثيرة؟
		</p>

		<p class="banner-subtitle">
			وظّف مصمم ألعاب خبير واحصل على أفضل الألعاب الإلكترونية عبر مستقل
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://mostaql.com/freelancers/video-game-developer" rel="external">أضف مشروعك الآن</a>
		</div>
	</div>
</div>

<h2 id="-2">
	خطوات تصميم الألعاب
</h2>

<p>
	يتطلب تصميم الألعاب اتباع مجموعة من الخطوات قد يقوم بها مصمم واحد أو عدة مصممين متخصصين وإليك أبرز خطوات تصميم الألعاب:
</p>

<ul>
	<li>
		عليك في البداية وضع فكرة اللعبة ومن الضروري الاهتمام بهذه المرحلة بشكل خاص، فالبداية الصحيحة هي نصف النجاح لذا احرص على ابتكار أفكار ألعاب ناجحة ومميزة، ودراسة مدى جدواها، وهل ستجذب اللاعبين المستهدفين أم لا؟
	</li>
	<li>
		أنشئ مستند تصميم اللعبة GDD وهو المستند الأساسي الذي يوضح كل إمكانيات ومميزات اللعبة وطريقة اللعب بها، ضع فيه كل ما تحتاج من أوصاف نصية ورسومية وصور تساعد على فهم فكرتك وتوضيحها لباقي أعضاء فريق صناعة الألعاب.
	</li>
	<li>
		صمم تصورًا لبيئة اللعب التي تتكون من جميع العناصر التي تشكل عالم اللعبة مثل الأشخاص والأشجار والأبنية والمركبات والديكورات الداخلية وغيرها، وضع تصورك لشخصيات اللعبة واكتب وصفًا تعريفيًا لكل شخصية.
	</li>
	<li>
		صمم موارد اللعبة game assets ويمكنك كمصمم ألعاب القيام بها بنفسك أو تسليم المهمة لمصمم متخصص في تصميم الشخصيات character designer وهو المصمم المسؤول عن تصميم الجوانب البصرية للعبة باستخدام الأدوات المناسبة للتصميم الرسومي حسب كون اللعبة ثنائية الألعاب 2D أو ثلاثية الأبعاد 3D، ومن أبرز أدواته برنامج مايا Maya وبليندر Blender، كما يمكن للسهولة الاستعانة بمصادر جاهزة كما ذكرنا سابقًا للحصول على التصاميم المطلوبة التي تناسب مع تصور اللعبة.
	</li>
	<li>
		صمم طريقة اللعب وضع قواعد اللعبة والقوانين التي تحكم كيفية تفاعل اللاعبين مع عوالم اللعبة وشخصياتها وحدد طريقة حركة الشخصيات وما الأزرار المسؤولة عن كل حركة وغيرها من التفاصيل الأخرى المتعلقة بطريقة اللعب، وقد يقوم بهذه المهمة مصمم متخصص يسمى مصمم طريقة اللعب game-play designer.
	</li>
	<li>
		صمم مستويات اللعبة ووضع تصورًا لمظهر كل مستوى وأهم العقبات والتحديات التي سيواجهها اللاعب في كل مستوى، ويمكن أن يقوم بهذه الخطوة مصمم متخصص يسمى مصمم المستويات level designer.
	</li>
	<li>
		صمم التأثيرات الصوتية للعبة مثل أصوات إطلاق النار أو هطول المطر أو هبوب الرياح ويمكن أن يعتمد مصمم الألعاب على مكتبات مفتوحة المصدر للحصول على المؤثرات الصوتية التي سيستخدمها في مشاهد اللعبة ومع تحرك الشخصيات.
	</li>
	<li>
		اكتب قصة اللعبة وقد لا تكون هذه الخطوة جزء من مرحلة تصميم الألعاب في استديوهات الألعاب الاحترافية، بل يعمل عليها كاتب أو مصمم متخصص يسمى مصمم السرد narrative designer مهمته كتابة قصة اللعبة التي تضفي عليها الحيوية وصياغة حبكتها الرئيسية وكتابة الحوار بين الشخصيات وطريقة تفاعلهم بطريقة درامية
	</li>
</ul>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير الألعاب
		</p>

		<p class="banner-subtitle">
			ابدأ رحلة صناعة الألعاب ثنائية وثلاثية الأبعاد وابتكر ألعاب ممتعة تفاعلية ومليئة بالتحديات.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/game-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/game-development/" rel=""><img alt="دورة تطوير الألعاب" src="https://academy.hsoub.com/learn/assets/images/courses/game-development.png"></a>
	</div>
</div>

<h2 id="-3">
	برامج مفيدة في تصميم الألعاب
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141976" href="https://academy.hsoub.com/uploads/monthly_2024_01/--.png.461b05ffaf470f036da00b2dfa315928.png" rel=""><img alt="برامج تصميم ألعاب" class="ipsImage ipsImage_thumbnailed" data-fileid="141976" data-ratio="62.60" data-unique="auzeizb8z" style="width: 400px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_01/--.thumb.png.c18eba7bfbcd7f06aa14dad69a752273.png"> </a>
</p>

<p>
	فيما يلي قائمة ببعض البرامج المتنوعة التي يمكن لمصممي الألعاب الاستفادة منها على اختلاف تخصصاتهم ومهامهم سواء في تصميم ملفات تصميم الألعاب GDD أو تصميم العوالم والشخصيات ثنائية الأبعاد وثلاثية أو كتابة قصص الألعاب وغيرها من المهام:
</p>

<ul>
	<li>
		برنامج تصميم ألعاب Blender
	</li>
	<li>
		برنامج تصميم ألعاب Unreal Engine
	</li>
	<li>
		برنامج تصميم ألعاب Unity
	</li>
	<li>
		أداة Ludo.ai لتصميم الألعاب
	</li>
	<li>
		أداة  لتصميم الألعابTwine
	</li>
</ul>

<p>
	لنناقش بمزيد من التفصيل خصائص كل برنامج تصميم ألعاب من هذه البرامج والفائدة التي تقدمها لمصمم الألعاب.
</p>

<h3 id="blender">
	برنامج تصميم ألعاب Blender
</h3>

<p>
	يساعد برنامج بليندر <a href="https://www.blender.org/" rel="external nofollow">Blender</a> مصمم الألعاب على تصميم نماذج رسومية احترافية ثلاثية الأبعاد 3D لألعاب الفيديو والرسوم المتحركة، كما يقدم Blender مجموعة قوية من الأدوات لنمذجة وعرض وإخراج الرسومات، مما يجعله خيارًا مثاليًا لمصممي <a href="https://academy.hsoub.com/programming/game-development/%D8%B4%D8%AE%D8%B5%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D9%86%D8%A7%D8%AC%D8%AD%D8%A9-r2212/" rel="">شخصيات الألعاب</a>، ورغم تعقيد واجهة برنامج Blender إلا أنه مجاني ومفتوح المصدر ومتوافق مع نظام التشغيل ويندوز ولينكس وماك ويضم مجموعة وظائف شاملة يمكن تعلمها مع الوقت والممارسة.
</p>

<h3 id="unrealengine">
	برنامج تصميم ألعاب Unreal Engine
</h3>

<p>
	برنامج <a href="https://www.unrealengine.com/en-US" rel="external nofollow">Unreal Engine</a> أحد أشهر محركات الألعاب طورته شركة تطوير ألعاب الفيديو والبرمجيات Epic Games، وهو يستخدم بشكل أساسي في برمجة الألعاب كما يمكن للمصممين الاستفادة منه في تصميم الألعاب حيث تحتوي على نظام يسمى Blueprint Visual Scripting system يساعد مصمم الألعاب على تصميم مخططات توضح طريقة اللعب وتسلسل أحداث اللعبة.
</p>

<h3 id="unity">
	برنامج تصميم ألعاب Unity
</h3>

<p>
	يعد محرك الألعاب <a href="https://unity.com/" rel="external nofollow">Unity</a> برنامج رائد ومتطور يفيد في تطوير الألعاب التي تستخدم تقنيات الواقع الافتراضي والواقع المعزز ويدعم مجموعة كبيرة من الأنظمة الأساسية بدءًا من الأجهزة المحمولة والويب وحتى أجهزة الحواسيب ووحدات التحكم المتطورة، وهو يوفر للمصممين العديد من الأدوات المضمنة التي تساعدهم في <a href="https://unity.com/solutions/characters" rel="external nofollow">تصميم شخصيات ثلاثية الأبعاد</a> تحاكي الواقع، كما أنه يتضمن أدوات تسهل التعامل مع الرسومات والمقاطع الصوتية وهو يتكامل مع برامج التصميم الرسومي مثل بليندر Blender ومايا MAYA ويسهل تكوين بيئة اللعب، وهو يتطور باستمرار ويضيف المزيد من الميزات مع كل إصدار.
</p>

<h3 id="ludoai">
	أداة Ludo.ai لتصميم الألعاب
</h3>

<p>
	<a href="https://ludo.ai/" rel="external nofollow">Ludo</a> هي منصة مدعومة بالذكاء الاصطناعي تسهل على مصممي الألعاب مهمة إنشاء مستند تصميم اللعبة GDD الذي يعد كما ذكرنا بمثابة العمود الفقري لتصميم اللعبة، وهي منصة مدفوعة لكنها توفر لك فترة تجريبية مجانية لمدة 7 أيام. يمكنك من خلال هذه المنصة بسهولة وضع التصور الكلي للعبة وتحديد كافة التفاصيل المفاهيمية والتقنية لها وتحديد آليات اللعب بها وتصميم مستوياتها وتفاصيل الشخصيات المختلفة وإضافة أي صور أو أيقونات أو موارد أخرى ستسخدمها في اللعبة بشكل منظم وأنيق كما يمكنك تصدير المستند بصيغة ملف pdf ومشاركته مع فريق التطوير المسؤول عن تنفيذ التصميم.
</p>

<h3 id="twine">
	أداة Twine لتصميم الألعاب
</h3>

<p>
	<a href="https://twinery.org/" rel="external nofollow">Twine</a> هي أداة مفيدة مجانية ومفتوحة المصدر تساعد مصممي الألعاب وكتاب قصص الألعاب أو مصممي السرد على كتابة قصص ألعابهم وحبكتها بسهولة كبيرة من خلال توفير واجهة واضحة وسهلة الاستخدام ومدعمة بتوثيق شامل يشرح لك آلية التعامل مع الأداة، وتتميز القصص التي تكتبها بهذه الأداة بكونها منسقة بتنسيق <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> وهذا يسهل لك عرضها على المتصفح ونشرها على الويب ومشاركتها مع فريق صناعة الألعاب الذي تعمل معه.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			أطلق لعبتك الإلكترونية الجديدة بتصميمات وواجهات جذابة
		</p>

		<p class="banner-subtitle">
			استعن بأفضل مطوري الألعاب على خمسات
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://khamsat.com/programming/game-development" rel="external">اطلب خدمتك الآن</a>
		</div>
	</div>
</div>

<h2 id="-4">
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على أفضل برنامج تصميم الألعاب الإلكترونية، ووضحنا بالعموم ماذا يعني تخصص تصميم الألعاب ووجدنا أن هذا التخصص يشمل عدة مهام ومسؤوليات ويهدف بشكل أساسي إلى تحديد فكرة اللعبة وأهدافها وشخصياتها وعوالمها وقواعدها وصياغتها على هيئة مستند GDD يمثل خارطة طريق تصف تصميم اللعبة بشكل شامل ومفصل، كما ذكرنا أهم البرامج والأدوات التي تساعدك في مجال تصميم الألعاب.
</p>

<p>
	وفي الختام تذكر أن تصميم الألعاب الناجح عامل أساسي في نجاح وانتشار أي لعبة إلكترونية، وهو ما يدفع اللاعبين للانجذاب للعبتك وإدمان اللعب بها، لذا عليك أن توليه العناية الكافية قبل الانتقال إلى مرحلة تطوير اللعبة وكتابة الكود البرمجي لها.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%B7%D9%88%D8%B1-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8/" rel="">مطور الألعاب: من هو وما هي مهامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%AA%D8%B7%D9%88%D8%B1%D9%87%D8%A7-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%88%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%AA%D9%87%D8%A7-r2290/" rel="">ألعاب الفيديو: تطورها وأهميتها وخطوات برمجتها</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">أشهر أنواع الألعاب الإلكترونية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D9%86%D8%A7%D8%B9%D8%A9-%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD-r767/" rel="">مدخل إلى صناعة ألعاب المتصفح</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8%D8%9F-r2068/" rel="">ما هي برمجة الألعاب؟</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2227</guid><pubDate>Sat, 20 Jan 2024 12:05:00 +0000</pubDate></item></channel></rss>
