Проблема с позиционированием куба в многопользовательской игре Three.js и PHP
Я разрабатываю многопользовательскую игру, в которой игроки управляют кубами (представляющими себя) в трехмерной среде, созданной с помощью Three.js. Серверная часть игры обрабатывается с помощью PHP и MySQL для хранения игровых данных, включая позиции куба. Куб каждого игрока должен двигаться независимо в зависимости от его ввода, но я столкнулся с проблемой, из-за которой позиция красного куба, кажется, отражает позицию зеленого куба в базе данных после перемещений.
Описание проблемы:
Проблема с красным кубом: когда любой игрок перемещает свой куб, позиция красного куба в базе данных обновляется в соответствии с позицией зеленого куба, а не сохраняет свою собственную независимую позицию. В результате оба куба после движений появляются в одном и том же месте игрового мира.
Функциональность зеленого куба: Зеленый куб ведет себя правильно, перемещается независимо и точно обновляет свое положение в базе данных.
Обзор кода:
// Example of how positions are updated in game.php
if ($_SESSION['username'] == $_POST['player']) {
$query = "UPDATE fight SET player1_position_x=?, player1_position_y=?, player1_position_z=? WHERE id=?";
}
else {
$query = "UPDATE fight SET player2_position_x=?, player2_position_y=?, player2_position_z=? WHERE id=?";
}
// Example of how positions are updated in JavaScript function updateCubePosition(x, y, z, player) {
const xhr = new XMLHttpRequest();
xhr.open('POST', 'game.php?fight_id=<?php echo $fightId; ?>', true);
// ...
}
Что я пробовал:
Гарантировано, что запросы AJAX корректно отправляют и получают позиции куба.
Проверено, что скрипты PHP обрабатывают обновления на основе правильной личности игрока ($_SESSION['username']
или $_POST['player']
).
Подтверждено, что JavaScript обрабатывает перемещения куба и точно обновляет позиции на стороне клиента.
Запрос на помощь:
Мне нужна информация о том, почему положение красного куба в базе данных не обновляется независимо, а вместо этого отражает положение зеленого куба после перемещений. Как я могу гарантировать, что каждый куб (игрок) беспрепятственно сохраняет свою позицию?
Мы будем очень признательны за любые идеи или предложения по отладке или устранению этой проблемы. Спасибо за помощь!=
Когда я открыл игру, я мог прекрасно перемещаться по зеленому и обновлять позицию в БД. В другом браузере я могу переместить зеленый цвет, но когда я пытаюсь переместить зеленый цвет в отдельном браузере, красный становится зеленым, или он перемещается, но не сохраняет позиции, или зеленый следует за красным и становится зеленым - очень сбивает с толку.
Есть логическая ошибка.
Ваш PHP-код всегда обновляет позицию игрока 1, если имя пользователя сеанса (предположительно вошедшего в систему пользователя?) соответствует опубликованному имени пользователя. Но оба игрока не могут быть игроком 1!
Ваш PHP-код и/или данные базы данных должны отслеживать, какое имя пользователя является игроком 1 в текущей игре, а какое имя пользователя — игроком 2, а затем вместо этого обновлять позиции в соответствии с этим.
Также, похоже, есть недостаток безопасности: если опубликованный идентификатор игрока не соответствует имени пользователя в сеансе, вместо этого он с радостью обновит позицию игрока 2. Но почему? Неужели игроку нельзя разрешать передвигать фигуру другого игрока?
Я вообще не вижу логики в публикации идентификатора игрока со стороны клиента - злоумышленнику легко подделать, и клиенту не нужно указывать, какой игрок движется - это всегда должен быть авторизованный игрок. Я ожидал, что игрок, который движется.
Позвольте мне попытаться объяснить больше. Если у вас есть два пользователя, запускающие игру в разных браузерах, но подключенные друг к другу, тогда PHP будет иметь две отдельные сессии, по одной для каждого вошедшего в систему пользователя. Каждая сессия будет содержать «имя пользователя» с именем пользователя этого человека. Когда игра отправляет запрос XHR на ход, она просматривает Session["username"] и затем обновляет позицию игрока 1. Это нормально для игрока 1. Но затем, когда игрок 2 сделает ход, он также обнаружит, что его имя пользователя в сеансе совпадает, поскольку у него есть собственное имя пользователя в своем сеансе. Таким образом, он также обновит позицию игрока 1.
Вы должны изменить код так, чтобы при запуске игры система записывала, какое имя пользователя является игроком 1, а какое имя пользователя — игроком 2. А затем она должна использовать эту информацию, чтобы решить, какие данные о позиции обновлять при выполнении хода.
спасибо за подробное объяснение. Я исправил проблему, и стало намного легче понять, очень ценю
спасибо за ваш ответ, я не смог опубликовать сценарий, так как он постоянно говорил, что там много кода, можно опубликовать функцию, и вы можете посмотреть больше, я смотрю, я не вижу, что не так, то, что вы объяснили, имеет смысл, но я все еще не вижу этого в коде, я не настоящий программист, я делаю это для хобби в свободное время, сейчас все еще учусь и использую чат gpt для помощи, но просто застреваю в циклах