24 soat ichida Rust o'ynash: shaxsiy rivojlanish tajribasi

24 soat ichida Rust o'ynash: shaxsiy rivojlanish tajribasi

Ushbu maqolada men Rustda kichik o'yinni rivojlantirish bo'yicha shaxsiy tajribam haqida gapiraman. Ishchi versiyani yaratish uchun taxminan 24 soat vaqt ketdi (men asosan kechqurun yoki dam olish kunlari ishladim). O'yin tugamagan, ammo tajriba foydali bo'ladi deb o'ylayman. Men o'rganganlarim va o'yinni noldan qurishda qilgan ba'zi kuzatishlarim bilan o'rtoqlashaman.

Skillbox tavsiya qiladi: Ikki yillik amaliy kurs "Men PRO veb-dasturchisiman".

Sizga eslatib o'tamiz: "Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Nima uchun Rust?

Men bu tilni tanladim, chunki u haqida ko‘p yaxshi gaplarni eshitganman va o‘yin ishlab chiqishda u tobora ommalashib borayotganini ko‘raman. O'yinni yozishdan oldin Rust-da oddiy ilovalarni ishlab chiqishda kam tajribaga ega bo'ldim. Bu o'yinni yozish paytida menga erkinlik hissi berish uchun etarli edi.

Nima uchun o'yin va qanday o'yin?

O'yinlar yaratish qiziqarli! Ko'proq sabablar bo'lishini istardim, lekin "uy" loyihalari uchun men muntazam ishim bilan chambarchas bog'liq bo'lmagan mavzularni tanlayman. Bu qanaqa o'yin? Men Cities Skylines, Zoo Tycoon, Prison Architect va tennisning o'zini birlashtirgan tennis simulyatoriga o'xshash narsani yaratmoqchi edim. Umuman olganda, bu odamlar o'ynash uchun keladigan tennis akademiyasi haqidagi o'yin bo'lib chiqdi.

Texnik tayyorgarlik

Men Rust-dan foydalanmoqchi edim, lekin uni boshlash uchun qancha ish kerakligini bilmasdim. Men piksel shaderlarini yozishni va drag-n-drop-dan foydalanishni xohlamadim, shuning uchun men eng moslashuvchan echimlarni qidirdim.

Men siz bilan baham ko'radigan foydali manbalarni topdim:

Men bir nechta Rust o'yin dvigatellarini o'rganib chiqdim, natijada Piston va ggezni tanladim. Oldingi loyiha ustida ishlayotganimda ularga duch keldim. Oxir-oqibat, men ggezni tanladim, chunki u kichik 2D o'yinni amalga oshirish uchun ko'proq mos tuyuldi. Pistonning modulli tuzilishi yangi boshlovchi (yoki Rust bilan birinchi marta ishlayotgan kishi) uchun juda murakkab.

O'yin tuzilishi

Men loyihaning arxitekturasi haqida bir oz vaqt o'tkazdim. Birinchi qadam - "er", odamlar va tennis kortlarini qilish. Odamlar sudlar bo'ylab harakatlanishlari va kutishlari kerak. O'yinchilar vaqt o'tishi bilan yaxshilanadigan ko'nikmalarga ega bo'lishlari kerak. Bundan tashqari, yangi odamlar va sudlarni qo'shish imkonini beruvchi muharrir bo'lishi kerak, ammo bu endi bepul emas.

Hammasini yaxshilab o‘ylab, ishga kirishdim.

O'yin yaratish

Boshlanish: doiralar va abstraktsiyalar

Men ggezdan misol oldim va ekranda doira oldim. Ajoyib! Endi ba'zi abstraktlar. Men o'yin ob'ekti g'oyasidan mavhum bo'lishni yaxshi deb o'yladim. Har bir ob'ekt bu erda ko'rsatilganidek ko'rsatilishi va yangilanishi kerak:

// 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(())
    }
}

Ushbu kod bo'lagi menga yangilash va teng darajada yaxshi tsiklda ko'rsatishim mumkin bo'lgan ob'ektlarning yaxshi ro'yxatini berdi.

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 kerak, chunki u barcha kod satrlarini o'z ichiga oladi. Men fayllarni ajratish va katalog tuzilishini optimallashtirish uchun bir oz vaqt sarfladim. Shundan keyin shunday ko'rinish oldi:
resurslar -> bu erda barcha aktivlar (rasmlar)
src
- sub'ektlar
— game_object.rs
— doira.rs
— main.rs -> asosiy tsikl

Odamlar, pollar va tasvirlar

Keyingi qadam Person o'yin ob'ektini yaratish va tasvirlarni yuklashdir. Har bir narsa 32 * 32 plitkalar asosida qurilishi kerak.

24 soat ichida Rust o'ynash: shaxsiy rivojlanish tajribasi

Tennis kortlari

Tennis kortlari qanday ko'rinishini o'rganib chiqib, men ularni 4 * 2 plitkadan yasashga qaror qildim. Dastlab, bu o'lchamdagi tasvirni yaratish yoki 8 ta alohida plitkalarni birlashtirish mumkin edi. Ammo keyin men faqat ikkita noyob plitka kerakligini angladim va buning sababi.

Hammasi bo'lib bizda ikkita bunday plitka bor: 1 va 2.

Sudning har bir qismi kafel 1 yoki plitka 2 dan iborat. Ular odatdagidek yotqizilishi yoki 180 gradusga aylantirilishi mumkin.

24 soat ichida Rust o'ynash: shaxsiy rivojlanish tajribasi

Asosiy qurilish (montaj) rejimi

Saytlarni, odamlarni va xaritalarni ko'rsatishga erishganimdan so'ng, asosiy yig'ish rejimi ham kerakligini angladim. Men buni shunday amalga oshirdim: tugma bosilganda ob'ekt tanlanadi va bosish uni kerakli joyga joylashtiradi. Shunday qilib, 1-tugma sizga kortni, 2-tugma esa o'yinchini tanlash imkonini beradi.

Lekin biz hali ham 1 va 2 nimani anglatishini eslab qolishimiz kerak, shuning uchun qaysi ob'ekt tanlanganligini aniq qilish uchun men simli ramka qo'shdim. Bu shunday ko'rinadi.

24 soat ichida Rust o'ynash: shaxsiy rivojlanish tajribasi

Arxitektura va refaktoring savollari

Endi menda bir nechta o'yin ob'ektlari bor: odamlar, sudlar va pollar. Ammo simli ramkalar ishlashi uchun har bir ob'ekt ob'ektiga ob'ektlarning o'zi namoyish rejimidami yoki oddiygina ramka chizilganmi yoki yo'qligini aytish kerak. Bu juda qulay emas.

Menimcha, arxitekturani ba'zi cheklovlarni ochib beradigan tarzda qayta ko'rib chiqish kerak edi:

  • O'zini ko'rsatadigan va yangilaydigan ob'ektga ega bo'lish muammodir, chunki bu ob'ekt nimani ko'rsatishi kerakligini - tasvir va sim ramkani "bila olmaydi";
  • individual ob'ektlar o'rtasida xususiyatlar va xatti-harakatlarni almashish uchun vositaning yo'qligi (masalan, is_build_mode xususiyati yoki xatti-harakatni ko'rsatish). Rustda uni amalga oshirishning to'g'ri yo'li yo'q bo'lsa-da, merosdan foydalanish mumkin edi. Menga kerak bo'lgan narsa tartib edi;
  • sudlarga odamlarni tayinlash uchun sub'ektlar o'rtasidagi o'zaro aloqa vositasi kerak edi;
  • ob'ektlarning o'zi tezda nazoratdan chiqib ketgan ma'lumotlar va mantiq aralashmasi edi.

Men ko'proq izlanishlar olib bordim va arxitekturani kashf qildim ECS - Entity Component System, bu odatda o'yinlarda qo'llaniladi. ECS ning afzalliklari:

  • ma'lumotlar mantiqdan ajratilgan;
  • meros o'rniga tarkib;
  • ma'lumotlarga asoslangan arxitektura.

ECS uchta asosiy tushuncha bilan tavsiflanadi:

  • ob'ektlar - identifikator nazarda tutilgan ob'ekt turi (bu o'yinchi, to'p yoki boshqa narsa bo'lishi mumkin);
  • komponentlar - sub'ektlar ulardan tashkil topgan. Misol - render komponenti, joylashuv va boshqalar. Bu ma'lumotlar omborlari;
  • tizimlar - ular ikkala ob'ekt va komponentlardan foydalanadi, shuningdek, ushbu ma'lumotlarga asoslangan xatti-harakatlar va mantiqni o'z ichiga oladi. Bunga misol qilib ko'rsatish komponentlari bilan barcha ob'ektlarni takrorlaydigan va ko'rsatishni amalga oshiradigan renderlash tizimidir.

Uni o'rganib chiqqandan so'ng, ECS quyidagi muammolarni hal qilishi aniq bo'ldi:

  • ob'ektlarni tizimli ravishda tashkil qilish uchun meros o'rniga tartibdan foydalanish;
  • boshqaruv tizimlari orqali kod chalkashliklaridan xalos bo'lish;
  • simli ramka mantig'ini bir joyda - renderlash tizimida saqlash uchun is_build_mode kabi usullardan foydalanish.

Bu ECSni amalga oshirgandan keyin sodir bo'ldi.

resurslar -> bu erda barcha aktivlar (rasmlar)
src
- komponentlar
—pozitsiya.rs
— shaxs.rs
— tennis_court.rs
— qavat.rs
- wireframe.rs
— mouse_tracked.rs
- resurslar
—mouse.rs
- tizimlar
— rendering.rs
— doimiylar.rs
— utils.rs
— world_factory.rs -> jahon zavodi funksiyalari
— main.rs -> asosiy tsikl

Biz odamlarni sudlarga topshiramiz

ECS hayotni osonlashtirdi. Endi men ob'ektlarga ma'lumotlarni qo'shish va shu ma'lumotlarga asoslangan mantiqni qo'shishning tizimli usuliga ega edim. Bu esa, o‘z navbatida, sudlar o‘rtasida odamlarni taqsimlashni tashkil etish imkonini berdi.

Men nima qildim:

  • tayinlangan sudlar to'g'risidagi ma'lumotlarni shaxsga qo'shgan;
  • TennisCourt-ga taqsimlangan odamlar haqida ma'lumot qo'shildi;
  • odamlar va sudlarni tahlil qilish, mavjud sudlarni aniqlash va ularga o'yinchilarni tarqatish imkonini beruvchi CourtCoosingSystem qo'shildi;
  • sudlarga tayinlangan odamlarni qidiradigan va agar ular bo'lmasa, odamlarni kerakli joyga yuboradigan PersonMovementSystem qo'shildi.

24 soat ichida Rust o'ynash: shaxsiy rivojlanish tajribasi

Xulosa

Ushbu oddiy o'yin ustida ishlash menga juda yoqdi. Bundan tashqari, men Rustni yozishda foydalanganimdan xursandman, chunki:

  • Rust sizga kerakli narsani beradi;
  • u mukammal hujjatlarga ega, Rust juda oqlangan;
  • mustahkamlik salqin;
  • klonlash, nusxa ko'chirish yoki boshqa shunga o'xshash harakatlarga murojaat qilishingiz shart emas, men buni tez-tez C++ da qildim;
  • Variantlar ishlatish uchun juda oson va xatolarni juda yaxshi hal qiladi;
  • agar loyihani tuzish mumkin bo'lsa, u holda 99% vaqt ishlaydi va aynan shunday bo'ladi. Menimcha, kompilyator xato xabarlari men ko'rgan eng yaxshisidir.

Rust-da o'yinni rivojlantirish endi boshlanmoqda. Ammo Rustni hamma uchun ochish uchun allaqachon barqaror va etarlicha katta jamoa mavjud. Binobarin, men til kelajagiga nekbinlik bilan qarayman, umumiy ishimiz natijasini intiqlik bilan kutaman.

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish