Milalao Rust ao anatin'ny 24 ora: traikefa amin'ny fampandrosoana manokana
Amin'ity lahatsoratra ity dia hiresaka momba ny traikefako manokana amin'ny famolavolana lalao kely amin'ny Rust aho. Naharitra 24 ora teo ho eo ny famoronana dikan-teny miasa (ny hariva na ny faran'ny herinandro no niasako matetika). Mbola tsy vita ny lalao, saingy heveriko fa hahafaly ny traikefa. Hizara ny zavatra nianarako sy ny fanamarihana nataoko nandritra ny fananganana ny lalao hatramin'ny voalohany aho.
Nikaroka motera lalao Rust maromaro aho, tamin'ny farany nisafidy Piston sy ggez. Nifanena tamin'izy ireo aho teo am-panaovana tetikasa teo aloha. Tamin'ny farany dia nisafidy ggez aho satria toa mety kokoa amin'ny fampiharana lalao 2D kely. Ny firafitry ny modular an'ny Piston dia sarotra loatra ho an'ny mpamorona vaovao (na olona izay sambany miasa amin'ny Rust).
Firafitry ny lalao
Nandany fotoana kely aho nieritreritra momba ny maritrano momba ny tetikasa. Ny dingana voalohany dia ny fanaovana "tany", ny olona ary ny kianja filalaovana tennis. Tsy maintsy mivezivezy eny amin’ny fitsarana ny olona ary miandry. Ny mpilalao dia tsy maintsy manana fahaiza-manao izay mivoatra rehefa mandeha ny fotoana. Fanampin'izay, tokony hisy tonian-dahatsoratra ahafahanao manampy olona sy fitsarana vaovao, saingy tsy maimaim-poana intsony izany.
Rehefa nieritreritra tsara ny zava-drehetra aho dia nanomboka niasa.
Famoronana lalao
Fiantombohana: faribolana sy abstraction
Naka ohatra avy amin'ny ggez aho ary nahazo faribolana teo amin'ny efijery. Mahagaga! Ankehitriny abstractions sasany. Nihevitra aho fa tsara ny miala amin'ny hevitra momba ny lalao. Ny zavatra tsirairay dia tsy maintsy adika sy havaozina araka ny voalaza eto:
// 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(())
}
}
Ity sombin-kaody ity dia nanome ahy lisitr'ireo zavatra azoko havaozina sy adika amin'ny loop mahafinaritra mitovy.
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(())
}
}
ilaina ny main.rs satria misy ny andalana code rehetra ao anatiny. Nandany fotoana kely aho nanasaraka ireo rakitra sy nanatsara ny firafitry ny lahatahiry. Toy izao ny endriny taorian’izay: loharano -> eto no misy ny fananana rehetra (sary)
src
- fikambanana
— game_object.rs
— faribolana.rs
— main.rs -> loop lehibe
Olona, gorodona ary sary
Ny dingana manaraka dia ny mamorona zavatra lalao Persona ary mametaka sary. Ny zava-drehetra dia tokony haorina amin'ny fototry ny 32 * 32 taila.
Fitsarana tenisy
Rehefa avy nandinika ny endriky ny kianja filalaovana tenisy aho dia nanapa-kevitra ny hanao azy ireo amin'ny taila 4*2. Tamin'ny voalohany dia azo natao ny nanao sary amin'io habe io, na nanangona taila 8 misaraka. Tsapako anefa avy eo fa taila tsy manam-paharoa roa ihany no ilaina, ary izao no antony.
Amin'ny fitambarany dia manana taila roa toy izany izahay: 1 sy 2.
Ny fizarana tsirairay ao amin'ny kianja dia misy taila 1 na taila 2. Azo apetraka toy ny mahazatra izy ireo na mihodina 180 degre.
Fomba fanorenana fototra (assembly).
Rehefa vitako ny nandika ny tranokala, ny olona ary ny sarintany, dia tsapako fa ilaina koa ny fomba fanaovana fivoriambe fototra. Nataoko toy izao izany: rehefa voatsindry ny bokotra, dia voafantina ilay zavatra, ary ny tsindry dia mametraka azy amin'ny toerana irina. Noho izany, ny bokotra 1 dia ahafahanao misafidy fitsarana, ary ny bokotra 2 dia ahafahanao misafidy mpilalao.
Saingy mbola mila tadidintsika ny dikan'ny 1 sy 2, ka nampiana wireframe aho mba hanazavana ny zavatra nofantenana. Toy izao ny endriny.
Architecture sy refactoring fanontaniana
Ankehitriny dia manana zavatra lalao maromaro aho: olona, kianja ary gorodona. Fa mba hahafahan'ny wireframes miasa, ny singa tsirairay dia tokony holazaina raha toa ka ao anatin'ny fomba fihetsiketsehana ny zavatra, na raha atao sary fotsiny ny frame iray. Tsy dia mety loatra izany.
Noheveriko fa mila nodinihina indray ny maritrano amin'ny fomba izay mampiseho fetra sasany:
Olana ny fananana enti-mitondra sy manavao ny tenany satria tsy ho afaka "hahalala" izay tokony havoakany - sary sy tariby;
tsy fisian'ny fitaovana hifanakalozana fananana sy fitondran-tena eo amin'ny sampan-draharaha tsirairay (ohatra, ny fananana is_build_mode na fanehoana fihetsika). Azo atao ny mampiasa lova, na dia tsy misy fomba tsara hampiharana azy amin'ny Rust aza. Ny tena nilaiko dia ny layout;
nilaina ny fitaovana hifaneraserana eo amin'ny sampana mba hanendry olona ho any amin'ny fitsarana;
ireo sampana mihitsy dia fifangaroan'ny angona sy lojika izay tsy voafehy haingana.
Ny ECS dia miavaka amin'ny foto-kevitra fototra telo:
entity - ny karazana zavatra tian'ny mpanondro (mety ho mpilalao, baolina, na zavatra hafa);
singa - entiny no mandrafitra azy ireo. Ohatra - rendering singa, toerana sy ny hafa. Ireo dia trano fanatobiana data;
rafitra - samy mampiasa zavatra sy singa izy ireo, miampy ny fitondran-tena sy ny lojika mifototra amin'ity data ity. Ny ohatra iray dia rafitra fandrefesana izay miverimberina amin'ny sampan-draharaha rehetra misy singa mandika ary manao ny fandikana.
Rehefa avy nandinika izany dia nanjary nazava fa ny ECS dia mamaha ireto olana manaraka ireto:
fampiasana ny layout fa tsy lova mba handaminana ireo sampana ara-dalàna;
manala ny code jumble amin'ny alalan'ny rafitra fanaraha-maso;
mampiasa fomba toy ny is_build_mode mba hitazonana ny lojika wireframe ao amin'ny toerana iray ihany - ao amin'ny rafitra famandrihana.
Nanamora ny fiainana ny ECS. Ankehitriny dia nanana fomba rafitra aho hanampiana angona amin'ny enti-manana ary hanampy lojika mifototra amin'io data io. Ary izany indray no nahafahana nandamina ny fitsinjarana ny olona eny anivon’ny fitsarana.
Inona no nataoko:
nampiana angona momba ny fitsarana voatendry ho an'ny olona;
nampiana angona momba ny olona nozaraina tamin'ny TennisCourt;
nanampy ny CourtChoosingSystem, izay ahafahanao mamakafaka ny olona sy ny fitsarana, mamantatra ny fitsarana misy ary mizara mpilalao amin'izy ireo;
nanampy PersonMovementSystem, izay mitady olona voatendry ho any amin'ny fitsarana, ary raha tsy eo izy ireo, dia mandefa olona any amin'izay ilainy.
Famintinana
Tena nahafinaritra ahy ny niasa tamin'ity lalao tsotra ity. Ankoatra izany, faly aho fa nampiasa Rust nanoratra azy, satria:
Ny harafesina dia manome anao izay ilainao;
manana antontan-taratasy tena tsara izy io, kanto ny Rust;
mangatsiatsiaka ny tsy miovaova;
tsy mila mampiasa cloning, kopia na hetsika hafa mitovy amin'izany ianao, izay matetika ataoko amin'ny C ++;
Ny safidy dia tena mora ampiasaina ary mitantana tsara ny lesoka;
Raha azo natambatra ny tetikasa, dia 99% ny fotoana niasany, ary araka ny tokony ho izy. Heveriko fa ny hafatra diso amin'ny compiler no tsara indrindra hitako.
Vao manomboka ny fivoaran'ny lalao ao amin'ny Rust. Saingy efa misy vondrom-piarahamonina marin-toerana sy somary lehibe miasa hanokatra Rust ho an'ny rehetra. Noho izany, mijery ny ho avin'ny fiteny aho amin'ny fanantenana, miandrandra ny vokatry ny asa iombonana.