بدلا من المقدمة
في مدرسة أوديسا ، يستخدم طلاب الصف الثامن في دروس علوم الكمبيوتر بيئة تطوير النظام الأساسي عبر نظام Lazarus (
الموقع الرسمي ) ، والتي تبدو تشبه إلى حد كبير المحبوب من قبل العديد من دلفي ، وذلك باستخدام إصدار Object Pascal الذي يطلق عليه Free Pascal ويبسط حقًا عملية إدخال البرمجة.
لكن الأطفال لا يهتمون بكتابة برنامج لحساب الجاذبية باستخدام الصيغة F = mg ، والتي لا تزال غير مفهومة بالنسبة لهم. يريد كل الأطفال الذين حاولت تدريس البرمجة تقريبًا كتابة لعبة من الدرس الأول. لحسن الحظ ، لازاروس رائع لكتابة الألعاب البسيطة.
صحيح ، لإنشاء نقوش متحركة ، كنت بحاجة إلى مكون يعرض جزءًا تعسفيًا من الصورة (والذي يصور عدة إسقاطات مختلفة من نفس الشخصية في مراحل مختلفة من الحركة) ، ولكن لا يوجد مثل هذا المكون في التسليم القياسي. اتضح أنه من السهل جدًا كتابتها بنفسك ، وأريد أن أتحدث عن هذه التكنولوجيا في هذه المقالة.
لعرض محتوى رسومي ممتع بدلاً من مجموعة أعمال جافة من المكونات القياسية في Lazarus (كما هو الحال في دلفي) ، هناك 3 مكونات في علامة التبويب "إضافية":
- TImage (عرض صورة من ملف تعسفي) ؛
- TShape (عرض واحد من العديد من الرسوم البيانية المحددة مسبقًا) ؛
- TPaintBox (عرض لوحة قماشية يمكنك الرسم عليها برمجيًا).
الشيء الأكثر إثارة للدهشة بالنسبة للطالب هو تحميل شبح صغير في TImage وكتابة برنامج لنقله حول الشاشة - وفقًا لأحداث الماوس / لوحة المفاتيح ، تلقائيًا في حلقة أو تلقائيًا بواسطة حدث من جهاز توقيت.
بمجرد أن يبدأ هذا العمل ، يكون لدى الطالب السؤال الشرعي التالي: هل من الممكن تحريك الشخصية؟ وهل من الممكن أن يجعله لا ينظر إلينا باستمرار ، لكنه يتحول في الاتجاه الذي يتزامن مع اتجاه الحركة؟
على الويب ، يمكنك العثور على عدد كبير من الصور الجاهزة للاستخدام في تطوير اللعبة. تم تصميم العديد من الشخصيات مسبقًا في العديد من التوقعات وعدة إطارات للرسوم المتحركة (على سبيل المثال ،
هنا في هذا الموقع ).
فيما يلي مثال على الصورة حيث يتم ترتيب العفاريت في شكل جدول ، حيث يتوافق كل صف مع إسقاط معين ، ويتوافق كل عمود مع مرحلة معينة من الرسوم المتحركة:
لماذا الكثير من الصور؟لعرض مثل هذه العفريت ، يكفي وضع مكون بسيط على الشاشة لا يعرض الصورة بأكملها ، ولكن جزءًا واحدًا منها فقط ؛ وبعد ذلك ، عند تغيير إزاحة الجزء المحدد أفقيًا وعموديًا ، يمكنك جعل الحرف ينعطف في اتجاهات مختلفة ويقوم بحركات دورية (على سبيل المثال ، الأجنحة المتدحرجة أو الخطوات مع الأرجل). غالبًا ما يتم استخدام هذه التقنية في تطوير الويب: يتم وضع مجموعات بسيطة من الرموز لرسومات الأعمال في ملف واحد وعرضها في أماكن مختلفة على صفحات ذات إزاحات مختلفة ، مما يعطي انطباعًا بصور مختلفة.
لسوء الحظ ، لا يسمح مكون TImage ، وهو جزء من توزيع Lazarus (و Delphi) القياسي ، بإظهار جزء تعسفي لصورة ما: تغيير خصائصه ، يمكننا إجبارها على إظهار الصورة بأكملها فقط ، الزاوية العليا اليسرى أو الجزء المركزي. لعرض جزء تعسفي من الصورة المعرفة بواسطة الإزاحة والأبعاد على طول كلا المحورين ، تحتاج إلى مكون آخر. ولكن ، كما اتضح ، القيام بنفسك في لعازر ليس بالأمر الصعب على الإطلاق!
إنشاء مكون جديد
كتعليمات لإنشاء المكونات ، استخدمت
الدليل الرسمي .
كل شيء مكتوب هناك بتفاصيل كافية ؛ الازدواجية لا معنى له. سوف أتناول فقط بعض النقاط.
1. لا يتيح لنا معالج Project القياسي إنشاء حزمة ، وللوصول بطريقة ما إلى المحرر ، حدد "مشروع جديد" (في النسخة الروسية - "مشروع جديد")
ثم "التطبيق" (في النسخة الروسية - "التطبيق"):
2. التصرف وفقًا للتعليمات ، في قائمة "الحزمة" (في النسخة الروسية - "الحزمة") ، حدد العنصر العلوي "حزمة جديدة ..." (في النسخة الروسية - "حزمة جديدة ...") ، حدد اسم الملف والمسار لحفظ. قمت بتسمية الحزمة الجديدة "لعبة" ووضعتها في مجلد منفصل بنفس الاسم:
لقد قمت بإنشاء مجلد منفصل Lazarus / Cmp مع توقع أن يكون لدي عدة حزم مختلفة مع المكونات ، وأنشأت بالفعل مجلد "Game" في هذا المجلد.
إذا تم كل شيء بشكل صحيح ، يجب أن تظهر نافذة لحزمة جديدة (فارغة حتى الآن) على الشاشة.
3. تابع مرة أخرى وفقًا للتعليمات ، لإنشاء مكون جديد في نافذة الحزمة ، انقر فوق الزر "إضافة" (في النسخة الروسية - "إضافة") وحدد "مكون جديد" في القائمة المنسدلة (في النسخة الروسية - "مكون جديد"):
نحدد TCustomImage كفئة سلف - يتم استخدام هذه الفئة فعليًا لتنفيذ مكون TImage ، ولكنها تختلف عن ذلك لأنه لا يحتوي على خصائص منشورة ويسمح لنا بتحديد مجموعة الخصائص التي ستكون متاحة في المصمم لمكوننا.
ما هي الخصائص المنشورة؟بالنسبة لأولئك الذين لا يعرفون هذا ، سأوضح أن المنشور هو جزء من الفصل (مثل العام) الذي يصف الخصائص الجديدة أو يشير ببساطة إلى الخصائص الموروثة التي يجب أن تكون متاحة في محرر الخصائص المرئية في مرحلة تطوير البرنامج. الطبقات المتوسطة لا تعلن أي شيء في هذا القسم ، تاركة الفرصة للمبرمج لإبراز ما يراه مناسبًا. لذلك ، لا تضيف فئة TImage أي وظيفة ، ولكنها تضع فقط عددًا من الخصائص الموروثة من أصل TCustomImage في القسم المنشور. نحتاج إلى إخفاء بعض هذه الخصائص ، لذلك سنرث أيضًا المكون الجديد من TCustomImage ونعرض فقط ما لا يتعارض مع منطق المكون الخاص بنا المنشور.
أيقونة (أيقونة) للمكونسيكون من الجيد رسم رمز شخصي لكل مكون جديد ، ولكن نظرًا لأن مهمتنا تتمثل في إظهار مدى بساطته ، فسنترك هذا الحقل فارغًا ، مما سيؤدي إلى الرمز القياسي المستخدم في Lazarus / Delphi لجميع المكونات محلية الصنع على شريط الأدوات .
بالمناسبة ، تحتوي التعليمات المذكورة أعلاه على قسم منفصل حول إنشاء رموز للمكونات - وهذا مخصص لأولئك الذين لا يرضون بالرمز "الافتراضي".
بعد ملء جميع الحقول ، انقر فوق الزر "إنشاء مكون جديد" (في النسخة الروسية - "إنشاء مكون جديد").
أضف رمزًا للمكون الجديد.
مباشرة بعد إنشاء مكون جديد ، فإن الكود المصدر الخاص به يشبه هذا:
unit ImageFragment; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs; type TImageFragment = class(TCustomImage) private protected public published end; procedure Register; implementation procedure Register; begin RegisterComponents('Game', [TImageFragment]); end; end.
كما هو متوقع ، إعلان الفصل فارغ تمامًا ، ولا يوجد أي تطبيق على الإطلاق. كل ما هو وظيفة تسجيل المكون في علامة التبويب "لعبة".
نحتاج إلى إضافة العديد من الخصائص المنشورة الموروثة ، وإنشاء اثنين من وظائفنا الافتراضية وإعادة تعريف وظيفة واحدة. لنبدأ!
0. في قسم الاستيراد ، نحتاج إلى وحدتين إضافيتين: ExtCtrls و LCLProc - إضافتهما إلى قسم الاستخدامات:
uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLProc;
1. أضف قائمة خصائص منشورة تشبه تمامًا مكون TImage ، باستثناء بعض الخصائص التي تتيح لك تغيير حجم وموضع الصورة:
published property AntialiasingMode; property Align; property Anchors;
من أجل الإقناع ، لم أحذف ، لكنني علّقت تلك الخصائص الموجودة في مكون TImage ، ولكنها ستتدخل في مكون TImageFragment الجديد.
2. قم بإضافة خاصيتين جديدتين إلى إعلان الفئة لتعيين إزاحة الصورة الأفقية والرأسية:
private FOffsetX: Integer; FOffsetY: Integer; procedure SetOffsetX(AValue: Integer); procedure SetOffsetY(AValue: Integer); published property OffsetX: Integer read FOffsetX write SetOffsetX default 0; property OffsetY: Integer read FOffsetY write SetOffsetY default 0;
ولا تنس أن تضيف إجراءين معلنين لتنفيذ الفصل:
implementation procedure TImageFragment.SetOffsetX(AValue: Integer); begin if FOffsetX = AValue then exit; FOffsetX := AValue; PictureChanged(Self); end; procedure TImageFragment.SetOffsetY(AValue: Integer); begin if FOffsetY = AValue then exit; FOffsetY := AValue; PictureChanged(Self); end;
3. نعيد تعريف الوظيفة الافتراضية DestRect:
public function DestRect: TRect; override;
ويضيف تنفيذه إلى تنفيذ الفصل:
function TImageFragment.DestRect: TRect; begin Result := inherited DestRect(); if (FOffsetX <> 0) or (FOffsetY <> 0) then LCLProc.OffsetRect(Result, -FOffsetX, -FOffsetY); end;
تجميع الحزمة وإعادة بناء Lazarus
1. في نافذة الحزمة ، انقر على زر "ترجمة" (في النسخة الروسية - "ترجمة"). إذا تم كل شيء بشكل صحيح ، فستظهر رسالة خضراء حول الترجمة الناجحة في نافذة الرسالة ؛ وإذا لم يكن الأمر كذلك ، فستكون الرسالة صفراء أو حمراء.
2. في نفس النافذة ، انقر فوق الزر "استخدام" (في النسخة الروسية - "الاستخدام") وحدد العنصر "تثبيت" الثاني في القائمة المنسدلة (في النسخة الروسية - "التثبيت"). سيقدم البرنامج لإعادة إنشاء IDE وإعادة تشغيله - نحن نوافق على:

3. بعد إعادة التشغيل ، ستظهر علامة تبويب "لعبة" جديدة على شريط الأدوات ، وعلى أيقونة المكون الجديد لدينا.
بدلا من الكلمة الأخيرة
في المقالة التالية لـ
Lazarus - رسم متحرك بسيط يستخدم مكون TImageFragment ، تحدثت عن كيفية استخدام هذا المكون - في غضون 5 دقائق ، أنشئ نافذة يتحرك فيها الشخص المتحرك في اتجاهات مختلفة ويدور في اتجاه الحركة.
إذا كان الموضوع مثيرًا للاهتمام للقراء ، فيمكنني استكمال هذه السلسلة بمقال عن كيف ، بعد قضاء بعض الوقت ، يمكنك على سبيل المثال إنشاء ملعب لكرة القدم مع اثنين من لاعبي كرة القدم الذين يتحكمون بلوحة المفاتيح.
وإذا كان هناك ما يكفي من الوقت والرغبة - سأحاول كتابة خوارزميات مختلفة للتحكم في الشخصيات (مثل لاعبي كرة القدم) وترتيب المسابقات بينهما!