زبان Rust در مقابل C++ برای توسعه بازی

شکل ۱. Rust در مقابل C++
شکل ۱. Rust در مقابل C++
منتشر شده در blog.logrocket.com به تاریخ ۱۸ ژوئن ۲۰۲۱
لینک منبع Rust vs. C++ for game development

زبان Rust برای گرفتن جای C++ نیست حتی اگر از نظر نحوی مشابه باشند. Rust امنیت حافظه را به عنوان ویژگی اصلی آن فراهم می‌کند، به همین دلیل است که کسانی که Rust را دوست دارند واقعا آن را دوست دارند. Rust هم‌چنین چند منظوره است: می توان از آن برای توسعه وب، توسعه بازی، سیستم‌های فایل، سیستم‌عامل و بسیاری موارد دیگر استفاده کرد.

زبان C++ یک زبان برنامه‌نویسی شی‌گرا است که می‌تواند برای توسعه بازی، سیستم‌های عامل، مرورگرهای وب، سیستم‌های توزیع‌شده/ابر و غیره مورد استفاده قرار گیرد. این روش به دلیل عملکرد بالا، انتزاع قوی، و در دسترس بودن کتابخانه‌ها و ابزارها، به ویژه برای توسعه بازی محبوب است.

در این راهنما، Rust را با C++ در زمینه توسعه بازی مقایسه می‌کنیم. ما شباهت‌ها و تفاوت‌های بین Rust و C++ و مزایا و معایب استفاده از هر زبان برنامه‌نویسی برای توسعه بازی را پوشش خواهیم داد. همچنین شما را با ابزارهایی برای توسعه بازی در Rust و C++ آشنا می‌کنیم.

این چیزی است که ما در اینجا پوشش خواهیم داد:

  • چرا C++ برای توسعه بازی محبوب است
  • موتورهای بازی برای توسعه دهندگان C++
  • زبان Rust در توسعه بازی: آیا ما هنوز بازی می‌کنیم؟
  • چرا از Rust برای توسعه بازی استفاده کنیم؟
  • برنامه‌نویسی شی‌گرا در مقابل برنامه‌نویسی داده‌گرا
  • موتورهای بازی برای توسعه دهندگان Rust
  • ابزارهای Rust برای توسعه بازی
  • جایی که Rust سقوط می‌کند
  • زبان C++ در مقابل Rust: کدام یک برای پروژه توسعه بازی شما بهتر است؟

چرا C++ برای توسعه بازی محبوب است

زبان C++ برای مدتی در صنعت توسعه بازی وجود داشته‌است. بسیاری از توسعه دهندگان بازی ترجیح می‌دهند آن را با دیگر زبان‌ها در خانواده C یا حتی زبان‌های مونتاژ تکمیل کنند.

زبان C++ به عملکرد بالا و انتزاع قوی بستگی دارد. توسعه دهندگان همچنین C++ را برای ویژگی ارث آن و دیگر ویژگی‌های ارائه‌شده توسط مدل شی‌گرا انتخاب می‌کنند. هر کسی که برای مدتی در صنعت بازی بوده‌است، می‌تواند به دسترسی گسترده ابزارها برای ساخت بازی‌ها در C++ گواهی دهد. برای توسعه دهندگانی که مهلت ملاقات دارند یا تازه وارد در صنعت بازی هستند، C++ به دلیل در دسترس بودن گسترده ابزارها و منابع، همیشه مورد استفاده قرار می‌گیرد.

برخلاف Rust، بیشتر موتورهای بازی در C++ با تمام ابزارهایی که برای توسعه بازی‌ها نیاز دارید، جمع می‌شوند.

هنگام ساخت بازی‌ها در C++، مهم است که به دقت در نظر بگیرید کدام موتور برای پروژه شما مناسب‌تر است. همچنین درک مفهوم کلی برنامه‌نویسی شی‌گرا مهم است چون شما با مدل شی‌گرا سر و کار دارید.

موتورهای بازی برای توسعه دهندگان C++

از آنجا که C++ مدت زیادی است که جز لاینفک جامعه توسعه بازی است، طیف گسترده‌ای از موتورهای بازی با C++ ساخته شده‌اند. بیایید برخی از محبوب‌ترین ابزارها را برای توسعه دهندگان بازی C++ مقایسه کنیم.

موتور غیر واقعی

موتور غیر واقعی محبوب‌ترین موتور بازی C++ است. این موتور که در سال ۱۹۹۸ با نام «غیر واقعی» معرفی شد، بسیار قابل‌حمل است و از طیف گسترده‌ای از پلتفرم‌ها پشتیبانی می‌کند.

موتور غیر واقعی، انیمیشن‌های پیشرفته و در زمان واقعی سه‌بعدی تولید می‌کند و پیچیدگی مرتبط با بازی‌های ساختمانی را کاهش می‌دهد. بسیاری از کتابخانه‌های ضروری که برا توسعه بازی خود نیاز دارید، در موتور بازی ساخته می‌شوند، از جمله یک کتابخانه ریاضی، کانتینرها، و غیره.

ادغام کتابخانه‌های شخص ثالث با Unreal نیز با استفاده از الگوی پلاگین شخص ثالث موتور آسان است. برای این کار، شما باید یک ماژول درست کنید همانطور که با ایجاد یک فایل .build.cs ماژول C++ موتور Unreal معمولی را پیکربندی می‌کنید. پرونده .build.cs شما برای پلاگین‌های شخص ثالث اکنون باید به این شکل باشد:

using System;

using System.IO;

using UnrealBuildTool;

public class ThirdPartyLibrary : ModuleRules

{

public ThirdPartyLibrary(ReadOnlyTargetRules Target) : base(Target)

{

Type = ModuleType.External;

// Add any macros that need to be set

PublicDefinitions.Add("WITH_MYTHIRDPARTYLIBRARY=1");

// Add any include paths for the plugin

PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "inc"));

// Add any import libraries or static libraries

PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "lib", "foo.a"));

}

}

این کتابخانه شخص ثالث شما را در آدرس زیر ذخیره می‌کند: UnrealEngine/Engine/Source/ThirdParty/ThirdPartyLibrary

در اصل . Unreal می تواند به راحتی با Helix Core ادغام شود تا پرونده‌های منبع را مدیریت کرده و بازی‌های عالی تولید کند.

بلندر

بلندر یک مجموعه تولید سه بعدی رایگان و نرم افزار منبع آزاد (FOSS) است. این زبان به طور کامل با C++ ساخته شده‌است و از زبان برنامه‌نویسی OpenAL ۳ D و زبان برنامه‌نویسی پایتون پشتیبانی می‌کند. با توجه به این که یک پلتفرم متقابل است، بلندر از اکثر سیستم‌های عامل اصلی پشتیبانی می‌کند. توسعه بازی تنها چیزی نیست که بلندر در آن خوب است؛ شما همچنین می‌توانید فیلم‌های کوتاه و دیگر عناصر سینمایی نیز ایجاد کنید.

یونیتی

یونیتی یک موتور بازی چندبستری است که شما را قادر می‌سازد تا بازی‌های واقعیت مجازی، سه‌بعدی و دوبعدی ایجاد کنید. اگرچه یونیتی عمدتا به عنوان یک موتور بازی انحصاری با MAC OS X ساخته شده‌است، اما از آن زمان در بسیاری از کاربردهای سینمایی، مهندسی و ساخت‌وساز مورد استفاده قرار گرفته‌است.

اگرچه موتور یونیتی با C++ ساخته شده‌است، اما C + معمولا برای توسعه بازی در یونیتی استفاده می‌شود. با این حال، می توان با پیچیدن کد C++ در یک کتابخانه لینک پویا (DLL) ، C++ را در یونیتی نوشت.

موتور Panda3D

برخی از موتورهای بازی نیاز دارند تا شما از کتابخانه‌های خارجی برای تشخیص برخورد، I / O، صوت و غیره استفاده کنید. Panda3D تمام این موارد و بیشتر را در یک بسته ارائه می‌دهد. این موتور بازی نوشته شده در C++ به شما این امکان را می‌دهد که بازی‌ها را در پایتون بنویسید، اگر چه کار برای نوشتن بازی‌ها در C++ وجود دارد.

موتور Godot

در حقیقت Godot یک موتور بازی منبع باز و میان-پلتفرم است که با ابزارهایی که به شما اجازه می‌دهد تا بر روی توسعه بازی خود تمرکز کنید، پر شده‌است. این موتور بازی با C++ ساخته شده‌است و به دلیل انعطاف‌پذیری پشتیبانی شده برای توسعه بازی با C++ بسیار محبوب است.

زبان Rust در توسعه بازی: آیا ما هنوز بازی می‌کنیم؟

برای درک آنچه Rust ارائه می‌دهد و اینکه چرا یک زبان مفید برای توسعه بازی است، بیایید کمی سوار قطار تاریخ شویم تا بفهمیم چرا در وهله اول ایجاد شده‌است.

زبان Rust به عنوان یک پروژه جانبی توسط یکی از کارکنان موزیلا به نام گریدون هور آغاز شد که بیشتر آسیب‌پذیری‌ها را در C++ حل کرد. با گذشت زمان، کاربران موزیلا از نشت حافظه و آسیب‌پذیری‌های دیگر از C++، که زبان اصلی مرورگر وب آن، فایرفاکس است، ناامید شدند.

به همین دلیل است که گریدون هور، Rust را پیشنهاد می‌کند، زبانی که او از سال ۲۰۰۶ بر روی آن کار می‌کرد. بعد از اینکه موزیلا گام‌های بلندی در ایمنی حافظه برداشته بود، تا سال ۲۰۱۰ شروع به حمایت از Rust نکرد.

چرا از Rust برای توسعه بازی استفاده کنیم؟

چرا باید کسی بخواهد از یک زبان جدید برای توسعه بازی به جای خانواده C استفاده کند، که برای قرن‌ها وجود داشته‌است؟ دلیل آن این است که زبان‌های امن حافظه مانند Rust بسیاری از باگ‌هایی که کاربران شما در هنگام استفاده از محصول شما با آن‌ها مواجه خواهند شد را حذف می‌کنند. زبان‌های امن حافظه اجازه نخواهند داد که کدهای دارای نشت حافظه اجرا شوند. برای دستیابی به ایمنی حافظه، Rust از مدل داده محور استفاده می‌کند. این روش عناصر بازی را به عنوان داده در نظر می‌گیرد نه اشیا را به عنوان برنامه‌نویسی شی‌گرا.

برنامه‌نویسی شی‌گرا در مقابل برنامه‌نویسی داده‌گرا

برخی از مشکلات مربوط به برنامه نویسی شی‌گرا در ساخت بازی وجود دارد - به ویژه با یکی از ویژگی‌های اصلی برنامه‌نویسی شی‌گرا، کپسوله سازی. کپسوله سازی به توسعه دهندگان کمک می‌کند تا داده‌ها را پنهان کنند تا یک محیط ایمن را حفظ کنند. با این حال، در توسعه بازی، این ویژگی یک تفنگ بادی است، زیرا هدف ایجاد شده برای آن را شکست می‌دهد.

به عنوان مثال، شما باید از وراثت پیروی کنید تا بتوانید به داده‌ها دسترسی داشته باشید، زیرا شما نمی‌توانید آن را به دلیل کپسوله سازی عمومی کنید. بنابراین، برای هر ویژگی جدیدی که به بازی اضافه می‌شود، شما ممکن است نیاز به دسترسی به داده‌ها از زمینه دیگری داشته باشید، که می‌تواند محصور شود، به طوری که آن‌ها بتوانند این ویژگی را به ارث ببرند.

برای درک عیب کپسوله کردن / ارث مرتبط با OOP در توسعه بازی، بیایید نگاهی به این مثال سریع از کلید بسته کاترین وست در روستکوف ۲۰۱۸ بیندازیم:

typedef uint32_t EntityId;
// Declare World to pass it to Entity
struct World;
struct InputState { ... };
struct RenderState { ... };
// Pure virtual interface!
class Entity {
public:
virtual Vec2F position() const = 0;
void update(World* world) = 0;
void input(InputState const& input_state) = 0;
void render(RenderState& render_state) = 0;
private:
};
class Player : Entity {
public:
Vec2F position() const override;
void input(InputState const& input_state) override;
void update(World* world) override;
void render(RenderState& render_state) override;
private:
Physics m_physics;
HumanoidState m_humanoid;
...
};
class Monster : Entity {
public:
Vec2F position() const override;
void input(InputState const& input_state) override;
void update(World* world) override;
void render(RenderState& render_state) override;
private:
Physics m_physics;
...
};
class NPC : Entity {
public:
Vec2F position() const override;
void input(InputState const& input_state) override;
void update(World* world) override;
void render(RenderState& render_state) override;
private:
Physics m_physics;
HumanoidState m_humanoid;
...
};
struct WorldTile { ... };
struct World {
List<EntityId> player_ids;
HashMap<EntityId, shared_ptr<Entity>> entities;
MultiArray2D<WorldTile> tiles;
...
};

همانطور که پروژه شما رشد می‌کند، بسیاری از روابط فرزند، پدر و مادر و جد در برنامه شما برای مدیریت بسیار دشوار می‌شود و ممکن است یک راه گریز در پروژه شما ایجاد کند. به عنوان مثال، اگر بازی ما یک ویژگی جدید در انتشار آینده به دست آورد، باید از وراثت استفاده کنیم.

به عنوان مثال، اجازه دهید بگوییم، ما به یک هیولا نیاز داریم تا بازیکنان با سلامت بد را ردیابی کند. برای انجام این کار، ما باید یک دسترسی عمومی برای سلامتی بازیکن ایجاد کنیم، چون خصوصی است:

class Monster : Entity {
public:
Vec2F position() const override;
void input(InputState const& input_state) override;
void update(World* world) override;
void render(RenderState& render_state) override;
DamageRegion const& damage_region() const;
private:
...
};

اگر بخواهیم ویژگی‌های بیشتری برای ایالت‌هایی که خصوصی هستند اضافه کنیم، باید امکانات دسترسی بیشتری ایجاد کنیم. با انجام این کار، ما به سوراخ کردن در برنامه‌مان ادامه خواهیم داد تا زمانی که غیر ایمن شود و نتوان آن را مدیریت کرد.

از آنجا که Rust یک رویکرد داده محور را اتخاذ می‌کند، عناصر بازی به عنوان داده در نظر گرفته می‌شوند. Rust از الگوی سیستم اجزا درونی (ECS) در توسعه بازی استفاده می‌کند که در آن واحد متشکل از اجزای مختلفی است که به آن متصل است، جز، متشکل از تکه‌های داده (داده برای توسعه بازی) ، و سیستم منطق برنامه را مدیریت می‌کند. برای مثال، اگر بخواهیم همان مثال را از C++ در Rust تکرار کنیم، رویکرد ECS را با نهادها و اجزا به عنوان ساختار خواهیم داشت.

type EntityIndex = usize;
struct Physics {
position: Vector2<f32>,
velocity: Vector2<f32>,
mass: f32,
}
struct HumanoidAnimationState { ... }
struct HumanoidItem { ... }
struct HumanoidState {
animation_state: HumanoidAnimationState,
left_hand_item: HumanoidItem,
right_hand_item: HumanoidItem,
aim_position: Vector2<f32>,
}
struct Player {
physics: Physics,
humanoid: HumanoidState,
health: f32,
focused_entity: EntityIndex,
food_level: f32,
admin: bool,
...
}
enum MonsterAnimationState { ... }
struct DamageRegion { ... }
struct Monster {
physics: Physics,
animation_state: MonsterAnimationState,
health: f32,
current_target: EntityIndex,
damage_region: DamageRegion,
...
}
struct NpcBehavior { ... }
struct Npc {
physics: Physics,
humanoid: HumanoidState,
health: f32,
behavior: NpcBehavior,
...
}
enum Entity {
Player(Player),
Monster(Monster),
Npc(Npc),
}
struct Assets { ... }
struct GameState {
assets: Assets,
entities: Vec<Option<Entity>>,
players: Vec<EntityIndex>,
...
}
fn main() {
let mut game_state = initial_game_state();
loop {
let input_state = capture_input_state();
player_control_system(&mut game_state, &input_state);
npc_behavior_system(&mut game_state);
monster_behavior_system(&mut game_state);
physics_system(&mut game_state);
// ... lots more systems
render_system(&mut game);
audio_system(&mut game);
wait_vsync();
}
}

ویژگی‌های جدید را می توان به راحتی به ساختار اضافه کرد. برای اجتناب از تکرار می‌توانید از واژه کلیدی impl استفاده کنید. با این روش، بازیابی یا انتقال داده‌ها به یک ویژگی ایمن بدون وراثت آسان است، زیرا اجزا را می توان در هر زمان که مورد نیاز هستند، فراخوانی کرد.

موتورهای بازی برای توسعه دهندگان Rust

اگرچه Rust یک زبان نسبتا جدید در صحنه توسعه بازی است، در حال حاضر یک انتخاب کامل از موتورهای بازی وجود دارد که در Rust ساخته شده‌است. اکثر موتورهای بازی Rust کپی‌هایی از ابزارهایی هستند که در C++ وجود دارند. تفاوت مهم این است که موتورهای Rust به شما اجازه می‌دهند تا عناصر بازی را به عنوان داده در نظر بگیرید نه اشیا.

بیایید نگاهی به برخی از موتورهای بازی بالای Rust بیندازیم و به طور خلاصه به بررسی چگونگی استفاده از آن‌ها در توسعه بازی بپردازیم.

آمتیست (Amethyst)

آمتیست (Amethyst) داده محور، سریع، و آسان برای پیکربندی است. معماری آن بسیار موازی است، از مدل ECS استفاده می‌کند و امکان نمونه‌سازی سریع با فایل‌های RON را فراهم می‌کند. Amethyst به توسعه دهندگان که در توسعه بازی جدید هستند این امکان را می‌دهد که شروع کنند و با اشتیاق فراوان با سرعت سریع پیش بروند. موتور بازی نمونه‌هایی ارائه می‌دهد که به شما کمک می‌کنند به راحتی آشنا شوید. برای اجرای هر یک از مثال‌ها، دستور زیر را در رابط خط فرمان انتخاب خود اجرا کنید:

کاپر (Caper)

کاپر از سیستم‌های دیگر مانند صوت، رندرینگ، ورودی، و تشخیص برخورد پشتیبانی می‌کند. این یک موتور بازی میان-پلتفرم نیست و تنها از سیستم‌عامل لینوکس پشتیبانی می‌کند. Caper نیز مانند Amethyst چند مثال برای کمک به شما در جهت گیری با موتور بازی ارائه می‌دهد. شما می‌توانید این مثال‌ها را با اجرای دستور زیر در رابط خط فرمان خود تست کنید.

cargo run --example name_of_example

چاریوت (Chariot)

چاریوت (Chariot) یک اجرای مجدد از بازی "Age of Empires" است که توسط مایکروسافت منتشر شده و از Genie Engine استفاده می‌کند. چاریوت یک موتور بازی متن باز است که می‌تواند به هر پلتفرم مورد نظر منتقل شود. هدف از این موتور بازی این است که بازی‌ها را مانند عنوان ذکر شده انجام دهد.

cargo run --example transforms

کنسول(Console)

اگر موتوری می‌خواهید که ابزارهایی برای کنترل ورودی کاربر فراهم کند، کنسول بهترین شرط شماست. با موتور کنسول، حتی اگر نمی‌خواهید پایانه، موشواره، یا کیبورد جابجا شوند، می‌توانید به راحتی صفحه نمایش مستقل ایجاد کنید.

اکسیژن

اکسیژن یک موتور بازی تحت وب است که در Rust با سیستم تحت وب نوشته شده‌است. این یک موتور بازی HTML5 و WebAssemble است که بر اساس جعبه مشخصات استفاده شده برای چارچوب ECS آن ساخته شده است.

موتورهای بازی قابل‌توجه دیگری که در Rust نوشته شده‌اند شامل bevy, coffee, corange, doryen, dotrix, muoxi, rusty_engine, turbine و بسیاری دیگر هستند.

تجهیز Rust برای توسعه بازی

همانطور که قبلا اشاره شد، تجهیز نقش مهمی در توسعه بازی ایفا می‌کند. در این بخش، مانند کاری که با C++ کردیم، نگاهی به برخی از ابزارهای Rust برای توسعه بازی می‌اندازیم.

رندرینگ ۲ بعدی

رندر کردن بخش مهمی از ایجاد بازی است، چون به کاربران محصول شما یک رابط کاربری جذاب با تصاویر دو بعدی و فوتورئالیستی می‌دهد. برخی از ابزارهای رندرینگ دو بعدی برتر برای توسعه بازی Rust عبارتند از:

  • ابزار رندرینگ دوبعدی beryllium
  • ابزار رندرینگ دوبعدی blit
  • ابزار رندرینگ دوبعدی crow
  • ابزار رندرینگ دوبعدی fermium
  • ابزار رندرینگ دوبعدی image

رندرینگ سه‌بعدی

در حالی که رندر دو بعدی تصاویر دو بعدی فوتورئالیستی ارائه می‌دهد، همانطور که احتمالا می‌توانید حدس بزنید، رندر سه‌بعدی باعث می‌شود محیط بازی شما با تصاویر سه‌بعدی حتی واقعی‌تر به نظر برسد. در زیر برخی از مفیدترین ابزارهای رندرینگ سه‌بعدی برای توسعه دهندگان بازی Rust آورده شده‌است:

  • ابزار رندرینگ سه‌بعدی ash
  • ابزار رندرینگ سه‌بعدی gfx
  • ابزار رندرینگ سه‌بعدی gl
  • ابزار رندرینگ سه‌بعدی glow
  • ابزار رندرینگ سه‌بعدی glutin

هوش مصنوعی (AL)

کتابخانه‌های هوش مصنوعی شما را قادر می‌سازند تا از الگوریتم‌ها برای اجرای رفتارهای پیش‌بینی در بازی خود استفاده کنید. برای مثال، کتابخانه‌های هوش مصنوعی با الگوریتم‌های شطرنج از پیش ساخته‌شده وجود دارند که می‌توانید از آن‌ها برای ایجاد چنین بازی در Rust استفاده کنید. نمونه‌های برجسته کتابخانه‌های Rust هوش مصنوعی برای توسعه بازی عبارتند از:

  • کتابخانه هوش مصنوعی chess_ai
  • کتابخانه هوش مصنوعی pathfinding
  • کتابخانه هوش مصنوعی navmesh
  • کتابخانه هوش مصنوعی steering
  • کتابخانه هوش مصنوعی big_brain

کتابخانه‌های انیمیشن

اغلب بازی‌ها به حرکت نیاز دارند. کتابخانه‌های انیمیشن در Rust شما را قادر می‌سازند تا تصاویر را دستکاری کنید تا طوری رفتار کنید که انگار در حال حرکت هستند. از آنجا که اکثر کتابخانه‌های Rust توسط اعضای جامعه ساخته شده‌اند و Rust زبان نسبتا جدیدی در صحنه است، پارین تنها گروه انیمیشن است که به طور گسترده برای توسعه بازی در Rust در زمان نوشتن استفاده می‌شود.

پارین به شما این امکان را می‌دهد تا انیمیشن‌های را ایجاد کنید که بدون نیاز به گذراندن متغیرهای زمانی در اطراف، با گذشت زمان پارامتردهی می‌شوند. این امر برای ایجاد گذاره‌ای روان بین حالت‌های چند بازی مفید است.

پوشش صوتی

صدا به اندازه حرکت در توسعه بازی مهم است. به عنوان مثال، یک بازی عملی بدون صدای بوم، صدای خرد شدن و صداهای دیگر مرتبط با خرابی، ناقص و خسته‌کننده به نظر می‌رسد.

فهرست زیر از ابزارهای صوتی Rust برای شروع در هنگام جستجوی اجرای صدا در بازی Rust شما مناسب است:

کتابخانه‌های ورودی

برای بازی‌هایی که از پدها و دیگر دستگاه‌های ورودی استفاده می‌کنند، شما به یک جعبه برای رسیدگی به کنترلرها در دستگاه‌های ورودی نیاز دارید. Rust دو کتابخانه ورودی دارد:

  • کتابخانه ورودی gilrs
  • کتابخانه ورودی sdl2

ابزارهای شبکه‌ای

بازی‌ها زمانی که شما آن‌ها را با دوستان خود بازی می‌کنید، بسیار لذت بخش تر هستند. اکوسیستم Rust شامل طیف وسیعی از ابزارهای شبکه‌ای برای کمک به افزایش هم‌کاری میان توسعه دهندگان و تسهیل ویژگی‌های چندبازیکنی در بازی‌های Rust، از جمله:

کتابخانه‌های تشخیص برخورد

در انواع خاصی از بازی‌ها، کاربر با برخورد با چیزی امتیاز کسب می‌کند یا شکست می‌خورد. کتابخانه‌های تشخیص برخورد تنها کاری را انجام می‌دهند که نام آن نشان می‌دهد: تشخیص برخورد در بازی شما.

کتابخانه‌های تشخیص برخورد مفید برای توسعه دهندگان بازی Rust عبارتند از:

  • کتابخانه‌ تشخیص برخورد physme
  • کتابخانه‌ تشخیص برخورد physx
  • کتابخانه‌ تشخیص برخورد rapier
  • کتابخانه‌ تشخیص برخورد salva
  • کتابخانه‌ تشخیص برخورد mgf

کتابخانه‌های رابط کاربری

رابط کاربری اولین چیزی است که بازیکن در مورد بازی شما می‌بیند و قضاوت می‌کند، حتی قبل از اینکه با آن درگیر شود و آن را تجربه کند. برداشت اول همه چیز در توسعه بازی است، و یک رابط کاربری بد اغلب بازیکنان را قبل از این که حتی شروع به تعامل با بازی شما کنند، خاموش می‌کند.

برخی کتابخانه‌های رابط کاربری برای توسعه بازی Rust عبارتند از:

  • کتابخانه‌ egui
  • کتابخانه‌ fungui
  • کتابخانه‌ imgui
  • کتابخانه‌ iced
  • کتابخانه‌ vitral

موتورهای واقعیت مجازی

در سال ۲۰۲۱، برخی از بخش‌های جامعه توسعه بازی به سمت واقعیت مجازی گرایش دارند، و چشم اندازه‌ای بصری بسیار واقع گرایانه ایجاد می‌کنند که بازیکنان را احاطه کرده و آن‌ها را غرق می‌کنند.

در زیر برخی از بهترین موتورهای واقعیت مجازی Rust ارائه شده‌است:

  • موتور واقعیت مجازی openvr
  • موتور واقعیت مجازی openxr
  • موتور واقعیت مجازی rovr
  • موتور واقعیت مجازی libovr

جایی که Rust سقوط می‌کند

هنگام ساخت بازی‌ها در Rust، مهم است که درک کنیم که بسیاری از ابزارها و موتورهای Rust هنوز در مرحله توسعه هستند. و برای تکرار، رویکرد Rust برای توسعه بازی، داده محور است. بنابراین، اگر از یک پس‌زمینه شی‌گرا مانند C++ می‌آیید، باید قبل از شروع با توسعه بازی در Rust کمی وقت بگذارید تا با مدل داده‌گرا آشنا شوید.

برای مطالعه بیشتر در مورد چالش‌های ناشی از برنامه‌نویسی شی‌گرا در توسعه بازی، کلید بسته کاترین وست از روستکونف ۲۰۱۸ را بررسی کنید.

زبان C++ در مقابل Rust: کدام یک برای پروژه توسعه بازی شما بهتر است؟

به نظر من، هیچ چیزی به عنوان یک زبان برنامه‌نویسی عالی یا حتی یک زبان برنامه‌نویسی ذاتا خوب وجود ندارد. بهترین زبان، چارچوب، کتابخانه، یا ابزار برای هر کاری به سطح راحتی شما با استفاده از آن و نیازمندی‌های منحصر به فرد و اهداف پروژه شما بستگی دارد.

در دسترس بودن ابزارها و پشتیبانی نیز ملاحظات بالایی برای توسعه دهندگان بازی هستند. اکوسیستم C++ شامل طیف وسیع‌تری از ابزارهای مورد تلاش و درست است که سال‌ها وجود داشته‌اند و در میان جامعه توسعه دهنده بازی مورد اعتماد هستند. استفاده از IDE ها و ابزارهای دیگر در Rust آسان‌تر است زیرا یک جامعه بازی فعال برای پشتیبانی وجود دارد. همچنین، بیشتر کتابخانه‌ها در موتور بازی جای می‌گیرند که استفاده از آن‌ها را آسان‌تر می‌کند.

به طور کلی، اگر با یک ضرب العجل کار می‌کنید، C++ یک انتخاب قوی برای پروژه شما است چون C++ به راحتی ابزارهای در دسترس دارد. همچنین بهترین شرط شما این است که با برنامه‌نویسی شی گرا راحت‌تر از زبان‌های داده گرا باشید.

از طرف دیگر، اگر در حال ساخت یک بازی هستید که در آن ایمنی حافظه یک اولویت است و شما با یک ضرب العجل کار نمی‌کنید، Rust احتمالا بهترین انتخاب شماست. دلیل آن این است که Rust ابزارهای در دسترس ساده‌ای مانند C++ ندارد و اکثر کتابخانه‌ها باید در موتور بازی توسعه دهنده گنجانیده شوند. حمایت جامعه و کانال‌های ارتباطی در اختلافات و جاه‌ای دیگر وجود دارد. شما می‌توانید به روز بمانید و آمادگی تولید Rust را در رابطه با توسعه بازی با بازدید از آیا ما هنوز بازی می‌کنیم؟

نتیجه‌گیری

در این راهنما، اصول اولیه توسعه بازی در زبان برنامه‌نویسی C++ و Rust را بررسی کردیم. ما تجربه توسعه دهنده را با استفاده از Rust و C++ برای ساخت بازی‌ها مقایسه کردیم. فهرست پرکاربردترین و پرکاربردترین ابزارها برای پیاده‌سازی انیمیشن، صدا، تشخیص برخورد، ویژگی‌های چند بازیکنی و … و پارامترهای ساده‌ای را برای تعیین اینکه کدام زبان برای پروژه توسعه بازی مناسب است تعریف کردیم.

این متن با استفاده از ربات ترجمه مقالات علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.