Проблема с позиционированием куба в многопользовательской игре

Проблема с позиционированием куба в многопользовательской игре Three.js и PHP

Я разрабатываю многопользовательскую игру, в которой игроки управляют кубами (представляющими себя) в трехмерной среде, созданной с помощью Three.js. Серверная часть игры обрабатывается с помощью PHP и MySQL для хранения игровых данных, включая позиции куба. Куб каждого игрока должен двигаться независимо в зависимости от его ввода, но я столкнулся с проблемой, из-за которой позиция красного куба, кажется, отражает позицию зеленого куба в базе данных после перемещений.

Описание проблемы:

  • Проблема с красным кубом: когда любой игрок перемещает свой куб, позиция красного куба в базе данных обновляется в соответствии с позицией зеленого куба, а не сохраняет свою собственную независимую позицию. В результате оба куба после движений появляются в одном и том же месте игрового мира.

  • Функциональность зеленого куба: Зеленый куб ведет себя правильно, перемещается независимо и точно обновляет свое положение в базе данных.

Обзор кода:

  • PHP (game.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=?"; 
}
  • JavaScript (Three.js): управляет перемещением куба на стороне клиента и отправляет запросы AJAX для обновления и получения позиций куба. Вот пример того, как обновляются позиции:
// 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 обрабатывает перемещения куба и точно обновляет позиции на стороне клиента.

Запрос на помощь:

Мне нужна информация о том, почему положение красного куба в базе данных не обновляется независимо, а вместо этого отражает положение зеленого куба после перемещений. Как я могу гарантировать, что каждый куб (игрок) беспрепятственно сохраняет свою позицию?

Мы будем очень признательны за любые идеи или предложения по отладке или устранению этой проблемы. Спасибо за помощь!=

Когда я открыл игру, я мог прекрасно перемещаться по зеленому и обновлять позицию в БД. В другом браузере я могу переместить зеленый цвет, но когда я пытаюсь переместить зеленый цвет в отдельном браузере, красный становится зеленым, или он перемещается, но не сохраняет позиции, или зеленый следует за красным и становится зеленым - очень сбивает с толку.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть логическая ошибка.

Ваш PHP-код всегда обновляет позицию игрока 1, если имя пользователя сеанса (предположительно вошедшего в систему пользователя?) соответствует опубликованному имени пользователя. Но оба игрока не могут быть игроком 1!

Ваш PHP-код и/или данные базы данных должны отслеживать, какое имя пользователя является игроком 1 в текущей игре, а какое имя пользователя — игроком 2, а затем вместо этого обновлять позиции в соответствии с этим.

Также, похоже, есть недостаток безопасности: если опубликованный идентификатор игрока не соответствует имени пользователя в сеансе, вместо этого он с радостью обновит позицию игрока 2. Но почему? Неужели игроку нельзя разрешать передвигать фигуру другого игрока?

Я вообще не вижу логики в публикации идентификатора игрока со стороны клиента - злоумышленнику легко подделать, и клиенту не нужно указывать, какой игрок движется - это всегда должен быть авторизованный игрок. Я ожидал, что игрок, который движется.

спасибо за ваш ответ, я не смог опубликовать сценарий, так как он постоянно говорил, что там много кода, можно опубликовать функцию, и вы можете посмотреть больше, я смотрю, я не вижу, что не так, то, что вы объяснили, имеет смысл, но я все еще не вижу этого в коде, я не настоящий программист, я делаю это для хобби в свободное время, сейчас все еще учусь и использую чат gpt для помощи, но просто застреваю в циклах

John 14.06.2024 14:41

Позвольте мне попытаться объяснить больше. Если у вас есть два пользователя, запускающие игру в разных браузерах, но подключенные друг к другу, тогда PHP будет иметь две отдельные сессии, по одной для каждого вошедшего в систему пользователя. Каждая сессия будет содержать «имя пользователя» с именем пользователя этого человека. Когда игра отправляет запрос XHR на ход, она просматривает Session["username"] и затем обновляет позицию игрока 1. Это нормально для игрока 1. Но затем, когда игрок 2 сделает ход, он также обнаружит, что его имя пользователя в сеансе совпадает, поскольку у него есть собственное имя пользователя в своем сеансе. Таким образом, он также обновит позицию игрока 1.

ADyson 14.06.2024 14:47

Вы должны изменить код так, чтобы при запуске игры система записывала, какое имя пользователя является игроком 1, а какое имя пользователя — игроком 2. А затем она должна использовать эту информацию, чтобы решить, какие данные о позиции обновлять при выполнении хода.

ADyson 14.06.2024 14:48

спасибо за подробное объяснение. Я исправил проблему, и стало намного легче понять, очень ценю

John 14.06.2024 15:13

Другие вопросы по теме