24 сағат ішінде Rust ойнау: жеке даму тәжірибесі

24 сағат ішінде Rust ойнау: жеке даму тәжірибесі

Бұл мақалада мен Rust-те шағын ойынды дамытудағы жеке тәжірибем туралы айтатын боламын. Жұмыс нұсқасын жасау үшін шамамен 24 сағат қажет болды (мен негізінен кешкі уақытта немесе демалыс күндері жұмыс істедім). Ойын әлі аяқталды, бірақ тәжірибе пайдалы болады деп ойлаймын. Мен ойынды нөлден құрастыру кезінде білгендерімді және кейбір бақылауларымды бөлісемін.

Skillbox ұсынады: Екі жылдық практикалық курс «Мен PRO веб-әзірлеушісімін».

Біз еске саламыз: «Хабрдың» барлық оқырмандары үшін - «Habr» жарнамалық кодын пайдаланып кез келген Skillbox курсына жазылу кезінде 10 000 рубль көлемінде жеңілдік.

Неліктен Rust?

Мен бұл тілді таңдадым, өйткені мен ол туралы көп жақсы нәрселер естідім және оның ойын әзірлеуде барған сайын танымал бола бастағанын көремін. Ойынды жазбас бұрын менде Rust-та қарапайым қолданбаларды жасау тәжірибесі аз болды. Бұл ойынды жазу кезінде маған еркіндік сезімін беру үшін жеткілікті болды.

Неліктен ойын және қандай ойын?

Ойындарды жасау қызық! Себептер көп болғанын қалаймын, бірақ «үй» жобалары үшін мен әдеттегі жұмысыма тым тығыз байланысты емес тақырыптарды таңдаймын. Бұл қандай ойын? Мен Cities Skylines, Zoo Tycoon, Prison Architect және теннистің өзін біріктіретін теннис тренажеры сияқты нәрсе жасағым келді. Жалпы, бұл адамдар ойнауға келетін теннис академиясы туралы ойын болып шықты.

Техникалық дайындық

Мен Rust қолданбасын қолданғым келді, бірақ оны бастау үшін қанша негіз қажет болатынын білмедім. Мен пиксельдік шейдерлерді жазғым келмеді және апарып тастауды пайдаланғым келмеді, сондықтан мен ең икемді шешімдерді іздедім.

Мен сіздермен бөлісетін пайдалы ресурстарды таптым:

Мен бірнеше 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 қажет, себебі ол кодтың барлық жолдарын қамтиды. Мен файлдарды бөлуге және каталог құрылымын оңтайландыруға аз уақыт жұмсадым. Осыдан кейін ол былай болды:
ресурстар -> бұл жерде барлық активтер (суреттер)
SRC
- субъектілер
— game_object.rs
— шеңбер
— main.rs -> негізгі цикл

Адамдар, едендер және кескіндер

Келесі қадам - ​​Person ойын нысанын жасау және кескіндерді жүктеу. Барлығы 32*32 плитка негізінде салынуы керек.

24 сағат ішінде Rust ойнау: жеке даму тәжірибесі

Теннис корты

Теннис корттарының қандай болатынын зерттеп, мен оларды 4*2 плиткадан жасауды шештім. Бастапқыда мұндай өлшемдегі кескінді жасауға немесе 8 бөлек тақтайшаны біріктіруге болады. Бірақ содан кейін мен тек екі ерекше плитка қажет екенін түсіндім, міне, неге.

Барлығы бізде осындай екі плитка бар: 1 және 2.

Корттың әрбір бөлімі 1-плиткадан немесе 2-плиткадан тұрады. Оларды әдеттегідей орналастыруға немесе 180 градусқа бұруға болады.

24 сағат ішінде Rust ойнау: жеке даму тәжірибесі

Негізгі құрылыс (монтаждау) режимі

Мен сайттарды, адамдарды және карталарды көрсетуге қол жеткізгеннен кейін, негізгі құрастыру режимі де қажет екенін түсіндім. Мен оны былай іске асырдым: түймені басқан кезде объект таңдалады, шерткенде оны қажетті орынға орналастырады. Сонымен, 1 түймесі кортты таңдауға, ал 2 түймесі ойыншыны таңдауға мүмкіндік береді.

Бірақ біз әлі де 1 және 2 нені білдіретінін есте сақтауымыз керек, сондықтан мен қай нысан таңдалғанын түсіну үшін сымдық жүйені қостым. Бұл осылай көрінеді.

24 сағат ішінде Rust ойнау: жеке даму тәжірибесі

Архитектура және рефакторинг сұрақтары

Қазір менде бірнеше ойын нысандары бар: адамдар, корттар және едендер. Бірақ сым жақтаулары жұмыс істеуі үшін әрбір нысан нысанына нысандардың өзі демонстрациялық режимде екенін немесе жақтаудың жай сызылғанын айту керек. Бұл өте ыңғайлы емес.

Маған архитектураны кейбір шектеулерді анықтайтын етіп қайта қарау керек сияқты көрінді:

  • Өзін-өзі көрсететін және жаңартатын нысанның болуы проблема болып табылады, себебі бұл нысан не көрсету керек екенін – кескін мен сымды «біле» алмайды;
  • жеке нысандар арасында сипаттар мен мінез-құлық алмасу құралының болмауы (мысалы, is_build_mode сипаты немесе мінез-құлықты көрсету). Рустта оны жүзеге асырудың дұрыс жолы жоқ болса да, мұраны пайдалануға болады. Маған өте қажет нәрсе - макет;
  • адамдарды сотқа тағайындау үшін субъектілер арасындағы өзара іс-қимыл құралы қажет болды;
  • нысандардың өзі бақылаудан тез шығып кеткен деректер мен логиканың қоспасы болды.

Мен тағы біраз зерттеп, архитектураны аштым ECS - Entity Component System, ол әдетте ойындарда қолданылады. Міне, ECS артықшылықтары:

  • деректер логикадан бөлінген;
  • мұрагерлік орнына құрам;
  • деректерге негізделген архитектура.

ECS үш негізгі ұғыммен сипатталады:

  • нысандар - идентификатор сілтейтін нысанның түрі (ол ойыншы, доп немесе басқа нәрсе болуы мүмкін);
  • құрамдас бөліктер – субъектілер олардан тұрады. Мысал – рендеринг компоненті, орындар және т.б. Бұл деректер қоймалары;
  • жүйелер - олар объектілерді де, компоненттерді де пайдаланады, сонымен қатар осы деректерге негізделген мінез-құлық пен логиканы қамтиды. Мысал ретінде көрсету құрамдастары бар барлық нысандар арқылы қайталанатын және көрсетуді орындайтын көрсету жүйесі болып табылады.

Оны зерттегеннен кейін ECS келесі мәселелерді шешетіні белгілі болды:

  • нысандарды жүйелі түрде ұйымдастыру үшін мұрагерлік орнына орналасуды пайдалану;
  • басқару жүйелері арқылы кодтық шатасудан құтылу;
  • сымдық жүйе логикасын бір жерде - көрсету жүйесінде сақтау үшін is_build_mode сияқты әдістерді пайдалану.

Бұл ECS енгізгеннен кейін болды.

ресурстар -> бұл жерде барлық активтер (суреттер)
SRC
- құрамдас бөліктер
—позиция.rs
— адам.rs
— tennis_court.rs
— қабат
- wireframe.rs
— mouse_tracked.rs
- ресурстар
—тышқан.rs
- жүйелер
— rendering.rs
— тұрақтылар.rs
— utils.rs
— world_factory.rs -> әлемдік зауыт функциялары
— main.rs -> негізгі цикл

Біз адамдарды сотқа жібереміз

ECS өмірді жеңілдетті. Енді менде нысандарға деректерді қосудың және сол деректерге негізделген логиканы қосудың жүйелі жолы болды. Ал бұл өз кезегінде соттар арасында адамдарды бөлуді ұйымдастыруға мүмкіндік берді.

Мен не істедім:

  • Тұлғаға тағайындалған соттар туралы мәліметтер қосылды;
  • TennisCourt-қа бөлінген адамдар туралы деректер қосылды;
  • адамдарды және корттарды талдауға, қолжетімді корттарды анықтауға және оларға ойыншыларды таратуға мүмкіндік беретін CourtChoosingSystem қосылды;
  • соттарға тағайындалған адамдарды іздейтін, егер олар жоқ болса, адамдарды қажет жерге жіберетін PersonMovementSystem қосты.

24 сағат ішінде Rust ойнау: жеке даму тәжірибесі

Қорытындылау

Осы қарапайым ойынмен жұмыс істеу маған өте ұнады. Оның үстіне, мен оны жазу үшін Рустты пайдаланғаныма қуаныштымын, өйткені:

  • Тот сізге қажет нәрсені береді;
  • оның тамаша құжаттамасы бар, Rust өте талғампаз;
  • консистенциясы салқын;
  • C++ тілінде жиі жасайтын клондау, көшіру немесе басқа да ұқсас әрекеттерге барудың қажеті жоқ;
  • Опцияларды пайдалану өте оңай және қателерді өте жақсы өңдейді;
  • егер жобаны құрастыру мүмкін болса, онда ол уақыттың 99% және дәл солай жұмыс істейді. Менің ойымша, компилятордың қате туралы хабарлары мен көрген ең жақсысы.

Rust ойынының дамуы енді ғана басталады. Бірақ Рустты барлығына ашу үшін жұмыс істейтін тұрақты және жеткілікті үлкен қауымдастық бар. Сондықтан тілдің болашағына оптимистік көзқараспен қарап, ортақ жұмысымыздың нәтижесін күтемін.

Skillbox ұсынады:

Ақпарат көзі: www.habr.com

пікір қалдыру