Бозии Rust дар тӯли 24 соат: таҷрибаи рушди шахсӣ

Бозии Rust дар тӯли 24 соат: таҷрибаи рушди шахсӣ

Дар ин мақола ман дар бораи таҷрибаи шахсии худ дар бораи таҳияи бозии хурд дар Rust сӯҳбат хоҳам кард. Барои эҷоди версияи корӣ тақрибан 24 соат лозим шуд (ман асосан дар шом ё рӯзҳои истироҳат кор мекардам). Бозӣ ба анҷом нарасидааст, аммо ман фикр мекунам, ки таҷриба фоидаовар хоҳад буд. Ман чизҳои омӯхтаам ва баъзе мушоҳидаҳоеро, ки ҳангоми сохтани бозӣ аз сифр гирифта будам, нақл мекунам.

Skillbox тавсия медиҳад: Курси дусолаи амалй "Ман таҳиягари веби PRO ҳастам".

Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".

Чаро Rust?

Ман ин забонро интихоб кардам, зеро дар бораи он бисёр чизҳои хуб шунидаам ва мебинам, ки он дар таҳияи бозӣ торафт маъмултар мешавад. Пеш аз навиштани бозӣ, ман дар таҳияи барномаҳои оддӣ дар Rust таҷрибаи кам доштам. Ин танҳо кофӣ буд, ки ҳангоми навиштани бозӣ ба ман ҳисси озодӣ диҳад.

Чаро бозӣ ва чӣ гуна бозӣ?

Сохтани бозиҳо шавқовар аст! Кош сабабҳои зиёд мебуданд, аммо барои лоиҳаҳои «хона» ман мавзӯъҳоеро интихоб мекунам, ки бо кори муқаррарии ман хеле зич алоқаманд нестанд. Ин чӣ бозӣ аст? Ман мехостам чизе монанди симулятори теннис созам, ки Cities Skylines, Zoo Tycoon, Prison Architect ва худи теннисро муттаҳид мекунад. Умуман, ин бозӣ дар бораи академияи теннис буд, ки одамон барои бозӣ меоянд.

Омӯзиши техникӣ

Ман мехостам, ки Rust-ро истифода барам, аммо ман дақиқ намедонистам, ки барои оғоз кардани он чӣ қадар замина лозим аст. Ман намехостам, ки шейдерҳои пиксел нависам ва drag-n-drop -ро истифода барам, аз ин рӯ ман ҳалли чандиртаринро меҷӯям.

Ман захираҳои муфидро ёфтам, ки бо шумо мубодила мекунам:

Ман якчанд муҳаррикҳои бозии Rust-ро омӯхтам ва дар ниҳоят Piston ва ggez-ро интихоб кардам. Ман ба онҳо ҳангоми кор дар лоиҳаи қаблӣ дучор омадам. Дар ниҳоят, ман ggez-ро интихоб кардам, зеро он барои татбиқи бозии хурди 2D мувофиқтар менамуд. Сохтори модулии поршен барои як таҳиягари навкор (ё касе, ки бори аввал бо Rust кор мекунад) хеле мураккаб аст.

Сохтори бозӣ

Ман чанд вақт дар бораи меъмории лоиҳа фикр мекардам. Қадами аввал сохтани «замин», одамон ва кортҳои теннис аст. Одамон бояд дар атрофи судҳо ҳаракат кунанд ва интизор шаванд. Бозингарон бояд малакаҳое дошта бошанд, ки бо мурури замон такмил меёбанд. Илова бар ин, бояд муҳаррир бошад, ки ба шумо имкон медиҳад, ки одамони нав ва судҳоро илова кунед, аммо ин дигар ройгон нест.

Ҳама чизро хуб фикр карда, ба кор даромадам.

Эҷоди бозӣ

Оғоз: доираҳо ва абстраксияҳо

Ман аз ггез мисол гирифта, дар экран доира пайдо кардам. Аҷиб! Акнун баъзе абстраксияҳо. Ман фикр мекардам, ки аз идеяи объекти бозӣ абстракт кардан хуб аст. Ҳар як объект бояд тавре ки дар ин ҷо зикр шудааст, навсозӣ ва навсозӣ карда шавад:

// 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 зарур аст, зеро он тамоми сатрҳои кодро дар бар мегирад. Ман вақти каме барои ҷудо кардани файлҳо ва оптимизатсияи сохтори директория сарф кардам. Ин аст он чизе ки баъд аз он чунин менамуд:
захираҳо -> ин ҷо ҳама дороиҳо ҳастанд (тасвирҳо)
СРС
- субъектҳо
— game_object.rs
— доира
— main.rs -> ҳалқаи асосӣ

Одамон, фаршҳо ва тасвирҳо

Қадами навбатӣ сохтани объекти бозии Person ва бор кардани тасвирҳо мебошад. Хама чиз бояд дар асоси плитаи 32*32 сохта шавад.

Бозии Rust дар тӯли 24 соат: таҷрибаи рушди шахсӣ

Кортҳои теннис

Баъди омух-тани ​​чй гуна будани кортхои теннис ман карор додам, ки онхоро аз 4*2 плитка созам. Дар аввал тасвири чунин андоза ё якҷоя кардани 8 плитаи алоҳида имконпазир буд. Аммо баъд ман фаҳмидам, ки танҳо ду плиткаи беназир лозим аст ва ин аст, ки чаро.

Дар маҷмӯъ мо ду чунин плитка дорем: 1 ва 2.

Ҳар як қисмати суд аз плиткаи 1 ё плиткаи 2 иборат аст. Онҳоро метавон ҳамчун муқаррарӣ гузоштан ё 180 дараҷа буриш кардан мумкин аст.

Бозии Rust дар тӯли 24 соат: таҷрибаи рушди шахсӣ

Режими сохтмони асосй (монтаж).

Пас аз он ки ман тавонистам ба намоиш додани сайтҳо, одамон ва харитаҳо ноил шавам, ман фаҳмидам, ки режими асосии васлкунӣ низ лозим аст. Ман инро чунин амалӣ кардам: вақте ки тугма пахш карда мешавад, объект интихоб мешавад ва клик онро дар ҷои дилхоҳ ҷойгир мекунад. Ҳамин тавр, тугмаи 1 ба шумо имкон медиҳад, ки майдонро интихоб кунед ва тугмаи 2 ба шумо имкон медиҳад, ки бозигарро интихоб кунед.

Аммо мо то ҳол бояд дар хотир дошта бошем, ки 1 ва 2 чӣ маъно дорад, аз ин рӯ ман як симро илова кардам, то равшан шавад, ки кадом объект интихоб шудааст. Чунин ба назар мерасад.

Бозии Rust дар тӯли 24 соат: таҷрибаи рушди шахсӣ

Саволҳои меъморӣ ва рефакторинг

Ҳоло ман якчанд объектҳои бозӣ дорам: одамон, судҳо ва фаршҳо. Аммо барои кор кардани чаҳорчӯбаҳои симдор, ба ҳар як объекти объект бояд гуфт, ки оё худи объектҳо дар ҳолати намоишӣ ҳастанд ё чаҳорчӯба оддӣ кашида шудааст. Ин хеле қулай нест.

Ба ман чунин менамуд, ки меъморӣ бояд аз нав дида баромада шавад, ки баъзе маҳдудиятҳоро ошкор кунад:

  • Доштани объекте, ки худро намоиш медиҳад ва навсозӣ мекунад, мушкил аст, зеро он объект наметавонад "донад" чиро, ки бояд нишон диҳад - тасвир ва чаҳорчӯбаи сим;
  • набудани абзор барои табодули хосиятҳо ва рафтори байни субъектҳои инфиродӣ (масалан, хосияти is_build_mode ё нишон додани рафтор). Аз мерос истифода бурдан мумкин мебуд, гарчанде ки дар Руст ягон роҳи дурусти татбиқи он вуҷуд надорад. Он чизе ки ман дар ҳақиқат лозим буд, тарҳбандии буд;
  • асбоби ҳамкории байни субъектҳо барои таъини одамон ба судҳо лозим буд;
  • худи объектҳо омехтаи додаҳо ва мантиқ буданд, ки зуд аз назорат берун шуданд.

Ман боз каме тадқиқот кардам ва меъмориро кашф кардам ECS - Системаи Компоненти Объект, ки одатан дар бозиҳо истифода мешавад. Инҳоянд бартариҳои ECS:

  • маълумот аз мантиқ ҷудо карда мешавад;
  • таркиб ба ҷои мерос;
  • меъмории маълумот-марказ.

ECS бо се мафҳуми асосӣ тавсиф мешавад:

  • объектҳо - навъи объекте, ки идентификатор ба он ишора мекунад (он метавонад бозигар, тӯб ё чизи дигар бошад);
  • ҷузъҳо - субъектҳо аз онҳо иборатанд. Мисол - рендеринг компонент, маконҳо ва ғайра. Инҳо анборҳои маълумот мебошанд;
  • системаҳо - онҳо ҳам объектҳо ва ҳам ҷузъҳоро истифода мебаранд, инчунин дорои рафтор ва мантиқ мебошанд, ки ба ин маълумот асос ёфтаанд. Намунаи як системаи визуалӣ мебошад, ки тавассути ҳама объектҳо бо ҷузъҳои рендеринг такрор мешавад ва намоишро иҷро мекунад.

Пас аз омӯхтани он маълум шуд, ки ECS масъалаҳои зеринро ҳал мекунад:

  • истифодаи тарҳ ба ҷои мерос барои ба таври системавӣ ташкили субъектҳо;
  • раҳоӣ аз печидаи кодҳо тавассути системаҳои идоракунӣ;
  • бо истифода аз усулҳо ба монанди is_build_mode барои нигоҳ доштани мантиқи wireframe дар ҳамон ҷо - дар системаи визуалӣ.

Ин аст он чизе ки пас аз татбиқи ECS рӯй дод.

захираҳо -> ин ҷо ҳама дороиҳо ҳастанд (тасвирҳо)
СРС
- ҷузъҳо
-позиция.rs
— person.rs
— tennis_court.rs
— ошёна.rs
- wireframe.rs
— mouse_tracked.rs
- захираҳо
— mouse.rs
- системаҳо
— rendering.rs
— доимӣ.rs
— utils.rs
— world_factory.rs -> Фабрикаи ҷаҳонӣ кор мекунад
— main.rs -> ҳалқаи асосӣ

Мо одамонро ба судҳо таъин мекунем

ECS ҳаётро осонтар кард. Ҳоло ман як роҳи систематикии илова кардани маълумот ба объектҳо ва илова кардани мантиқ дар асоси ин маълумот доштам. Ва ин бошад, имкон дод, ки дар байни судхо таксим кардани одамон ташкил карда шавад.

Ман чӣ кор кардам:

  • илова кардани маълумот дар бораи судҳои таъиншуда ба Шахс;
  • маълумот дар бораи одамони тақсимшуда ба TennisCourt илова карда шуд;
  • иловашудаи CourtCoosingSystem, ки ба шумо имкон медиҳад, ки одамон ва судҳоро таҳлил кунед, судҳои мавҷударо ошкор кунед ва бозигаронро ба онҳо тақсим кунед;
  • илова кард PersonMovementSystem, ки одамонеро, ки ба судҳо таъин шудаанд, ҷустуҷӯ мекунад ва агар онҳо дар он ҷо набошанд, одамонро ба ҷое, ки лозим аст, мефиристад.

Бозии Rust дар тӯли 24 соат: таҷрибаи рушди шахсӣ

Натиҷа

Ба ман кор кардан дар ин бозии оддӣ хеле маъқул буд. Гузашта аз ин ман шодам, ки барои навиштани он аз Руст истифода кардам, зеро:

  • Rust ба шумо он чизеро медиҳад, ки ба шумо лозим аст;
  • он дорои ҳуҷҷатҳои аъло, Rust хеле шево аст;
  • мувофиқат сард аст;
  • ба шумо лозим нест, ки ба клонкунӣ, нусхабардорӣ ё дигар амалҳои шабеҳ муроҷиат кунед, ки ман аксар вақт дар C++ мекардам;
  • Опсияҳо барои истифода хеле осонанд ва хатогиҳоро хеле хуб идора мекунанд;
  • агар лоиҳаро тартиб додан мумкин бошад, пас 99% вақти он кор мекунад ва маҳз ҳамон тавре ки лозим аст. Ман фикр мекунам, ки паёмҳои хатогии компилятор беҳтарин чизест, ки ман дидаам.

Рушди бозӣ дар Rust ҳоло оғоз мешавад. Аммо аллакай як ҷомеаи мӯътадил ва хеле калон вуҷуд дорад, ки Rustро барои ҳама кушояд. Аз ин ру, ман ба ояндаи забон бо некбинона менигарам, натичахои кори умумии моро интизорам.

Skillbox тавсия медиҳад:

Манбаъ: will.com

Илова Эзоҳ