በ 24 ሰዓታት ውስጥ ዝገትን መጫወት-የግል ልማት ልምድ

በ 24 ሰዓታት ውስጥ ዝገትን መጫወት-የግል ልማት ልምድ

በዚህ ጽሑፍ ውስጥ በሩስት ውስጥ ትንሽ ጨዋታን ስለማሳደግ የግል ልምዶቼን እናገራለሁ. የሚሰራ ስሪት ለመፍጠር 24 ሰዓት ያህል ፈጅቷል (በአብዛኛው በምሽት ወይም ቅዳሜና እሁድ እሰራ ነበር)። ጨዋታው ገና አልተጠናቀቀም, ግን ልምዱ ጠቃሚ ይሆናል ብዬ አስባለሁ. ጨዋታውን ከባዶ ስገነባ የተማርኩትን እና አንዳንድ አስተያየቶችን አካፍላለሁ።

Skillbox ይመክራል፡ የሁለት ዓመት ተግባራዊ ኮርስ "እኔ የ PRO ድር ገንቢ ነኝ".

እኛ እናስታውስዎታለን- ለሁሉም የ "ሀብር" አንባቢዎች - የ "Habr" የማስተዋወቂያ ኮድን በመጠቀም በማንኛውም የ Skillbox ኮርስ ውስጥ ሲመዘገቡ የ 10 ሩብልስ ቅናሽ.

ለምን ዝገት?

ይህን ቋንቋ የመረጥኩት ስለሱ ብዙ ጥሩ ነገሮችን ስለሰማሁ እና በጨዋታ እድገት ውስጥ ይበልጥ ተወዳጅ እየሆነ ስለመጣሁ ነው። ጨዋታውን ከመጻፍዎ በፊት በሩስት ውስጥ ቀላል አፕሊኬሽኖችን የማዘጋጀት ልምድ አልነበረኝም። ጨዋታውን በምጽፍበት ጊዜ ይህ የነፃነት ስሜት እንዲሰጠኝ በቂ ነበር።

ለምን ጨዋታው እና ምን አይነት ጨዋታ?

ጨዋታዎችን ማድረግ አስደሳች ነው! ተጨማሪ ምክንያቶች ቢኖሩኝ እመኛለሁ ነገር ግን ለ "ቤት" ፕሮጀክቶች ከመደበኛ ስራዬ ጋር በጣም ቅርብ ያልሆኑ ርዕሶችን እመርጣለሁ. ይህ ምን ጨዋታ ነው? Cities Skylines፣ Zoo Tycoon፣ Prison Architect እና ቴኒስ እራሱን የሚያጣምር እንደ ቴኒስ ሲሙሌተር የሆነ ነገር ለመስራት ፈልጌ ነበር። በአጠቃላይ ሰዎች ለመጫወት የሚመጡበት የቴኒስ አካዳሚ ጨዋታ ሆኖ ተገኘ።

የቴክኒክ ስልጠና

ዝገትን መጠቀም ፈልጌ ነበር፣ ግን ለመጀመር ምን ያህል መሰረት እንደሚወስድ በትክክል አላውቅም ነበር። የፒክሰል ሼዶችን መፃፍ እና ድራግ-ን-ድሮፕ መጠቀም አልፈለኩም፣ ስለዚህ በጣም ተለዋዋጭ መፍትሄዎችን እፈልግ ነበር።

ከእርስዎ ጋር የማካፍላቸውን ጠቃሚ ግብዓቶች አግኝቻለሁ፡-

ብዙ የዝገት ጨዋታ ሞተሮችን ቃኘሁ፣ በመጨረሻም ፒስተን እና ggez መረጥኩ። ከዚህ በፊት በነበረው ፕሮጀክት ላይ ስሠራ አገኘኋቸው። በመጨረሻ ፣ ggezን የመረጥኩት ትንሽ 2D ጨዋታን ለመተግበር የበለጠ ተስማሚ ስለሚመስል ነው። የፒስተን ሞጁል መዋቅር ለጀማሪ ገንቢ (ወይም ከሩስት ጋር ለመጀመሪያ ጊዜ ለሚሰራ ሰው) በጣም የተወሳሰበ ነው።

የጨዋታ መዋቅር

ስለ ፕሮጀክቱ አርክቴክቸር በማሰብ ጥቂት ጊዜ አሳለፍኩ። የመጀመሪያው እርምጃ "መሬት", ሰዎችን እና የቴኒስ ሜዳዎችን መስራት ነው. ሰዎች በየፍርድ ቤቱ ተዘዋውረው መጠበቅ አለባቸው። ተጫዋቾች ከጊዜ ወደ ጊዜ የሚሻሻሉ ክህሎቶች ሊኖራቸው ይገባል. በተጨማሪም፣ አዳዲስ ሰዎችን እና ፍርድ ቤቶችን ለመጨመር የሚያስችል አርታኢ መኖር አለበት፣ ነገር ግን ይህ ከአሁን በኋላ ነጻ አይደለም።

ሁሉንም ነገር ካሰብኩ በኋላ ወደ ሥራ ገባሁ።

የጨዋታ ፈጠራ

መጀመሪያ፡ ክበቦች እና ማጠቃለያዎች

ከግእዝ ምሳሌ ወሰድኩ እና በስክሪኑ ላይ ክብ አገኘሁ። ድንቅ! አሁን አንዳንድ ማጠቃለያዎች። ከጨዋታ ነገር ሀሳብ ማራቅ ጥሩ መስሎኝ ነበር። እያንዳንዱ ነገር እዚህ እንደተገለጸው መቅረብ እና መዘመን አለበት፡-

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

ይህ ኮድ ማዘመን የምችላቸውን ጥሩ የነገሮች ዝርዝር ሰጠኝ እና በተመሳሳይ ጥሩ loop።

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
- ክበብ.rs
- main.rs -> ዋና loop

ሰዎች, ወለሎች እና ምስሎች

ቀጣዩ እርምጃ የአንድ ሰው ጨዋታ ነገር መፍጠር እና ምስሎችን መጫን ነው። ሁሉም ነገር በ 32 * 32 ሰቆች መሰረት መገንባት አለበት.

በ 24 ሰዓታት ውስጥ ዝገትን መጫወት-የግል ልማት ልምድ

የቴኒስ ቤቶች

የቴኒስ ሜዳዎች ምን እንደሚመስሉ ካጠናሁ በኋላ, ከ 4 * 2 ሰቆች ለመሥራት ወሰንኩኝ. መጀመሪያ ላይ, የዚህን መጠን ምስል መስራት ወይም 8 የተለያዩ ንጣፎችን አንድ ላይ ማድረግ ይቻል ነበር. ግን ከዚያ በኋላ ሁለት ልዩ ሰቆች ብቻ እንደሚያስፈልጉ ተገነዘብኩ እና ለምን እንደሆነ እነሆ።

በአጠቃላይ ሁለት እንደዚህ ያሉ ሰቆች አሉን: 1 እና 2.

እያንዳንዱ የፍርድ ቤት ክፍል ንጣፍ 1 ወይም ንጣፍ 2 ያካትታል. እንደ መደበኛ ሊቀመጡ ወይም በ 180 ዲግሪ ሊገለበጡ ይችላሉ.

በ 24 ሰዓታት ውስጥ ዝገትን መጫወት-የግል ልማት ልምድ

መሰረታዊ የግንባታ (የስብስብ) ሁነታ

የጣቢያዎችን፣ ሰዎችን እና ካርታዎችን አተረጓጎም ለማሳካት ከቻልኩ በኋላ፣ መሰረታዊ የመሰብሰቢያ ሁነታም እንደሚያስፈልግ ተገነዘብኩ። እኔ እንደዚህ አይነት ተግባራዊ አድርጌዋለሁ: አዝራሩ ሲጫን, እቃው ይመረጣል, እና ጠቅታውን በተፈለገው ቦታ ያስቀምጣል. ስለዚህ, አዝራር 1 ፍርድ ቤት እንድትመርጥ ይፈቅድልሃል, እና አዝራር 2 ተጫዋች እንድትመርጥ ይፈቅድልሃል.

ግን አሁንም 1 እና 2 ምን ማለት እንደሆነ ማስታወስ አለብን, ስለዚህ የትኛው ነገር እንደተመረጠ ግልጽ ለማድረግ የሽቦ ክፈፍ ጨምሬያለሁ. ይሄ ነው የሚመስለው።

በ 24 ሰዓታት ውስጥ ዝገትን መጫወት-የግል ልማት ልምድ

የስነ-ህንፃ እና የተሃድሶ ጥያቄዎች

አሁን ብዙ የጨዋታ እቃዎች አሉኝ፡ ​​ሰዎች፣ ፍርድ ቤቶች እና ወለሎች። ነገር ግን የሽቦ ክፈፎች እንዲሰሩ እያንዳንዱ የቁስ አካል እቃዎቹ እራሳቸው በማሳያ ሁነታ ላይ መሆናቸውን ወይም ፍሬም በቀላሉ መሳል መነገሩን ማወቅ አለበት። ይህ በጣም ምቹ አይደለም.

አርክቴክቸር አንዳንድ ውሱንነቶችን በሚያሳይ መልኩ እንደገና ማጤን ያለበት መሰለኝ።

  • እራሱን የሚያዘጋጅ እና የሚያዘምን አካል መኖሩ ችግር ነው ምክንያቱም ያ አካል ምን መስራት እንዳለበት "ማወቅ" ስለማይችል - ምስል እና የሽቦ ፍሬም;
  • በግለሰብ አካላት መካከል ንብረቶችን እና ባህሪን ለመለዋወጥ መሳሪያ እጥረት (ለምሳሌ የ is_build_mode ንብረት ወይም ባህሪ ማሳየት)። በሩስት ውስጥ ለመተግበር ምንም ዓይነት ትክክለኛ መንገድ ባይኖርም ውርስን መጠቀም ይቻላል. እኔ በእርግጥ የሚያስፈልገኝ አቀማመጥ ነበር;
  • ሰዎችን ለፍርድ ቤት ለመመደብ አካላት መካከል መስተጋብር የሚሆን መሳሪያ ያስፈልግ ነበር;
  • አካላት ራሳቸው በፍጥነት ከቁጥጥር ውጪ የሆኑ የመረጃ እና የሎጂክ ድብልቅ ነበሩ።

ተጨማሪ ምርምር አድርጌያለሁ እና አርክቴክቸርን አገኘሁ ECS - አካል አካል ሥርዓትበጨዋታዎች ውስጥ በብዛት ጥቅም ላይ የሚውለው. የ ECS ጥቅሞች እነኚሁና:

  • ውሂብ ከሎጂክ ተለይቷል;
  • ከውርስ ይልቅ ጥንቅር;
  • መረጃን ያማከለ አርክቴክቸር.

ECS በሦስት መሠረታዊ ጽንሰ-ሐሳቦች ተለይቷል፡

  • አካላት - መለያው የሚያመለክተው የነገር አይነት (ተጫዋች ፣ ኳስ ወይም ሌላ ነገር ሊሆን ይችላል);
  • አካላት - አካላት ከነሱ የተሠሩ ናቸው ። ምሳሌ - የማሳያ አካል፣ ቦታዎች እና ሌሎች። እነዚህ የውሂብ መጋዘኖች ናቸው;
  • ስርዓቶች - ሁለቱንም እቃዎች እና አካላት ይጠቀማሉ, በተጨማሪም በዚህ መረጃ ላይ የተመሰረተ ባህሪ እና አመክንዮ ይይዛሉ. ለምሳሌ የማሳያ አካላት ባላቸው አካላት ሁሉ የሚደጋገም እና አተረጓጎም የሚሰራ የስርዓተ ክወና ነው።

ካጠናው በኋላ, ECS የሚከተሉትን ችግሮች እንደሚፈታ ግልጽ ሆነ.

  • አካላትን በስርዓት ለማደራጀት ከውርስ ይልቅ አቀማመጥን መጠቀም;
  • የቁጥጥር ስርዓቶችን በመጠቀም የኮድ መጨናነቅን ማስወገድ;
  • እንደ is_build_mode ያሉ ዘዴዎችን በመጠቀም የሽቦ ፍሬም አመክንዮ በተመሳሳይ ቦታ - በማሳያ ስርዓቱ ውስጥ ለማቆየት።

ኢ.ሲ.ኤስን ከተገበሩ በኋላ የሆነው ይህ ነው።

ሀብቶች -> ይህ ሁሉም ንብረቶች ያሉበት ነው (ምስሎች)
src
- አካላት
- አቀማመጥ.rs
- ሰው.rs
- ቴኒስ_ኮርት.rs
- ወለል.rs
- wireframe.rs
- የመዳፊት_ክትትል.rs
- ሀብቶች
- መዳፊት.rs
- ስርዓቶች
- አተረጓጎም.rs
- ቋሚዎች.rs
- utils.rs
- world_factory.rs -> የዓለም ፋብሪካ ተግባራት
- main.rs -> ዋና loop

ሰዎችን ለፍርድ ቤት እንመድባለን።

ECS ሕይወትን ቀላል አድርጓል። አሁን መረጃን ወደ አካላት ለማከል እና በዚያ ውሂብ ላይ በመመስረት አመክንዮ የምጨምርበት ስልታዊ መንገድ ነበረኝ። ይህ ደግሞ በፍርድ ቤቶች መካከል የሰዎችን ስርጭት ለማደራጀት አስችሏል.

ምን አደረግሁ፡

  • ለአንድ ሰው ስለተመደቡ ፍርድ ቤቶች ተጨማሪ መረጃ;
  • ወደ ቴኒስ ኮርት ስለ ተከፋፈሉ ሰዎች የተጨመረ መረጃ;
  • ሰዎችን እና ፍርድ ቤቶችን እንድትመረምር፣ የሚገኙ ፍርድ ቤቶችን እንድታገኝ እና ተጫዋቾችን እንድታሰራጭ የሚያስችል CourtChoosingSystem ታክሏል።
  • ለፍርድ ቤት የተመደቡ ሰዎችን የሚፈልግ PersonMovementSystem ታክሏል፣ እና እዚያ ከሌሉ፣ ከዚያም ሰዎችን ወደ ሚፈልጉበት ይልካል።

በ 24 ሰዓታት ውስጥ ዝገትን መጫወት-የግል ልማት ልምድ

ማጠቃለል

በዚህ ቀላል ጨዋታ ላይ መስራት በጣም ያስደስተኝ ነበር። ከዚህም በላይ ዝገትን ለመጻፍ ስለተጠቀምኩ ደስ ብሎኛል ምክንያቱም፡-

  • ዝገት የሚፈልጉትን ይሰጥዎታል;
  • በጣም ጥሩ ሰነድ አለው ፣ ዝገቱ በጣም የሚያምር ነው ፣
  • ወጥነት አሪፍ ነው;
  • በ C ++ ውስጥ ብዙ ጊዜ ያደረኩትን ወደ ክሎኒንግ ፣ መቅዳት ወይም ሌሎች ተመሳሳይ ድርጊቶችን መጠቀም የለብዎትም ።
  • አማራጮች ለመጠቀም በጣም ቀላል ናቸው እና ስህተቶችን በደንብ ይይዛሉ;
  • ፕሮጀክቱን ማጠናቀር ከቻለ, 99% የሚሆነው ጊዜ ይሰራል, እና በትክክል በትክክል. የማቀናበሪያው የስህተት መልእክቶች ካየኋቸው ምርጥ ናቸው ብዬ አስባለሁ።

በሩስት ውስጥ የጨዋታ እድገት ገና እየተጀመረ ነው። ነገር ግን ዝገትን ለሁሉም ሰው ለመክፈት የሚሰራ የተረጋጋ እና ትክክለኛ ትልቅ ማህበረሰብ አለ። ስለዚህ የቋንቋውን የወደፊት ዕጣ ፈንታ በተስፋ እመለከታለሁ, የጋራ ሥራችንን ውጤት በጉጉት እጠባበቃለሁ.

Skillbox ይመክራል፡

ምንጭ: hab.com

አስተያየት ያክሉ