Играње Руста за 24 сата: искуство личног развоја

Играње Руста за 24 сата: искуство личног развоја

У овом чланку ћу говорити о свом личном искуству развоја мале игре у Русту. Било је потребно око 24 сата да се направи радна верзија (углавном сам радио увече или викендом). Утакмица је далеко од завршене, али мислим да ће искуство бити исплативо. Поделићу шта сам научио и нека запажања која сам направио док сам правио игру од нуле.

Скиллбок препоручује: Двогодишњи практични курс „Ја сам ПРО веб програмер“.

Подсећамо: за све читаоце „Хабра“ – попуст од 10 рубаља при упису на било који курс Скиллбок користећи промотивни код „Хабр“.

Зашто Руст?

Изабрао сам овај језик јер сам чуо много добрих ствари о њему и видим да постаје све популарнији у развоју игара. Пре писања игре, имао сам мало искуства у развоју једноставних апликација у Русту. Ово је било довољно да ми пружи осећај слободе док пишем игру.

Зашто игра и каква игра?

Прављење игрица је забавно! Волео бих да има више разлога, али за „кућне” пројекте бирам теме које нису превише уско везане за мој редовни посао. Која је ово игра? Желео сам да направим нешто попут тениског симулатора који комбинује Цитиес Скилинес, Зоо Тицоон, Присон Арцхитецт и сам тенис. Генерално, испоставило се да је то игра о тениској академији где људи долазе да играју.

Техничку обуку

Хтео сам да користим Руст, али нисам тачно знао колико ће темеља бити потребно за почетак. Нисам желео да пишем пикселне шејдере и користим драг-н-дроп, па сам тражио најфлексибилнија решења.

Нашао сам корисне ресурсе које делим са вама:

Истражио сам неколико Руст игрица, на крају изабрао Пистон и ггез. Наишао сам на њих док сам радио на претходном пројекту. На крају сам изабрао ггез јер ми се чинило погоднијим за имплементацију мале 2Д игре. Модуларна структура Пистон-а је превише сложена за почетника (или некога ко први пут ради са Рустом).

Структура игара

Провео сам неко време размишљајући о архитектури пројекта. Први корак је да се направи "земља", људи и тениски терени. Људи морају да се крећу по судовима и чекају. Играчи морају имати вештине које се временом побољшавају. Осим тога, требало би да постоји уређивач који вам омогућава да додајете нове људе и судове, али то више није бесплатно.

Пошто сам све добро размислио, кренуо сам на посао.

Креирање игре

Почетак: Кругови и апстракције

Узео сам пример из ггез-а и добио сам круг на екрану. Дивно! Сада неке апстракције. Мислио сам да би било лепо да се апстрахујем од идеје о објекту игре. Сваки објекат мора бити приказан и ажуриран као што је овде наведено:

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

маин.рс је неопходан јер садржи све линије кода. Провео сам мало времена раздвајајући датотеке и оптимизујући структуру директоријума. Овако је то изгледало након тога:
ресурси -> овде су сва средства (слике)
срц
- ентитети
— гаме_објецт.рс
— круг.рс
— маин.рс -> главна петља

Људи, подови и слике

Следећи корак је креирање објекта игре Персон и учитавање слика. Све треба градити на основу плочица 32*32.

Играње Руста за 24 сата: искуство личног развоја

Тениски терени

Након што сам проучио како изгледају тениски терени, одлучио сам да их направим од плочица 4*2. У почетку је било могуће направити слику ове величине или саставити 8 одвојених плочица. Али онда сам схватио да су потребне само две јединствене плочице, а ево и зашто.

Укупно имамо две такве плочице: 1 и 2.

Сваки део терена се састоји од плочице 1 или плочице 2. Могу се поставити нормално или окренути за 180 степени.

Играње Руста за 24 сата: искуство личног развоја

Основни начин изградње (монтаже).

Након што сам успео да постигнем рендеровање сајтова, људи и мапа, схватио сам да је потребан и основни режим састављања. Ја сам то имплементирао овако: када се притисне дугме, објекат се бира, а клик га поставља на жељено место. Дакле, дугме 1 вам омогућава да изаберете терен, а дугме 2 вам омогућава да изаберете играча.

Али још увек морамо да запамтимо шта значе 1 и 2, па сам додао жичани оквир да би било јасно који је објекат изабран. Овако то изгледа.

Играње Руста за 24 сата: искуство личног развоја

Питања архитектуре и рефакторисања

Сада имам неколико објеката за игру: људе, терене и подове. Али да би жичани оквири функционисали, сваком објектном ентитету треба рећи да ли су сами објекти у демонстрационом режиму или је оквир једноставно нацртан. Ово није баш згодно.

Чинило ми се да архитектуру треба преиспитати на начин који открива нека ограничења:

  • Имати ентитет који сам себе рендерује и ажурира је проблем јер тај ентитет неће моћи да „зна” шта би требало да прикаже – слику и жичани оквир;
  • недостатак алата за размену својстава и понашања између појединачних ентитета (на пример, својство ис_буилд_моде или рендеровање понашања). Било би могуће користити наслеђивање, иако не постоји прави начин да се то примени у Русту. Оно што ми је заиста било потребно је распоред;
  • алат за интеракцију између ентитета био је потребан за распоређивање људи у судове;
  • сами ентитети су били мешавина података и логике која је брзо измакла контроли.

Још сам истраживао и открио архитектуру ЕЦС - Систем компоненти ентитета, који се обично користи у игрицама. Ево предности ЕЦС-а:

  • подаци су одвојени од логике;
  • састав уместо наслеђа;
  • архитектура усмерена на податке.

ЕЦС карактеришу три основна концепта:

  • ентитети - тип објекта на који се идентификатор односи (може бити играч, лопта или нешто друго);
  • компоненте – од њих се састоје ентитети. Пример - компонента за рендеровање, локације и друго. То су складишта података;
  • системи - користе и објекте и компоненте, плус садрже понашање и логику који су засновани на овим подацима. Пример је систем за рендеровање који се понавља кроз све ентитете са компонентама за рендеровање и врши рендеровање.

Након проучавања, постало је јасно да ЕЦС решава следеће проблеме:

  • коришћење распореда уместо наслеђивања за системско организовање ентитета;
  • отклањање збрке кода кроз контролне системе;
  • користећи методе као што је ис_буилд_моде да задрже логику жичаног оквира на истом месту – у систему за приказивање.

Ово се десило након имплементације ЕЦС-а.

ресурси -> овде су сва средства (слике)
срц
- компоненте
—позиција.рс
— особа.рс
— теннис_цоурт.рс
— спрат.рс
- вирефраме.рс
— моусе_трацкед.рс
- ресурси
—моусе.рс
- системи
— рендеринг.рс
— константе.рс
— утилс.рс
— ворлд_фацтори.рс -> ворлд фацтори фунцтионс
— маин.рс -> главна петља

Ми распоређујемо људе у судове

ЕЦС је олакшао живот. Сада сам имао систематски начин да додам податке ентитетима и додам логику на основу тих података. А ово је, заузврат, омогућило организовање расподеле људи по судовима.

Шта сам урадио:

  • додао податке о додељеним судовима Лицу;
  • додао податке о распоређеним људима ТеннисЦоурту;
  • додат је ЦоуртЦхоосингСистем, који вам омогућава да анализирате људе и терене, откривате доступне терене и дистрибуирате играче на њих;
  • додао ПерсонМовементСистем, који тражи људе додељене судовима, а ако нису тамо, шаље људе тамо где треба.

Играње Руста за 24 сата: искуство личног развоја

Резиме

Заиста сам уживао радећи на овој једноставној игрици. Штавише, драго ми је што сам користио Руст да то напишем, јер:

  • Руст вам даје оно што вам треба;
  • има одличну документацију, Руст је прилично елегантан;
  • конзистенција је хладна;
  • не морате да прибегавате клонирању, копирању или другим сличним радњама, што сам често радио у Ц++;
  • Опције су веома једноставне за коришћење и веома добро обрађују грешке;
  • ако је пројекат био у могућности да се састави, онда 99% времена ради, и тачно како треба. Мислим да су поруке о грешци компајлера најбоље што сам видео.

Развој игара у Русту тек почиње. Али већ постоји стабилна и прилично велика заједница која ради на отварању Руста за све. Стога на будућност језика гледам са оптимизмом, радујући се резултатима нашег заједничког рада.

Скиллбок препоручује:

Извор: ввв.хабр.цом

Додај коментар