Playing Tsatsa a cikin awanni 24: ƙwarewar ci gaban mutum

Playing Tsatsa a cikin awanni 24: ƙwarewar ci gaban mutum

A cikin wannan labarin, zan yi magana game da ƙwarewar kaina na haɓaka ƙaramin wasa a cikin Rust. Ya ɗauki kimanin sa'o'i 24 don ƙirƙirar nau'in aiki (mafi yawa na yi aiki da maraice ko a karshen mako). Wasan ya yi nisa daga cikakke, amma ina tsammanin ƙwarewar za ta kasance da amfani. Zan raba abin da na koya da wasu abubuwan da na yi yayin gina wasan daga karce.

Skillbox yana ba da shawarar: Kwas na aiki na shekara biyu "Ni mai haɓaka gidan yanar gizon PRO ne".

Muna tunatarwa: ga duk masu karatu na "Habr" - rangwame na 10 rubles lokacin yin rajista a kowane kwas na Skillbox ta amfani da lambar talla "Habr".

Me yasa Tsatsa?

Na zabi wannan yare ne saboda na ji abubuwa masu kyau game da shi kuma ina ganin ya zama sananne a cikin ci gaban wasa. Kafin rubuta wasan, Ina da ɗan gogewa wajen haɓaka aikace-aikace masu sauƙi a cikin Rust. Ya isa kawai don jin wani 'yanci yayin rubuta wasan.

Me yasa wasan kuma wane irin wasa?

Yin wasanni yana da daɗi! Ina fata akwai ƙarin dalilai, amma don ayyukan "gida", na zaɓi batutuwa waɗanda ba su da alaƙa da aikina na yau da kullun. Wane wasa ne wannan? Ina so in yi wani abu kamar na'urar kwaikwayo ta wasan tennis wanda ya haɗu da Cities Skylines, Zoo Tycoon, Prison Architect da wasan tennis kanta. Gabaɗaya, ya zama wasa game da makarantar koyar da wasan tennis, inda mutane ke zuwa wasa.

Koyarwar fasaha

Ina so in yi amfani da Tsatsa, amma ban san ainihin nawa "daga karce" zai ɗauka don farawa ba. Ban so in rubuta pixel shaders da amfani da ja-n-drop, don haka ina neman mafi sassauƙa mafita.

Na sami albarkatu masu amfani waɗanda na raba tare da ku:

Na bincika injunan wasan Rust da yawa, daga ƙarshe na zaɓi Piston da ggez. Na ci karo da su yayin da nake aikin wani aiki da ya gabata. Na ƙare zaɓin ggez kamar yadda ya fi dacewa da ƙaramin wasan 2D. Tsarin tsarin Piston yana da wahala sosai ga novice mai haɓakawa (ko wanda yake sabo ga Tsatsa).

Tsarin wasa

Na dan dauki lokaci ina tunani game da gine-ginen aikin. Mataki na farko shine yin "ƙasa", mutane da wuraren wasan tennis. Dole ne mutane su zagaya cikin kotuna su jira. Dole ne ƴan wasa su sami ƙwarewa waɗanda zasu inganta akan lokaci. Bugu da ƙari, ya kamata a sami edita wanda zai ba ku damar ƙara sababbin mutane da kotu, amma wannan ba kyauta ba ne.

Bayan nayi tunanin komai, sai na fara aiki.

Ƙirƙirar wasa

Farko: da'ira da abstractions

Na dauki misali daga ggez kuma na sami da'irar akan allon. Abin al'ajabi! Yanzu wasu abstractions. Na yi tunani yana da kyau a nisanta daga ra'ayin abin wasa. Dole ne a sanya kowane abu kuma a sabunta shi kamar yadda aka ƙayyade a nan:

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

Wannan yanki na lambar ya ba ni jerin abubuwa masu girma waɗanda zan iya ɗaukakawa da kuma bayarwa a cikin babban zagayowar daidai.

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 ana bukata domin yana dauke da dukkan layin code. Na ɗauki ɗan lokaci don raba fayiloli da haɓaka tsarin kundin adireshi. Ga yadda abin ya kasance bayan haka:
albarkatun -> wannan shine inda duk kadarorin suke (hotuna)
Src
- abubuwa
-game_object.rs
- da'irar.rs
- main.rs -> mainloop

Mutane, benaye da hotuna

Mataki na gaba shine ƙirƙirar abun wasan mutum da loda hotuna. Duk abin da ya kamata a dogara ne akan fale-falen 32 * 32.

Playing Tsatsa a cikin awanni 24: ƙwarewar ci gaban mutum

Kotunan wasan Tennis

Bayan nazarin yadda wuraren wasan tennis suke, na yanke shawarar yin su daga tayal 4x2. Da farko, yana yiwuwa a yi hoton wannan girman, ko kuma a haɗa fale-falen fale-falen guda 8. Amma sai na gane cewa fale-falen fale-falen guda biyu ne kawai ake buƙata, kuma ga dalilin da ya sa.

A cikin duka muna da irin wannan tiles guda biyu: 1 da 2.

Kowane sashe na kotun ya ƙunshi tayal 1 ko tayal 2. Ana iya sanya su kamar yadda aka saba ko kuma a jujjuya su zuwa digiri 180.

Playing Tsatsa a cikin awanni 24: ƙwarewar ci gaban mutum

Yanayin gini na asali (taro).

Bayan na sami nasarar aiwatar da ma'anar shafuka, mutane da taswira, na lura cewa ana buƙatar ainihin yanayin gini. Na aiwatar da shi kamar haka: lokacin da aka danna maɓallin, za a zaɓi abu, kuma danna yana sanya shi a daidai wurin da ya dace. Don haka, maɓallin 1 yana ba ku damar zaɓar kotu, kuma maɓallin 2 yana ba ku damar zaɓar ɗan wasa.

Amma har yanzu kuna buƙatar tuna abin da 1 da 2 ke nufi gare mu, don haka na ƙara waya don bayyana abin da aka zaɓa. Ga yadda abin yake.

Playing Tsatsa a cikin awanni 24: ƙwarewar ci gaban mutum

Tambayoyi game da gine-gine da gyarawa

Yanzu ina da abubuwan wasa da yawa: mutane, kotu da benaye. Amma domin firam ɗin waya su yi aiki, kowane mahallin abu yana buƙatar faɗawa ko abubuwan da kansu suna cikin yanayin demo, ko kuma an zana firam kawai. Wannan bai dace sosai ba.

Ya zama kamar a gare ni cewa ya zama dole a sake tunani game da gine-ginen don an bayyana wasu gazawa:

  • samun wani mahaluƙi da ke nunawa da sabunta kanta matsala ce, saboda wannan mahaluƙi ba zai iya "san" abin da ya kamata ya yi ba - hoto da igiya;
  • rashin kayan aiki don musanyar kadarori da ɗabi'a tsakanin ɗaiɗaikun ƙungiyoyi (misali, is_build_mode dukiya ko ma'anar ɗabi'a). Zai yiwu a yi amfani da gado, ko da yake babu wata hanya ta al'ada a cikin Rust don aiwatar da shi. Abin da nake bukata shi ne shimfidar wuri;
  • ana buƙatar kayan aiki don hulɗa tsakanin ƙungiyoyi don sanya mutane zuwa kotu;
  • abubuwan da kansu sun kasance cakuda bayanai da dabaru waɗanda suka fita daga sarrafawa cikin sauri.

Na kara bincike kuma na gano gine-ginen ECS-Tsarin Ƙirar Ƙarfafawa, wanda aka fi amfani dashi a wasanni. Ga fa'idodin ECS:

  • an raba bayanai da dabaru;
  • shimfidawa maimakon gado;
  • data-centric gine.

ECS yana da ma'anoni na asali guda uku:

  • abubuwa - nau'in abin da mai gano ke nufi (zai iya zama dan wasa, ball, ko wani abu dabam);
  • abubuwan da aka gyara - abubuwan sun kasance da su. Misali shi ne bangaren samarwa, shimfidu, da sauransu. Waɗannan ma'ajin bayanai ne;
  • tsarin - suna amfani da abubuwa biyu da abubuwan haɗin gwiwa, ƙari kuma suna ɗauke da ɗabi'a da dabaru waɗanda suka dogara akan wannan bayanan. Misali shine tsarin nunawa wanda ke jujjuya duk mahaluki tare da abubuwan da za a iya bayarwa kuma yana kula da nunawa.

Bayan nazarin, ya bayyana a fili cewa ECS yana magance irin waɗannan matsalolin:

  • amfani da shimfidawa maimakon gado don tsarin tsarin ƙungiyoyi;
  • kawar da rikice-rikice na code a kashe tsarin sarrafawa;
  • ta amfani da hanyoyin kamar is_build_mode don kiyaye ma'anar firam ɗin waya a wuri ɗaya - a cikin tsarin samarwa.

Ga abin da ya faru bayan gabatarwar ECS.

albarkatun -> wannan shine inda duk kadarorin suke (hotuna)
Src
- sassa
-matsayi.rs
- mutum.rs
- wasan tennis_court.rs
kasa.rs
- wayaframe.rs
- linzamin kwamfuta_tracked.rs
- albarkatun
- linzamin kwamfuta.rs
- tsarin
- fassara.rs
- akai-akai.rs
- amfani.rs
- world_factory.rs -> ayyukan masana'anta na duniya
- main.rs -> mainloop

Sanya mutane zuwa kotuna

ECS ya sauƙaƙa rayuwa. Yanzu ina da hanyar tsarin ƙara bayanai zuwa ga mahalli da ƙara dabaru dangane da wannan bayanan. Kuma wannan shi ne ya sa aka tsara yadda za a raba mutane a kotuna.

Me nayi:

  • ƙarin bayanai game da kotunan da aka sanya wa Mutum;
  • ƙara bayanan mutane da aka rarraba zuwa TennisCourt;
  • ya kara da CourtChoosingSystem, wanda ke ba ka damar yin nazarin mutane da kotuna, gano kotunan da ke akwai da kuma rarraba musu 'yan wasa;
  • Ya kara da cewa PersonMovementSystem, wanda ke neman mutanen da aka ba da su a kotuna, idan kuma ba su nan, sai a tura mutane wurin da ya dace.

Playing Tsatsa a cikin awanni 24: ƙwarewar ci gaban mutum

Girgawa sama

Na ji daɗin yin aiki akan wannan wasan mai sauƙi. Bugu da ƙari, na yi farin ciki da na yi amfani da Rust don rubuta shi, saboda:

  • Tsatsa yana ba ku abin da kuke buƙata;
  • yana da kyawawan takardu, Tsatsa yana da kyau sosai;
  • dagewa yana da sanyi;
  • babu buƙatar yin amfani da cloning, kwafi, ko wasu ayyuka makamantansu, waɗanda na yi sau da yawa a C ++;
  • Zaɓuɓɓuka suna da sauƙin aiki tare da su, suna kuma magance kurakurai da kyau;
  • idan an yi nasarar hada aikin, to a cikin 99% yana aiki, kuma daidai yadda ya kamata. Saƙonnin kuskure masu tarawa sune mafi kyawun da na taɓa gani.

Ci gaban wasan tsatsa yana farawa. Amma an riga an sami kwanciyar hankali kuma babban al'umma da ke aiki don sa tsatsa ta buɗe wa kowa. Saboda haka, ina da kyakkyawan fata game da makomar harshe, ina sa ran sakamakon aikinmu na gama gari.

Skillbox yana ba da shawarar:

source: www.habr.com

Add a comment