Jwe Rust nan 24 èdtan: eksperyans devlopman pèsonèl

Jwe Rust nan 24 èdtan: eksperyans devlopman pèsonèl

Nan atik sa a mwen pral pale sou eksperyans pèsonèl mwen nan devlope yon ti jwèt nan Rust. Li te pran apeprè 24 èdtan pou kreye yon vèsyon k ap travay (mwen te travay sitou nan aswè yo oswa nan wikenn). Jwèt la se byen lwen fini, men mwen panse ke eksperyans la pral rekonpanse. Mwen pral pataje sa mwen te aprann ak kèk obsèvasyon mwen te fè pandan y ap bati jwèt la nan grafouyen.

Skillbox rekòmande: Dezan kou pratik "Mwen se yon pwomotè entènèt PRO".

Nou raple: pou tout lektè "Habr" - yon rabè nan 10 rubles lè w ap enskri nan nenpòt kou Skillbox lè l sèvi avèk kòd pwomosyon "Habr".

Poukisa rouye?

Mwen te chwazi lang sa a paske mwen tande anpil bon bagay sou li e mwen wè li vin pi popilè nan devlopman jwèt. Anvan ekri jwèt la, mwen te gen ti eksperyans nan devlope aplikasyon senp nan Rust. Sa a te jis ase pou ban m 'yon sans de libète pandan y ap ekri jwèt la.

Poukisa jwèt la ak ki kalite jwèt?

Fè jwèt se plezi! Mwen swete gen plis rezon, men pou pwojè "lakay" mwen chwazi sijè ki pa twò pre relasyon ak travay mwen regilye. Ki jwèt sa a? Mwen te vle fè yon bagay tankou yon simulateur tenis ki konbine Cities Skylines, Zoo Tycoon, Prison Architect ak tenis tèt li. An jeneral, li te tounen yon jwèt sou yon akademi tenis kote moun vin jwe.

Fòmasyon teknik

Mwen te vle sèvi ak Rust, men mwen pa t 'konnen egzakteman ki kantite baz li ta pran yo kòmanse. Mwen pa t 'vle ekri pixel shaders epi sèvi ak trennen-n-drop, kidonk mwen t'ap chache solisyon ki pi fleksib.

Mwen jwenn resous itil mwen pataje avèk ou:

Mwen eksplore plizyè motè jwèt Rust, finalman chwazi Piston ak ggez. Mwen te rankontre yo pandan m ap travay sou yon pwojè anvan. Nan fen a, mwen te chwazi ggez paske li te sanble pi apwopriye pou mete ann aplikasyon yon ti jwèt 2D. Estrikti modilè Piston a twò konplèks pou yon pwomotè inisyasyon (oswa yon moun ki ap travay ak Rust pou premye fwa).

Estrikti jwèt

Mwen te pase kèk tan ap reflechi sou achitekti pwojè a. Premye etap la se fè "peyi", moun ak tribinal tenis. Moun yo oblije deplase nan tribinal yo epi tann. Jwè yo dwe gen ladrès ki amelyore sou tan. Anplis de sa, ta dwe gen yon editè ki pèmèt ou ajoute nouvo moun ak tribinal, men sa a pa gratis ankò.

Lè m fin reflechi tout bagay, mwen te kòmanse travay.

Kreyasyon jwèt

Kòmanse: Sèk ak Abstractions

Mwen te pran yon egzanp nan men ggez epi mwen te resevwa yon sèk sou ekran an. Bèl bagay! Koulye a, kèk abstraksyon. Mwen te panse li ta bon abstrè lwen lide a nan yon objè jwèt. Chak objè dwe rann epi mete ajou jan sa endike isit la:

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

Moso kòd sa a te ban mwen yon bèl lis objè ke mwen te kapab mete ajou ak rann nan yon bouk egalman bèl.

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 nesesè paske li genyen tout liy kòd yo. Mwen te pase yon ti tan separe fichye yo ak optimize estrikti anyè a. Men sa li te sanble apre sa:
resous -> sa a se kote tout byen yo ye (imaj)
src
- antite
— game_object.rs
— sèk.rs
— main.rs -> bouk prensipal

Moun, planche ak imaj

Pwochen etap la se kreye yon objè jwèt Moun ak imaj chaje. Tout bagay ta dwe bati sou baz 32 * 32 mozayik.

Jwe Rust nan 24 èdtan: eksperyans devlopman pèsonèl

Tribinal tenis

Apre etidye ki jan teren tenis yo sanble, mwen deside fè yo soti nan mozayik 4 * 2. Okòmansman, li te posib fè yon imaj nan gwosè sa a, oswa yo mete ansanm 8 mozayik separe. Men, Lè sa a, mwen reyalize ke sèlman de mozayik inik yo te bezwen, ak isit la nan poukisa.

An total nou gen de mozayik sa yo: 1 ak 2.

Chak seksyon nan tribinal la konsiste de mozayik 1 oswa mozayik 2. Yo ka mete deyò kòm nòmal oswa ranvèse 180 degre.

Jwe Rust nan 24 èdtan: eksperyans devlopman pèsonèl

Mòd konstriksyon debaz (asanble).

Apre mwen te rive reyalize rann nan sit, moun ak kat, mwen reyalize ke yon mòd asanble debaz yo te nesesè tou. Mwen aplike li tankou sa a: lè bouton an peze, objè a chwazi, epi klike la mete l 'nan plas la vle. Se konsa, bouton 1 pèmèt ou chwazi yon tribinal, ak bouton 2 pèmèt ou chwazi yon jwè.

Men, nou toujou bezwen sonje sa 1 ak 2 vle di, se konsa mwen te ajoute yon wireframe fè li klè ki objè yo te chwazi. Sa a se sa li sanble.

Jwe Rust nan 24 èdtan: eksperyans devlopman pèsonèl

Kesyon achitekti ak refactoring

Koulye a, mwen gen plizyè objè jwèt: moun, tribinal ak planche. Men, nan lòd pou wireframes yo travay, chak antite objè bezwen di si objè yo tèt yo nan mòd demonstrasyon, oswa si yon ankadreman tou senpleman trase. Sa a pa trè pratik.

Li te sanble ke achitekti a te bezwen yo dwe repanse nan yon fason ki revele kèk limit:

  • Gen yon antite ki rann ak mete ajou tèt li se yon pwoblèm paske antite sa a pa pral kapab "konnen" sa li sipoze rann - yon imaj ak yon wireframe;
  • mank de yon zouti pou echanj pwopriyete ak konpòtman ant antite endividyèl (pa egzanp, pwopriyete a is_build_mode oswa rann konpòtman). Li ta posib yo sèvi ak eritaj, byenke pa gen okenn fason apwopriye aplike li nan Rust. Ki sa mwen reyèlman bezwen se te layout la;
  • yon zouti pou entèraksyon ant antite yo te nesesè pou plase moun nan tribinal;
  • antite yo tèt yo te yon melanj de done ak lojik ki byen vit te soti nan kontwòl.

Mwen te fè kèk plis rechèch ak dekouvri achitekti a ECS la vle di Sistèm konpozan antite, ki souvan itilize nan jwèt. Men avantaj ki genyen nan ECS:

  • done yo separe de lojik;
  • konpozisyon olye pou yo eritaj;
  • achitekti ki santre sou done.

ECS karakterize pa twa konsèp debaz:

  • antite - ki kalite objè ke idantifyan an refere a (li ta ka yon jwè, yon boul, oswa yon lòt bagay);
  • konpozan - antite yo fèt ak yo. Egzanp - rann eleman, kote ak lòt moun. Sa yo se depo done;
  • sistèm - yo itilize tou de objè ak konpozan, plis genyen konpòtman ak lojik ki baze sou done sa yo. Yon egzanp se yon sistèm rann ki itere nan tout antite ki gen konpozan rann epi ki fè rann lan.

Apre etidye li, li te vin klè ke ECS rezoud pwoblèm sa yo:

  • lè l sèvi avèk layout olye pou yo eritaj pou òganize antite sistemikman;
  • debarase m de twoub kòd atravè sistèm kontwòl;
  • lè l sèvi avèk metòd tankou is_build_mode pou kenbe lojik wireframe an menm kote - nan sistèm rann lan.

Sa a se sa ki te pase apre aplikasyon ECS.

resous -> sa a se kote tout byen yo ye (imaj)
src
- konpozan
—position.rs
— moun.rs
— tennis_court.rs
— etaj.rs
- wireframe.rs
— mouse_tracked.rs
- resous yo
—sourit.rs
- sistèm yo
— rann.rs
— konstan.rs
— utils.rs
— world_factory.rs -> fonksyon faktori mondyal
— main.rs -> bouk prensipal

Nou mete moun nan tribinal yo

ECS te rann lavi pi fasil. Koulye a, mwen te gen yon fason sistematik ajoute done nan antite epi ajoute lojik ki baze sou done sa yo. Ak sa a, nan vire, te fè li posib yo òganize distribisyon an nan moun nan mitan tribinal yo.

Kisa mwen fè:

  • te ajoute done sou tribinal yo asiyen nan Moun;
  • te ajoute done sou moun ki distribye nan TennisCourt;
  • te ajoute CourtChoosingSystem, ki pèmèt ou analize moun ak tribinal, detekte tribinal ki disponib epi distribye jwè yo ba yo;
  • te ajoute yon PersonMovementSystem, ki chèche moun ki plase nan tribinal yo, epi si yo pa la, Lè sa a, voye moun kote yo bezwen yo.

Jwe Rust nan 24 èdtan: eksperyans devlopman pèsonèl

Adisyon moute

Mwen vrèman te renmen travay sou jwèt senp sa a. Anplis, mwen byen kontan ke mwen te itilize Rust pou ekri li, paske:

  • Rust ba ou sa ou bezwen;
  • li gen dokimantasyon ekselan, Rust se byen elegant;
  • konsistans se fre;
  • ou pa oblije ale nan klonaj, kopye oswa lòt aksyon menm jan an, ki mwen souvan te fè nan C++;
  • Opsyon yo trè fasil yo sèvi ak epi okipe erè trè byen;
  • si pwojè a te kapab konpile, Lè sa a, 99% nan tan an li travay, ak egzakteman jan li ta dwe. Mwen panse ke mesaj erè yo se pi bon yo mwen te wè.

Devlopman jwèt nan Rust fèk kòmanse. Men, gen deja yon kominote ki estab ak jistis gwo k ap travay pou louvri Rust pou tout moun. Se poutèt sa, mwen gade avni lang nan ak optimis, gade pou pi devan pou rezilta yo nan travay komen nou an.

Skillbox rekòmande:

Sous: www.habr.com

Add nouvo kòmantè