24 ڪلاڪن ۾ مورچا کيڏڻ: ذاتي ترقي جو تجربو

24 ڪلاڪن ۾ مورچا کيڏڻ: ذاتي ترقي جو تجربو

هن آرٽيڪل ۾ آئون پنهنجي ذاتي تجربو بابت ڳالهائيندس زنگ ۾ ننڍڙي راند کي ترقي ڪرڻ. ڪم ڪندڙ ورزن ٺاهڻ ۾ اٽڪل 24 ڪلاڪ لڳي ويا (مان اڪثر شام يا هفتي جي آخر ۾ ڪم ڪندو هوس). راند ختم ٿيڻ کان پري آهي، پر مان سمجهان ٿو ته تجربو ثواب وارو هوندو. مان شيئر ڪندس جيڪي مون سکيو ۽ ڪجھ مشاهدا جيڪي مون ڪيا آھن راند کي شروع کان تعمير ڪرڻ دوران.

Skillbox سفارش ڪري ٿو: ٻن سالن جو عملي ڪورس "مان هڪ پرو ويب ڊولپر آهيان".

اسان توهان کي ياد ڏياريون ٿا: "Habr" جي سڀني پڙهندڙن لاءِ - 10 روبل جي رعايت جڏهن "Habr" پروموشنل ڪوڊ استعمال ڪندي ڪنهن به اسڪل باڪس ڪورس ۾ داخلا.

زنگ ڇو؟

مون هن ٻولي کي چونڊيو آهي ڇاڪاڻ ته مون ان بابت ڪيتريون ئي سٺيون شيون ٻڌيون آهن ۽ مان ڏسان ٿو ته اها راند جي ترقي ۾ وڌيڪ ۽ وڌيڪ مقبول ٿيندي. راند لکڻ کان اڳ، مون کي رسٽ ۾ سادي ايپليڪيشنن کي ترقي ڪرڻ جو ٿورو تجربو هو. اها راند لکڻ دوران مون کي آزادي جو احساس ڏيارڻ لاءِ ڪافي هئي.

راند ڇو ۽ ڪهڙي قسم جي راند؟

رانديون ٺاهڻ مزيدار آهي! مان چاهيان ٿو ته وڌيڪ سبب هجن، پر "گهر" منصوبن لاء آئون انهن عنوانن کي چونڊيندو آهيان جيڪي منهنجي باقاعده ڪم سان تمام ويجهي لاڳاپيل نه آهن. هي ڪهڙي راند آهي؟ مان ڪجهه ٺاهڻ چاهيان ٿو هڪ ٽينس سميوليٽر جيڪو شهرن جي اسڪائي لائنز، زو ٽائيڪون، جيل جي آرڪيٽيڪٽ ۽ پاڻ ٽينس کي گڏ ڪري. عام طور تي، اها هڪ ٽينس اڪيڊمي جي باري ۾ هڪ راند ٿي چڪي آهي جتي ماڻهو راند ڪرڻ لاء ايندا آهن.

ٽيڪنيڪل ٽريننگ

مون کي استعمال ڪرڻ ٿي چاهيو مورچا، پر مون کي خبر نه هئي ته اهو ڪيترو بنيادي ڪم شروع ڪرڻ ۾ وٺندو. مان پکسل شيڊرز لکڻ ۽ ڊريگ-اين-ڊراپ استعمال ڪرڻ نه ٿو چاهيان، تنهنڪري مان تمام لچڪدار حل ڳولي رهيو هوس.

مون کي مفيد وسيلا مليا جيڪي آئون توهان سان حصيداري ڪريان ٿو:

مون ڪيترن ئي زنگ واري راند انجڻ جي ڳولا ڪئي، آخرڪار پسٽن ۽ گيز کي چونڊيو. پوئين پروجيڪٽ تي ڪم ڪندي مون انهن سان ملاقات ڪئي. آخر ۾، مون چونڊيو 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 ضروري آهي ڇاڪاڻ ته ان ۾ ڪوڊ جون سڀئي لائينون شامل آهن. مون فائلن کي الڳ ڪرڻ ۽ ڊاريڪٽري جي جوڙجڪ کي بهتر ڪرڻ ۾ ٿورو وقت گذاريو. اھو اھو آھي جيڪو ان کان پوء نظر آيو:
وسيلن -> هي آهي جتي سڀئي اثاثا آهن (تصويرون)
src
- ادارا
- game_object.rs
دائرو.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 جا فائدا آهن:

  • ڊيٽا منطق کان جدا آهي؛
  • وراثت جي بدران ساخت؛
  • ڊيٽا سينٽرڪ فن تعمير.

ECS ٽن بنيادي تصورن جي خاصيت آهي:

  • entities - اعتراض جو قسم جنهن کي سڃاڻڻ وارو اشارو ڪري ٿو (اهو هڪ رانديگر، هڪ بال، يا ٻيو ڪجهه ٿي سگهي ٿو)؛
  • اجزاء - ادارا انهن مان ٺهيل آهن. مثال - رينڊرنگ جزو، جڳھون ۽ ٻيا. اهي ڊيٽا گودام آهن؛
  • سسٽم - اهي شيون ۽ اجزاء ٻنهي کي استعمال ڪن ٿا، گڏوگڏ رويي ۽ منطق تي مشتمل آهن جيڪي هن ڊيٽا تي ٻڌل آهن. ھڪڙو مثال ھڪڙو رينڊرنگ سسٽم آھي جيڪو سڀني ادارن جي ذريعي رينجرنگ اجزاء سان گڏ ڪري ٿو ۽ رينجرنگ ڪري ٿو.

ان جي مطالعي کان پوء، اهو واضح ٿيو ته ECS هيٺين مسئلن کي حل ڪري ٿو:

  • وراثت جي بدران ترتيب استعمال ڪندي ادارن کي منظم طور تي منظم ڪرڻ لاء؛
  • ڪنٽرول سسٽم ذريعي ڪوڊ جمبل کان نجات حاصل ڪرڻ؛
  • طريقا استعمال ڪندي is_build_mode وائر فريم منطق کي ساڳي جاءِ تي رکڻ لاءِ - رينڊرنگ سسٽم ۾.

اهو ئي ٿيو جيڪو ECS لاڳو ڪرڻ کان پوءِ ٿيو.

وسيلن -> هي آهي جتي سڀئي اثاثا آهن (تصويرون)
src
- اجزاء
-Position.rs
- person.rs
- tennis_court.rs
منزل.rs
- wireframe.rs
- mouse_tracked.rs
- وسيلن
-mouse.rs
- سسٽم
— rendering.rs
- constants.rs
- utils.rs
- world_factory.rs -> دنيا جي ڪارخاني جا ڪم
- main.rs -> مکيه لوپ

اسان ماڻهن کي عدالتن ۾ تفويض ڪريون ٿا

ECS زندگي کي آسان بڻائي ڇڏيو آهي. ھاڻي مون وٽ ھڪڙي منظم طريقي سان ڊيٽا کي ادارن ۾ شامل ڪرڻ ۽ ان ڊيٽا جي بنياد تي منطق شامل ڪرڻ جو طريقو ھو. ۽ اهو، موڙ ۾، اهو ممڪن ڪيو ته عدالتن جي وچ ۾ ماڻهن جي تقسيم کي منظم ڪرڻ.

مون ڇا ڪيو آهي:

  • شامل ڪيل ڊيٽا کي تفويض عدالتن بابت شخص کي؛
  • TennisCourt ۾ ورهايل ماڻهن بابت ڊيٽا شامل ڪيو؛
  • شامل ڪيو ويو CourtChoosingSystem، جيڪو توهان کي ماڻهن ۽ عدالتن جو تجزيو ڪرڻ، دستياب عدالتن کي ڳولڻ ۽ انهن ۾ رانديگرن کي ورهائڻ جي اجازت ڏئي ٿو؛
  • هڪ PersonMovementSystem شامل ڪيو، جيڪو عدالتن ۾ مقرر ڪيل ماڻهن کي ڳولي ٿو، ۽ جيڪڏهن اهي اتي نه آهن، پوء ماڻهن کي موڪلي ٿو جتي انهن جي ضرورت آهي.

24 ڪلاڪن ۾ مورچا کيڏڻ: ذاتي ترقي جو تجربو

ويٺو آهي

مون کي هن سادي راند تي ڪم ڪرڻ واقعي مزو آيو. ان کان علاوه، مون کي خوشي آهي ته مون ان کي لکڻ لاء مورچا استعمال ڪيو، ڇاڪاڻ ته:

  • زنگ توهان کي ڏئي ٿو جيڪو توهان جي ضرورت آهي؛
  • اهو شاندار دستاويز آهي، مورچا ڪافي خوبصورت آهي؛
  • استحڪام ٿڌو آهي؛
  • توهان کي ڪلوننگ، ڪاپي ڪرڻ يا ٻيون ساڳيون ڪارناما ڪرڻ جي ضرورت ناهي، جيڪي مون اڪثر C++ ۾ ڪيا آهن؛
  • اختيارن کي استعمال ڪرڻ بلڪل آسان آھي ۽ غلطين کي چڱي طرح سنڀاليو؛
  • جيڪڏهن پروجيڪٽ مرتب ٿيڻ جي قابل ٿي ويو، پوء 99٪ وقت اهو ڪم ڪري ٿو، ۽ بلڪل ائين جيئن ان کي گهرجي. منهنجو خيال آهي ته مرتب ڪندڙ غلطي جا پيغام بهترين آهن جيڪي مون ڏٺو آهي.

مورچا ۾ راند جي ترقي صرف شروعات آهي. پر اتي اڳ ۾ ئي هڪ مستحڪم ۽ ڪافي وڏي برادري ڪم ڪري رهي آهي هر ڪنهن لاءِ رسٽ کولڻ لاءِ. ان ڪري، مان ٻوليءَ جي مستقبل کي اميد سان ڏسان ٿو، اسان جي گڏيل ڪم جي نتيجن جو منتظر آهيان.

Skillbox سفارش ڪري ٿو:

جو ذريعو: www.habr.com

تبصرو شامل ڪريو