Як я можу ефективно кодувати одночасно і клієнта, і сервера?


15

Я кодую свою гру за допомогою моделі клієнт-сервер. Граючи в одиночному гравці, гра запускає локальний сервер і взаємодіє з ним так само, як віддалений сервер (мультиплеєр). Я зробив це, щоб уникнути кодування окремих однокористувацьких та багатокористувацьких кодів.

Я щойно почав кодувати і зіткнувся з основною проблемою. В даний час я розробляю гру в Eclipse, маючи всі ігрові класи, організовані в пакети. Потім у своєму серверному коді я просто використовую всі класи в клієнтських пакетах.

Проблема полягає в тому, що ці клієнтські класи мають змінні, характерні для візуалізації, які, очевидно, не виконувалися б на сервері.

Чи слід створювати модифіковані версії клієнтських класів, які слід використовувати на сервері? Або мені просто змінити клієнтські класи булевими, щоб вказати, чи використовує його клієнт / сервер. Чи є у мене інші варіанти? У мене просто була думка про те, можливо, використовувати серверний клас як основний клас, а потім розширити його рендерінгами?


Чи є у вас предпроцесорні варіанти? Як і #ifdef КЛІЄНТ <деякий код> #endif. Це простий спосіб мати спільні файли класів, які можуть відрізнятися між сервером і клієнтом, а також розділяти частини. Це трохи безладно, хоча.
Вільям Маріагер

Я згоден з MindWorX. Хоча умовна компіляція є болем у Java, є рішення, які слід враховувати.
sam hocevar

1
Умовна компіляція - це грубий спосіб сказати: "Я не вклав достатньо часу на розробку в свої пакунки", на мою думку =) "Трохи безладно" зазвичай перекладається на "Що, чорт, робить це?" через шість місяців, коли ви перечитуєте навіть власний код і є контрпродуктивним для будь-якого, крім викидних прототипів.
Патрік Х'юз

Відповіді:


23

Вам слід віддати перевагу коду візуалізації окремо від логіки гри , оскільки вони є окремими проблемами .

Якщо відокремити код відтворення від коду клієнта / сервера, ви отримаєте пару переваг:

  • Створити виділений сервер буде простіше, оскільки будь-який код, який відображатиметься, буде в одному місці.
  • Ви можете відокремити свою updateфазу від renderфази та запустити їх у різні часові кроки.
  • Ви можете переконатися, що ваш код візуалізації не змінює стан гри const, зменшуючи помилки.

1
+1 Я більше не можу погодитися з цим настроєм. Відокремлення моделювання даних від наданих представлень цієї моделі дозволить вам чітко робити акуратні речі, як-от кілька вікон, які показують різну інформацію, переносити візуалізацію на інші платформи, додавати аналіз та налаштовувати своє моделювання для геймплея, не торкаючись 90% бази коду .
Патрік Х'юз

5

Я думаю, вам слід чітко розділити код клієнта та сервера. Код сервера та код клієнта не повинні знати один про одного, окрім функціональних можливостей, що піддаються інтерфейсам. Сервер не повинен нічого знати про візуалізацію, просто реєструвати клієнтів, відстежувати позиції, час і т. Д. Якщо ви чітко розділили проблеми, простіше підтримувати та розвивати свою гру. Сподіваюсь, це трохи допомагає.


+1 Я схильний з цим погоджуватися. Якщо на сервері будуть працювати будь-які клієнти, то це слід робити як окремі процеси.
Інженер

5

Як відомі інші, відокремлюється проблема FTW, але якщо ваша кінцева мета - це окремі клієнтські та серверні програми, вам потрібно зробити крок далі. Вам потрібно визначити, що стосується клієнта, що стосується сервера та що є спільним. Для всього, що поділяється, розділіть його на класи виключно спільного коду; Класи, що стосуються клієнта або сервера, можуть відповідно підклас або посилатись на спільні класи відповідно. Перенесіть спільні класи в окремий проект, створивши JAR "спільної бібліотеки" та включіть цей JAR як у клієнтський, так і в серверний проекти.

Це має декілька переваг: це робить розділення проблем кришталево зрозумілим, щоб зберегти все в окремих проектах; це запевняє, що клієнт і сервер починають з того самого спільного коду (доки вони використовують одну і ту ж версію спільного JAR); і це робить неможливим "випадково" змінити спільний код, не усвідомлюючи його. Якщо спільний код знаходиться у власному проекті, ви знаєте, коли ви редагуєте що-небудь у цьому проекті, що вам потрібно знати, як зміни впливатимуть як на клієнта, так і на сервер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.