Основная проблема - то, что ссылка Word в выражении "передача ссылкой" означает что-то совершенно другое от обычного значения ссылки Word в Java.
Обычно в ссылке Java означает ссылка на объект . Но технические термины передача ссылкой/значением из теории языка программирования говорит о ссылка на элемент памяти, содержащий переменную , который является чем-то совершенно другим.
Вы можете изучить шаблон посредника . Это позволит вам иметь низкую связь, но да, у вас будет много кода в объекте (ах) посредника для облегчения связи между другими объектами. Но я думаю, либо одно, либо другое. И тогда это предпочтительнее. Это также даст вам больше свободы для выполнения трюков, таких как постановка в очередь определенных запросов на обновление и обработка запросов в более подходящее время, или выполнение пакетной обработки большого количества запросов вместо того, чтобы выполнять их один за другим, что (гипотетически) налагает накладные расходы.
Я думаю, что лучший вариант для такого рода вещей - это много использовать шаблон Observer ... создавать события (определение общего или конкретного - это еще одно дизайнерское решение) и заставлять ваши объекты подписываться к тем, которые им нужны.
Например, ваш двигатель может запускать события столкновения или близости, когда 2 объекта находятся рядом, но они будут приняты только теми объектами, которые заинтересованы. Вы можете провести некоторую оптимизацию, чтобы проверить только эти условия с привлеченными наблюдателями.
Я не знаю, является ли это обычным явлением в играх, и я никогда не использовал его ни в одной игре (пока), но я много думал о раз об этом, и этот вариант мне нравится больше всего.
Ну, один из способов - настроить архитектуру клиент / сервер. Таким образом, сервер будет обрабатывать все обновления игрового мира и внутреннюю логику, а клиент будет только спрашивать сервер, может ли он выполнять определенные действия. Сервер тогда отвечал, и только тогда клиент рисовал и обновлял игровой экран. Существа, не являющиеся игроками, поступят так же. Единственное различие будет заключаться в том, что клиентом управляет человек, а другие объекты контролируются компьютером. Это позволит вам отделить настройку игрового мира, события и обновления от логики сущности.
Упомянутая вами «система сообщений» называется протоколом приложения и может быть сложной эзотерической двоичной системой или простыми строками, читаемыми человеком, которые я бы рекомендовал. По мере движения игрока сервер отправляет ему список объектов, находящихся в поле зрения клиента. Сущности, не являющиеся игроками, будут действовать таким же образом. То есть путем запроса у сервера разрешения на выполнение действий или информации о другом объекте, который сервер ранее отправил ему, когда он перемещался и попал в поле зрения объекта, и сервер ответил соответствующим ответом или информацией.
Если вы должны были реализовать это с помощью сокетов, у вас было бы очевидное преимущество встроенной сетевой игры, поскольку серверу было бы все равно, подключается ли клиент к той же машине, на которой работает сервер, или если клиент находится на другом континенте. Возможно, это не ответило на ваш вопрос конкретно кодом, но я надеюсь, что это была по крайней мере пища для размышлений.
или для информации о другом объекте, который сервер ранее отправил, когда он перемещался и попал в поле зрения объекта, и сервер, отвечающий соответствующим ответом или информацией.Если бы вы реализовали это с помощью сокетов, у вас было бы очевидное Преимущество внутренней сетевой игры, поскольку серверу все равно, подключается ли клиент к той же машине, на которой работает сервер, или если клиент находится на другом континенте. Возможно, это не ответило на ваш вопрос конкретно кодом, но я надеюсь, что это была по крайней мере пища для размышлений.
или для информации о другом объекте, который сервер ранее отправил, когда он перемещался и попал в поле зрения объекта, и сервер, отвечающий соответствующим ответом или информацией.Если бы вы реализовали это с помощью сокетов, у вас было бы очевидное Преимущество внутренней сетевой игры, поскольку серверу все равно, подключается ли клиент к той же машине, на которой работает сервер, или если клиент находится на другом континенте. Возможно, это не ответило на ваш вопрос конкретно кодом, но я надеюсь, что это была по крайней мере пища для размышлений.
Если бы вы реализовали это с помощью сокетов, у вас было бы очевидное преимущество внутренней сетевой игры, поскольку серверу было бы все равно, подключается ли клиент к той же машине, на которой работает сервер, или если клиент находится на другом континенте. Возможно, это не ответило на ваш вопрос конкретно кодом, но я надеюсь, что это была по крайней мере пища для размышлений.
Если бы вы реализовали это с помощью сокетов, у вас было бы очевидное преимущество встроенной сетевой игры, поскольку серверу было бы все равно, подключается ли клиент к той же машине, на которой работает сервер, или если клиент находится на другом континенте. Возможно, это не ответило на ваш вопрос конкретно кодом, но я надеюсь, что это была по крайней мере пища для размышлений.
Обычно это намного проще, если у вас есть объект над сущностью, выполняющий управление. (например, «мир» или «игра».) Он может легко видеть, какие объекты находятся поблизости от других, и соответственно отправлять события и уведомления.
Если объектам требуется немного больше контекста для принятия значимых решений, когда они » При обновлении вы всегда можете передать мир в этом контексте в той или иной форме. Но пусть мир управляет разделением и размещением объектов, а не требует, чтобы объекты беспокоились об этом напрямую.
(Кроме того, почему квадродерево? Для 2D RPG грубая сетка, вероятно, будет намного проще в реализации и одинаково полезна.)