24 گھنٹوں میں مورچا کھیلنا: ذاتی ترقی کا تجربہ

24 گھنٹوں میں مورچا کھیلنا: ذاتی ترقی کا تجربہ

اس مضمون میں میں زنگ میں ایک چھوٹا سا کھیل تیار کرنے کے اپنے ذاتی تجربے کے بارے میں بات کروں گا۔ ورکنگ ورژن بنانے میں تقریباً 24 گھنٹے لگے (میں زیادہ تر شام کو یا ویک اینڈ پر کام کرتا تھا)۔ کھیل ختم ہونے سے بہت دور ہے، لیکن مجھے لگتا ہے کہ تجربہ فائدہ مند ہوگا۔ میں نے جو کچھ سیکھا ہے اور کچھ مشاہدات جو میں نے شروع سے گیم بناتے ہوئے کیے ہیں شیئر کروں گا۔

Skillbox تجویز کرتا ہے: دو سالہ پریکٹیکل کورس "میں ایک PRO ویب ڈویلپر ہوں".

ہم آپ کو یاد دلاتے ہیں: "Habr" کے تمام قارئین کے لیے - "Habr" پروموشنل کوڈ کا استعمال کرتے ہوئے کسی بھی Skillbox کورس میں داخلہ لینے پر 10 rubles کی رعایت۔

زنگ کیوں؟

میں نے اس زبان کا انتخاب کیا ہے کیونکہ میں نے اس کے بارے میں بہت سی اچھی باتیں سنی ہیں اور میں اسے گیم ڈویلپمنٹ میں زیادہ سے زیادہ مقبول ہوتا دیکھ رہا ہوں۔ گیم لکھنے سے پہلے، مجھے رسٹ میں سادہ ایپلی کیشنز تیار کرنے کا بہت کم تجربہ تھا۔ یہ گیم لکھتے ہوئے مجھے آزادی کا احساس دلانے کے لیے کافی تھا۔

کھیل کیوں اور کیسا کھیل؟

کھیل بنانا مزہ ہے! کاش اس کی مزید وجوہات ہوتی، لیکن "گھریلو" پروجیکٹس کے لیے میں ایسے موضوعات کا انتخاب کرتا ہوں جو میرے باقاعدہ کام سے زیادہ گہرا تعلق نہیں رکھتے۔ یہ کیا گیم ہے؟ میں ٹینس سمیلیٹر جیسا کچھ بنانا چاہتا تھا جو سٹیز اسکائی لائنز، زو ٹائکون، جیل آرکیٹیکٹ اور خود ٹینس کو یکجا کرتا ہے۔ عام طور پر، یہ ایک ٹینس اکیڈمی کے بارے میں ایک کھیل نکلا جہاں لوگ کھیلنے آتے ہیں۔

تکنیکی تربیت

میں زنگ استعمال کرنا چاہتا تھا، لیکن مجھے بالکل نہیں معلوم تھا کہ اس کو شروع کرنے میں کتنا بنیادی کام لگے گا۔ میں پکسل شیڈرز نہیں لکھنا چاہتا تھا اور ڈریگ این ڈراپ استعمال نہیں کرنا چاہتا تھا، اس لیے میں انتہائی لچکدار حل تلاش کر رہا تھا۔

مجھے مفید وسائل ملے جو میں آپ کے ساتھ بانٹتا ہوں:

میں نے کئی Rust گیم انجنوں کو تلاش کیا، بالآخر پسٹن اور ggez کا انتخاب کیا۔ پچھلے پروجیکٹ پر کام کرتے ہوئے میں ان سے ملا۔ آخر میں، میں نے ggez کا انتخاب کیا کیونکہ یہ ایک چھوٹی 2D گیم کو لاگو کرنے کے لیے زیادہ موزوں لگتا تھا۔ پسٹن کا ماڈیولر ڈھانچہ ایک نوآموز ڈویلپر (یا کوئی ایسا شخص جو پہلی بار Rust کے ساتھ کام کر رہا ہے) کے لیے بہت پیچیدہ ہے۔

کھیل کی ساخت

میں نے کچھ وقت اس منصوبے کے فن تعمیر کے بارے میں سوچنے میں گزارا۔ پہلا قدم "زمین"، لوگ اور ٹینس کورٹ بنانا ہے۔ لوگوں کو عدالتوں کے چکر لگانا اور انتظار کرنا پڑتا ہے۔ کھلاڑیوں کے پاس ایسی مہارتیں ہونی چاہئیں جو وقت کے ساتھ ساتھ بہتر ہوں۔ اس کے علاوہ، ایک ایڈیٹر ہونا چاہئے جو آپ کو نئے لوگوں اور عدالتوں کو شامل کرنے کی اجازت دیتا ہے، لیکن یہ اب مفت نہیں ہے۔

سب کچھ سوچنے کے بعد، مجھے کام کرنا پڑا.

کھیل کی تخلیق

آغاز: حلقے اور تجرید

میں نے ggez سے ایک مثال لی اور اسکرین پر ایک دائرہ ملا۔ شاندار! اب کچھ تجریدات۔ میں نے سوچا کہ گیم آبجیکٹ کے خیال سے خلاصہ کرنا اچھا ہوگا۔ ہر چیز کو رینڈر اور اپ ڈیٹ کیا جانا چاہیے جیسا کہ یہاں بتایا گیا ہے:

// the game object trait
trait GameObject {
    fn update(&mut self, _ctx: &mut Context) -> GameResult<()>;
    fn draw(&mut self, ctx: &mut Context) -> GameResult<()>;
}
 
// a specific game object - Circle
struct Circle {
    position: Point2,
}
 
 impl Circle {
    fn new(position: Point2) -> Circle {
        Circle { position }
    }
}
impl GameObject for Circle {
    fn update(&mut self, _ctx: &mut Context) -> GameResult<()> {
        Ok(())
    }
    fn draw(&mut self, ctx: &mut Context) -> GameResult<()> {
        let circle =
            graphics::Mesh::new_circle(ctx, graphics::DrawMode::Fill, self.position, 100.0, 2.0)?;
 
         graphics::draw(ctx, &circle, na::Point2::new(0.0, 0.0), 0.0)?;
        Ok(())
    }
}

کوڈ کے اس ٹکڑے نے مجھے اشیاء کی ایک اچھی فہرست دی جسے میں اپ ڈیٹ کر سکتا ہوں اور اتنے ہی اچھے لوپ میں پیش کر سکتا ہوں۔

mpl event::EventHandler for MainState {
    fn update(&mut self, context: &mut Context) -> GameResult<()> {
        // Update all objects
        for object in self.objects.iter_mut() {
            object.update(context)?;
        }
 
        Ok(())
    }
 
    fn draw(&mut self, context: &mut Context) -> GameResult<()> {
        graphics::clear(context);
 
        // Draw all objects
        for object in self.objects.iter_mut() {
            object.draw(context)?;
        }
 
        graphics::present(context);
 
        Ok(())
    }
}

main.rs ضروری ہے کیونکہ اس میں کوڈ کی تمام لائنیں شامل ہیں۔ میں نے فائلوں کو الگ کرنے اور ڈائریکٹری کے ڈھانچے کو بہتر بنانے میں تھوڑا وقت صرف کیا۔ اس کے بعد ایسا لگتا تھا:
وسائل -> یہ وہ جگہ ہے جہاں تمام اثاثے ہیں (تصاویر)
ایسآرسی
--.ہستی n
— game_object.rs
— دائرہ آر ایس
- main.rs -> مین لوپ

لوگ، منزلیں اور تصاویر

اگلا مرحلہ پرسن گیم آبجیکٹ بنانا اور امیجز لوڈ کرنا ہے۔ ہر چیز کو 32*32 ٹائلوں کی بنیاد پر بنایا جانا چاہیے۔

24 گھنٹوں میں مورچا کھیلنا: ذاتی ترقی کا تجربہ

ٹینس کھیلنے کا میدان

اس بات کا مطالعہ کرنے کے بعد کہ ٹینس کورٹ کیسی نظر آتی ہے، میں نے انہیں 4*2 ٹائلوں سے بنانے کا فیصلہ کیا۔ ابتدائی طور پر، اس سائز کی تصویر بنانا، یا 8 الگ الگ ٹائلیں لگانا ممکن تھا۔ لیکن پھر میں نے محسوس کیا کہ صرف دو منفرد ٹائلوں کی ضرورت ہے، اور اس کی وجہ یہ ہے۔

مجموعی طور پر ہمارے پاس ایسی دو ٹائلیں ہیں: 1 اور 2۔

عدالت کا ہر حصہ ٹائل 1 یا ٹائل 2 پر مشتمل ہوتا ہے۔ انہیں معمول کے مطابق یا 180 ڈگری پر پلٹا جا سکتا ہے۔

24 گھنٹوں میں مورچا کھیلنا: ذاتی ترقی کا تجربہ

بنیادی تعمیر (اسمبلی) موڈ

سائٹس، لوگوں اور نقشوں کی رینڈرنگ حاصل کرنے کے بعد، میں نے محسوس کیا کہ ایک بنیادی اسمبلی موڈ کی بھی ضرورت ہے۔ میں نے اسے اس طرح نافذ کیا: جب بٹن دبایا جاتا ہے، تو آبجیکٹ منتخب ہوجاتا ہے، اور کلک اسے مطلوبہ جگہ پر رکھتا ہے۔ لہذا، بٹن 1 آپ کو عدالت کا انتخاب کرنے کی اجازت دیتا ہے، اور بٹن 2 آپ کو ایک کھلاڑی کو منتخب کرنے کی اجازت دیتا ہے۔

لیکن ہمیں اب بھی یاد رکھنے کی ضرورت ہے کہ 1 اور 2 کا کیا مطلب ہے، اس لیے میں نے یہ واضح کرنے کے لیے ایک وائر فریم شامل کیا کہ کون سا اعتراض منتخب کیا گیا ہے۔ یہ ایسا ہی لگتا ہے۔

24 گھنٹوں میں مورچا کھیلنا: ذاتی ترقی کا تجربہ

آرکیٹیکچر اور ری فیکٹرنگ کے سوالات

اب میرے پاس کئی گیم اشیاء ہیں: لوگ، عدالتیں اور فرش۔ لیکن وائر فریموں کے کام کرنے کے لیے، ہر آبجیکٹ کو یہ بتانے کی ضرورت ہے کہ آیا وہ اشیاء خود ڈیموسٹریشن موڈ میں ہیں، یا کوئی فریم آسانی سے کھینچا گیا ہے۔ یہ بہت آسان نہیں ہے۔

مجھے ایسا لگتا تھا کہ فن تعمیر کو اس طرح سے دوبارہ سوچنے کی ضرورت ہے جس سے کچھ حدود کا انکشاف ہوا:

  • ایک ایسی ہستی کا ہونا جو خود کو رینڈر اور اپ ڈیٹ کرتا ہے ایک مسئلہ ہے کیونکہ وہ ہستی "جاننے" کے قابل نہیں ہوگی کہ اسے کیا پیش کرنا ہے - ایک تصویر اور ایک وائر فریم؛
  • انفرادی اداروں کے درمیان خصوصیات اور رویے کے تبادلے کے لیے کسی ٹول کی کمی (مثال کے طور پر is_build_mode پراپرٹی یا رویے کی رینڈرنگ)۔ وراثت کا استعمال ممکن ہو گا، حالانکہ اسے Rust میں لاگو کرنے کا کوئی مناسب طریقہ نہیں ہے۔ جس چیز کی مجھے واقعی ضرورت تھی وہ ترتیب تھی۔
  • لوگوں کو عدالتوں میں تفویض کرنے کے لیے اداروں کے درمیان بات چیت کے لیے ایک ٹول کی ضرورت تھی۔
  • ادارے خود ڈیٹا اور منطق کا مرکب تھے جو تیزی سے قابو سے باہر ہو گئے۔

میں نے کچھ اور تحقیق کی اور فن تعمیر کو دریافت کیا۔ ECS - ہستی کے اجزاء کا نظام، جو عام طور پر گیمز میں استعمال ہوتا ہے۔ ای سی ایس کے فوائد یہ ہیں:

  • ڈیٹا منطق سے الگ ہے؛
  • وراثت کے بجائے ساخت؛
  • ڈیٹا سینٹرک فن تعمیر۔

ECS تین بنیادی تصورات کی طرف سے خصوصیات ہے:

  • entities - شے کی قسم جس سے شناخت کنندہ مراد ہے (یہ کھلاڑی، گیند یا کچھ اور ہو سکتا ہے)؛
  • اجزاء - ادارے ان سے بنے ہیں۔ مثال - رینڈرنگ جزو، مقامات اور دیگر۔ یہ ڈیٹا گودام ہیں؛
  • سسٹمز - وہ اشیاء اور اجزاء دونوں کا استعمال کرتے ہیں، اس کے علاوہ رویے اور منطق پر مشتمل ہوتے ہیں جو اس ڈیٹا پر مبنی ہوتے ہیں۔ ایک مثال ایک رینڈرنگ سسٹم ہے جو رینڈرنگ اجزاء کے ساتھ تمام اداروں کے ذریعے اعادہ کرتا ہے اور رینڈرنگ کرتا ہے۔

اس کا مطالعہ کرنے کے بعد، یہ واضح ہو گیا کہ ECS مندرجہ ذیل مسائل کو حل کرتا ہے:

  • اداروں کو منظم طریقے سے منظم کرنے کے لیے وراثت کے بجائے لے آؤٹ کا استعمال کرنا؛
  • کنٹرول سسٹم کے ذریعے کوڈ کی گڑبڑ سے چھٹکارا حاصل کرنا؛
  • وائر فریم منطق کو ایک ہی جگہ پر رکھنے کے لیے is_build_mode جیسے طریقے استعمال کرنا - رینڈرنگ سسٹم میں۔

ای سی ایس کے نفاذ کے بعد یہی ہوا۔

وسائل -> یہ وہ جگہ ہے جہاں تمام اثاثے ہیں (تصاویر)
ایسآرسی
- اجزاء
--position.rs
— person.rs
— tennis_court.rs
— floor.rs
--.wireframe.rs
— mouse_tracked.rs
- حوالہ جات
—mouse.rs
- نظام
— rendering.rs
— constants.rs
— utils.rs
- world_factory.rs -> ورلڈ فیکٹری کے افعال
- main.rs -> مین لوپ

ہم لوگوں کو عدالتوں میں تفویض کرتے ہیں۔

ECS نے زندگی کو آسان بنا دیا ہے۔ اب میرے پاس اداروں میں ڈیٹا شامل کرنے اور اس ڈیٹا کی بنیاد پر منطق شامل کرنے کا ایک منظم طریقہ تھا۔ اور اس کے نتیجے میں، عدالتوں میں لوگوں کی تقسیم کو منظم کرنا ممکن ہوا۔

میں نے کیا کیا ہے:

  • فرد کو تفویض کردہ عدالتوں کے بارے میں ڈیٹا شامل کیا؛
  • ٹینس کورٹ میں تقسیم شدہ لوگوں کے بارے میں ڈیٹا شامل کیا۔
  • کورٹ چوزنگ سسٹم شامل کیا، جو آپ کو لوگوں اور عدالتوں کا تجزیہ کرنے، دستیاب عدالتوں کا پتہ لگانے اور ان میں کھلاڑیوں کو تقسیم کرنے کی اجازت دیتا ہے۔
  • ایک پرسن موومنٹ سسٹم شامل کیا، جو عدالتوں میں تفویض کردہ لوگوں کو تلاش کرتا ہے، اور اگر وہ وہاں نہیں ہیں، تو لوگوں کو وہاں بھیجتا ہے جہاں انہیں ہونا ضروری ہے۔

24 گھنٹوں میں مورچا کھیلنا: ذاتی ترقی کا تجربہ

اپ میزانی

مجھے اس سادہ گیم پر کام کرنے سے بہت اچھا لگا۔ مزید یہ کہ، مجھے خوشی ہے کہ میں نے اسے لکھنے کے لیے Rust کا استعمال کیا، کیونکہ:

  • زنگ آپ کو وہ چیز دیتا ہے جس کی آپ کو ضرورت ہے۔
  • اس میں بہترین دستاویزات ہیں، زنگ کافی خوبصورت ہے۔
  • مستقل مزاجی ٹھنڈی ہے؛
  • آپ کو کلوننگ، کاپی یا اسی طرح کے دیگر اعمال کا سہارا لینے کی ضرورت نہیں ہے، جو میں اکثر C++ میں کرتا تھا؛
  • اختیارات استعمال کرنے میں بہت آسان ہیں اور غلطیوں کو بہت اچھی طرح سے ہینڈل کرتے ہیں۔
  • اگر پروجیکٹ مرتب کرنے کے قابل تھا، تو 99% وقت یہ کام کرتا ہے، اور بالکل اسی طرح جیسے اسے ہونا چاہیے۔ میرے خیال میں کمپائلر ایرر میسیجز سب سے بہتر ہیں جو میں نے دیکھا ہے۔

مورچا میں کھیل کی ترقی ابھی شروع ہو رہی ہے۔ لیکن پہلے سے ہی ایک مستحکم اور کافی بڑی کمیونٹی موجود ہے جو زنگ کو سب کے لیے کھولنے کے لیے کام کر رہی ہے۔ اس لیے میں زبان کے مستقبل کو امید کے ساتھ دیکھتا ہوں، اپنے مشترکہ کام کے نتائج کا منتظر ہوں۔

Skillbox تجویز کرتا ہے:

ماخذ: www.habr.com

نیا تبصرہ شامل کریں