පැය 24 තුළ රස්ට් සෙල්ලම් කිරීම: පුද්ගලික සංවර්ධන අත්දැකීම

පැය 24 තුළ රස්ට් සෙල්ලම් කිරීම: පුද්ගලික සංවර්ධන අත්දැකීම

මෙම ලිපියෙන් මම රස්ට් හි කුඩා ක්‍රීඩාවක් සංවර්ධනය කිරීමේ මගේ පුද්ගලික අත්දැකීම් ගැන කතා කරමි. වැඩ කරන අනුවාදයක් නිර්මාණය කිරීමට පැය 24 ක් පමණ ගත විය (මම බොහෝ විට සවස් කාලයේ හෝ සති අන්තවල වැඩ කළා). ක්‍රීඩාව අවසන් වී නැත, නමුත් අත්දැකීම ප්‍රතිලාභදායක වනු ඇතැයි මම සිතමි. මම ඉගෙන ගත් දේ සහ මුල සිට ක්‍රීඩාව ගොඩනැගීමේදී මා කළ නිරීක්ෂණ කිහිපයක් බෙදා ගන්නෙමි.

Skillbox නිර්දේශ කරයි: වසර දෙකක ප්‍රායෝගික පාඨමාලාව "මම PRO වෙබ් සංවර්ධකයෙක්".

අපි ඔබට මතක් කරමු: "Habr" හි සියලුම පාඨකයින් සඳහා - "Habr" ප්‍රවර්ධන කේතය භාවිතයෙන් ඕනෑම Skillbox පාඨමාලාවකට ලියාපදිංචි වන විට රූබල් 10 ක වට්ටමක්.

ඇයි මලකඩ?

මම මෙම භාෂාව තෝරා ගත්තේ මම මේ ගැන බොහෝ හොඳ දේවල් අසා ඇති නිසා සහ ක්‍රීඩා සංවර්ධනයේදී එය වඩ වඩාත් ජනප්‍රිය වෙමින් පවතිනු මම දකින බැවිනි. ක්‍රීඩාව ලිවීමට පෙර, රස්ට් හි සරල යෙදුම් සංවර්ධනය කිරීමේ අත්දැකීම් මට අඩු විය. ක්‍රීඩාව ලියන විට මට නිදහසේ හැඟීමක් ලබා දීමට මෙය ප්‍රමාණවත් විය.

ඇයි ක්රීඩාව සහ කුමන ආකාරයේ ක්රීඩාවක්ද?

ක්රීඩා කිරීම විනෝදජනකයි! තවත් හේතු තිබේ නම් මම කැමතියි, නමුත් “නිවසේ” ව්‍යාපෘති සඳහා මම මගේ සාමාන්‍ය වැඩවලට එතරම් සමීප නොවන මාතෘකා තෝරා ගනිමි. මේ මොන සෙල්ලමක්ද? මට අවශ්‍ය වුණා Cities Skylines, Zoo Tycoon, Prison Architect සහ ටෙනිස් එකට එකතු වෙලා ටෙනිස් සිමියුලේටරයක් ​​වගේ දෙයක් හදන්න. පොදුවේ ගත් කල, එය මිනිසුන් සෙල්ලම් කිරීමට පැමිණෙන ටෙනිස් ඇකඩමියක් පිළිබඳ ක්රීඩාවක් බවට පත් විය.

තාක්ෂණික පුහුණුව

මට රස්ට් භාවිතා කිරීමට අවශ්‍ය විය, නමුත් එය ආරම්භ කිරීමට කොපමණ පදනමක් අවශ්‍යදැයි මම හරියටම දැන සිටියේ නැත. මට පික්සල් ෂෙඩර් ලිවීමට සහ ඩ්‍රැග්-එන්-ඩ්‍රොප් භාවිතා කිරීමට අවශ්‍ය නොවූ නිසා මම වඩාත් නම්‍යශීලී විසඳුම් සොයමින් සිටියෙමි.

මම ඔබ සමඟ බෙදා ගන්නා ප්‍රයෝජනවත් සම්පත් මට හමු විය:

මම රස්ට් ක්‍රීඩා එන්ජින් කිහිපයක් ගවේෂණය කළෙමි, අවසානයේදී පිස්ටන් සහ ගේස් තෝරා ගත්තෙමි. මට ඔවුන්ව මුණගැසුණේ කලින් ව්‍යාපෘතියක වැඩ කරන අතරතුරයි. අවසානයේදී, මම කුඩා 2D ක්‍රීඩාවක් ක්‍රියාත්මක කිරීම සඳහා වඩාත් සුදුසු බව පෙනෙන නිසා මම ggez තෝරා ගත්තෙමි. පිස්ටන්ගේ මොඩියුලර් ව්‍යුහය නවක සංවර්ධකයෙකුට (හෝ පළමු වරට රස්ට් සමඟ වැඩ කරන කෙනෙකුට) ඉතා සංකීර්ණ වේ.

ක්රීඩා ව්යුහය

මම ව්‍යාපෘතියේ ගෘහ නිර්මාණ ශිල්පය ගැන ටිකක් කල්පනා කළා. පළමු පියවර වන්නේ "ඉඩම්", මිනිසුන් සහ ටෙනිස් පිටි සෑදීමයි. මිනිස්සුන්ට උසාවි වටේ ගිහින් බලාගෙන ඉන්න වෙනවා. ක්‍රීඩකයන්ට කාලයත් සමඟ දියුණු වන කුසලතා තිබිය යුතුය. ඊට අමතරව, ඔබට නව පුද්ගලයින් සහ උසාවි එකතු කිරීමට ඉඩ සලසන සංස්කාරකයක් තිබිය යුතුය, නමුත් මෙය තවදුරටත් නොමිලේ නොවේ.

හැමදේම කල්පනා කරලා මම වැඩේට බැස්සා.

ක්රීඩාව නිර්මාණය කිරීම

ආරම්භය: කව සහ වියුක්තයන්

මම gez එකෙන් උදාහරණයක් අරගෙන තිරයේ රවුමක් ගැහුවා. පුදුමයි! දැන් සාරාංශ කිහිපයක්. ක්‍රීඩා වස්තුවක් පිළිබඳ අදහසින් වියුක්ත කිරීම හොඳ යැයි මම සිතුවෙමි. සෑම වස්තුවක්ම මෙහි දක්වා ඇති පරිදි විදැහුම් කර යාවත්කාලීන කළ යුතුය:

// 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
— circle.rs
— main.rs -> ප්‍රධාන ලූපය

මිනිසුන්, බිම් සහ රූප

මීලඟ පියවර වන්නේ පුද්ගල ක්‍රීඩා වස්තුවක් නිර්මාණය කිරීම සහ පින්තූර පැටවීමයි. සෑම දෙයක්ම 32 * 32 ටයිල් පදනම මත ගොඩනගා ගත යුතුය.

පැය 24 තුළ රස්ට් සෙල්ලම් කිරීම: පුද්ගලික සංවර්ධන අත්දැකීම

ටෙනිස් පිටිය

ටෙනිස් පිට්ටනි මොන වගේද කියලා අධ්‍යයනය කරලා මම තීරණය කළා ටයිල් 4*2කින් ඒවා හදන්න. මුලදී, මෙම ප්රමාණයේ රූපයක් සෑදීමට හෝ වෙනම ටයිල් 8 ක් එකට එකතු කිරීමට හැකි විය. නමුත් පසුව මට තේරුණා අද්විතීය ටයිල් දෙකක් පමණක් අවශ්‍ය බව, මෙන්න ඇයි.

සමස්තයක් වශයෙන් අපට එවැනි උළු දෙකක් තිබේ: 1 සහ 2.

උසාවියේ සෑම අංශයක්ම ටයිල් 1 හෝ ටයිල් 2 කින් සමන්විත වේ. ඒවා සාමාන්‍ය ලෙස තැබිය හැකිය හෝ අංශක 180 ක් පෙරළිය හැකිය.

පැය 24 තුළ රස්ට් සෙල්ලම් කිරීම: පුද්ගලික සංවර්ධන අත්දැකීම

මූලික ඉදිකිරීම් (එකලස්) ආකාරය

අඩවි, පුද්ගලයින් සහ සිතියම් විදැහුම්කරණය කිරීමට මා සමත් වූ පසු, මූලික එකලස් කිරීමේ මාදිලියක් ද අවශ්‍ය බව මට වැටහුණි. මම එය ක්‍රියාත්මක කළේ මේ ආකාරයට ය: බොත්තම එබූ විට, වස්තුව තෝරාගෙන, ක්ලික් කිරීමෙන් එය අපේක්ෂිත ස්ථානයේ තබයි. එබැවින්, බොත්තම 1 ඔබට උසාවියක් තෝරා ගැනීමට ඉඩ සලසයි, සහ බොත්තම 2 ඔබට ක්රීඩකයෙකු තෝරා ගැනීමට ඉඩ සලසයි.

නමුත් අපි තවමත් 1 සහ 2 යන්නෙන් අදහස් කරන්නේ කුමක්දැයි මතක තබා ගත යුතුය, එබැවින් මම තෝරාගත් වස්තුව කුමක්ද යන්න පැහැදිලි කිරීමට වයර් රාමුවක් එක් කළෙමි. එය පෙනෙන්නේ මෙයයි.

පැය 24 තුළ රස්ට් සෙල්ලම් කිරීම: පුද්ගලික සංවර්ධන අත්දැකීම

ගෘහ නිර්මාණ ශිල්පය සහ ප්‍රතිනිර්මාණය කිරීමේ ප්‍රශ්න

දැන් මට ක්රීඩා වස්තු කිහිපයක් තිබේ: මිනිසුන්, උසාවි සහ මහල්. නමුත් වයර් රාමු ක්‍රියා කිරීමට නම්, එක් එක් වස්තු ආයතනයට එම වස්තූන්ම නිරූපණ මාදිලියේ තිබේද, නැතහොත් රාමුවක් සරලව ඇඳ තිබේද යන්න පැවසිය යුතුය. මෙය ඉතා පහසු නොවේ.

සමහර සීමාවන් හෙළි කරන ආකාරයෙන් ගෘහ නිර්මාණ ශිල්පය නැවත සිතා බැලිය යුතු බව මට පෙනී ගියේය:

  • විදැහුම්කරණය සහ යාවත්කාලීන කරන ආයතනයක් තිබීම ගැටලුවකි, මන්ද එම ආයතනයට එය විදැහුම් කළ යුතු දේ - රූපයක් සහ වයර් රාමුවක් "දැන ගැනීමට" නොහැකි වනු ඇත;
  • තනි ආයතන අතර දේපල හා හැසිරීම් හුවමාරු කිරීම සඳහා මෙවලමක් නොමැතිකම (උදාහරණයක් ලෙස, is_build_mode දේපල හෝ හැසිරීම් විදැහුම්කරණය). මලකඩ තුළ එය ක්රියාත්මක කිරීමට නිසි ක්රමයක් නොමැති වුවද, උරුමය භාවිතා කිරීමට හැකි වනු ඇත. මට ඇත්තටම අවශ්‍ය වූයේ පිරිසැලසුම;
  • පුද්ගලයන් අධිකරණයට පැවරීම සඳහා ආයතන අතර අන්තර්ක්‍රියා සඳහා මෙවලමක් අවශ්‍ය විය;
  • ආයතන යනු දත්ත සහ තර්කනයේ මිශ්‍රණයක් වූ අතර එය ඉක්මනින් පාලනයෙන් මිදුණි.

මම තව ටිකක් පර්යේෂණ කරලා ගෘහ නිර්මාණ ශිල්පය සොයා ගත්තා ECS - ආයතන සංරචක පද්ධතිය, ක්‍රීඩා වල බහුලව භාවිතා වන. ECS හි ප්‍රතිලාභ මෙන්න:

  • දත්ත තර්කයෙන් වෙන් කර ඇත;
  • උරුමය වෙනුවට සංයුතිය;
  • දත්ත කේන්ද්‍රීය ගෘහ නිර්මාණ ශිල්පය.

ECS මූලික සංකල්ප තුනකින් සංලක්ෂිත වේ:

  • ආයතන - හැඳුනුම්කාරකය සඳහන් කරන වස්තුවේ වර්ගය (එය ක්‍රීඩකයෙකු, බෝලයක් හෝ වෙනත් දෙයක් විය හැකිය);
  • සංරචක - ආයතන ඒවායින් සෑදී ඇත. උදාහරණය - විදැහුම්කරණ සංරචක, ස්ථාන සහ අනෙකුත්. මේවා දත්ත ගබඩා;
  • පද්ධති - ඒවා වස්තු සහ සංරචක යන දෙකම භාවිතා කරයි, තවද මෙම දත්ත මත පදනම් වූ හැසිරීම් සහ තර්කනය අඩංගු වේ. උදාහරණයක් වන්නේ විදැහුම්කරණ සංරචක සහිත සියලුම ආයතන හරහා පුනරාවර්තනය වන සහ විදැහුම්කරණය සිදු කරන විදැහුම්කරණ පද්ධතියකි.

එය අධ්‍යයනය කිරීමෙන් පසු, ECS පහත සඳහන් ගැටළු විසඳන බව පැහැදිලි විය:

  • ආයතන ක්‍රමානුකූලව සංවිධානය කිරීම සඳහා උරුමය වෙනුවට පිරිසැලසුම භාවිතා කිරීම;
  • පාලන පද්ධති හරහා කේත අවුල් ඉවත් කිරීම;
  • Wireframe logic එකම ස්ථානයේ තබා ගැනීමට is_build_mode වැනි ක්‍රම භාවිතා කිරීම - විදැහුම්කරණ පද්ධතියේ.

ECS ක්‍රියාත්මක කිරීමෙන් පසු සිදු වූයේ මෙයයි.

සම්පත් -> සියලු වත්කම් ඇති ස්ථානය මෙයයි (රූප)
src
- සංරචක
-position.rs
— person.rs
— tennis_court.rs
— floor.rs
- wireframe.rs
— mouse_tracked.rs
- සම්පත්
—mouse.rs
- පද්ධති
- rendering.rs
- නියතයන්.rs
- utils.rs
— world_factory.rs -> ලෝක කර්මාන්තශාලා කාර්යයන්
— main.rs -> ප්‍රධාන ලූපය

අපි උසාවිවලට මිනිස්සු පවරනවා

ECS ජීවිතය පහසු කර ඇත. දැන් මට ආයතනවලට දත්ත එකතු කිරීමට සහ එම දත්ත මත පදනම්ව තර්ක එකතු කිරීමට ක්‍රමානුකූල ක්‍රමයක් තිබුණි. මෙය අනෙක් අතට උසාවි අතර මිනිසුන් බෙදා හැරීම සංවිධානය කිරීමට හැකි විය.

මා කළ දේ:

  • පුද්ගලයාට පවරා ඇති උසාවි පිළිබඳ දත්ත එකතු කිරීම;
  • TennisCourt වෙත බෙදා හරින ලද පුද්ගලයින් පිළිබඳ දත්ත එකතු කිරීම;
  • පුද්ගලයින් සහ උසාවි විශ්ලේෂණය කිරීමට, පවතින උසාවි හඳුනා ගැනීමට සහ ඔවුන්ට ක්‍රීඩකයින් බෙදා හැරීමට ඉඩ සලසන CourtChoosingSystem එකතු කරන ලදී;
  • PersonMovementSystem එකක් එකතු කරන ලදී, එය උසාවියට ​​පවරන ලද පුද්ගලයින් සොයන අතර ඔවුන් එහි නොමැති නම්, ඔවුන් සිටිය යුතු තැනට පුද්ගලයින් යවයි.

පැය 24 තුළ රස්ට් සෙල්ලම් කිරීම: පුද්ගලික සංවර්ධන අත්දැකීම

සාරාංශගත කිරීම

මෙම සරල ක්‍රීඩාවේ වැඩ කිරීමට මම ඇත්තෙන්ම ප්‍රිය කළෙමි. එපමණක් නොව, මම එය ලිවීමට රස්ට් භාවිතා කිරීම ගැන මම සතුටු වෙමි, මන්ද:

  • මලකඩ ඔබට අවශ්ය දේ ලබා දෙයි;
  • එහි විශිෂ්ට ලියකියවිලි ඇත, මලකඩ ඉතා අලංකාරයි;
  • අනුකූලතාව සිසිල් ය;
  • මම බොහෝ විට C++ හි සිදු කළ ක්ලෝන කිරීම, පිටපත් කිරීම හෝ වෙනත් සමාන ක්‍රියා කිරීමට ඔබට අවශ්‍ය නැත;
  • විකල්ප භාවිතා කිරීමට ඉතා පහසු වන අතර දෝෂ ඉතා හොඳින් හසුරුවන්න;
  • ව්‍යාපෘතිය සම්පාදනය කිරීමට හැකි වූයේ නම්, එය 99% ක්ම ක්‍රියාත්මක වන අතර, එය හරියටම කළ යුතු පරිදි. මම හිතන්නේ compiler Error Messages තමයි මම දැකපු හොඳම ඒවා.

රස්ට් හි ක්‍රීඩා සංවර්ධනය දැන් ආරම්භ වේ. නමුත් සෑම කෙනෙකුටම රස්ට් විවෘත කිරීමට දැනටමත් ස්ථාවර සහ තරමක් විශාල ප්‍රජාවක් ක්‍රියා කරයි. ඒ නිසා මම අපේ පොදු කාර්යයේ ප්‍රතිඵල බලාපොරොත්තුවෙන් භාෂාවේ අනාගතය දෙස සුබවාදීව බලනවා.

Skillbox නිර්දේශ කරයි:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න