Как крутить данный круг?
Помогите пожалуйста с кодом, как крутить данный круг? Пытаюсь его крутить, но они все смещаются в один. То есть, был круг, а потом все эти предметы вставли в кучу.
За этот круг отвечает такой код:
$delta = 2 * pi() / 7;
for ($i=0; $i < 2 * pi(); $i += $delta) {
$this->drawEntity(
new Vector3(
$player->getX() + sin($i) * 1,
$player->getY() + cos($i) * 1,
$player->getZ()
), $player);
}
public function drawEntity($pos, $player) {
$pk = new AddEntityPacket;
$pk->entityRuntimeId = Entity::$entityCount++;
$pk->type = 68;
$pk->x = $pos->getX();
$pk->y = $pos->getY();
$pk->z = $pos->getZ();
$pk->yaw = 0;
$pk->pitch = 0;
$pk->metadata = [];
$player->dataPacket($pk);
$this->getServer()->getScheduler()->scheduleRepeatingTask(
new Rotate($this, $player, $pk->entityRuntimeId, $player->asVector3()), 1
);
}
Вот так пытаюсь его крутить, но не получается:
class Rotate extends PluginTask
{
public function __construct($plugin, $player, $eid, $center) {
parent::__construct($plugin);
$this->player = $player;
$this->eid = $eid;
$this->center = $center;
$this->delta = 0;
}
public function onRun($currentTick)
{
$this->delta += 2 * pi() / 7 * 1;
$cos = cos($this->delta);
$sin = sin($this->delta);
$pk = new \pocketmine\network\mcpe\protocol\MoveEntityPacket();
$pk->entityRuntimeId = $this->eid;
$pk->x = $this->center->getX() + $cos * 1;
$pk->y = $this->center->getY() + $sin * 1;
$pk->z = $this->center->getZ();
$pk->yaw = 0;
$pk->pitch = 0;
$pk->headYaw = 0;
$this->player->dataPacket($pk);
}
}
Ответы (1 шт):
Как рисуется окружность
Возьмем некий счетчик $i - он будет означать в каком месте на окружности мы находимся
На картинке вы можете увидеть какое значение $i соответствует позиции на окружности
Теперь встает вопрос:
Как мне из этого
$iполучить координаты?
$x = sin($i) * $radius
$y = cos($i) * $radius
синуc и косинус возвращают значения в диапазоне [-1; 1], потому умножаем на радиус
Таким образом если в цикле к $i прибавлять pi / 2, мы получим 4 точки
Найти 'размер' шага можно так: $delta = $pi * 2 / $countOfPoints
Как 'крутить' круг
Чтобы отрисовать окружность 'под углом', достаточно просто начать рисовать её не с нуля, а, например, с pi / 2. Таким образом мы повернем окружность на 90° по часовой стрелке.
Код
function drawEntity($entity, $x, $y) {
// Отрисовка. Координаты x и y относительны центра окружности
}
// $startRadian - это и есть та самая переменная, которая отвечает за вращение
function drawCircleOfEntities($startRadian, $entities, $radius) {
$delta = 2 * pi() / count($entities); // находим шаг
$stepNum = 0;
for ($i = $startRadian; $i <= 2 * pi() + $startRadian; $i += $delta) {
drawEntity($entities[$stepNum], sin($i) * $radius, cos($i) * $radius);
$stepNum++;
}
}

