Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.12.2024, 19:26
Новичок на форуме
Отправить личное сообщение для AlexSeamen Посмотреть профиль Найти все сообщения от AlexSeamen
 
Регистрация: 21.08.2014
Сообщений: 7

Не получается. Фон - объект.
Есть холст голубой, черный квадрат (фон), кольцо зеленое с прорезью/разрывом.Внутренняя часть кольца и прорезь должны быть на фоне черного квадрата прозрачными. Перетаскиваю мышью кольцо и... Должен быть виден черный фон, квадрат. А видно холст. Рентген какой-то... . Приложил весь файл html. Чтобы посмотреть страницу.
Что не так?

<script>
    const canvas = document.getElementById('circleCanvas');
    const ctx = canvas.getContext('2d');

    // Настройки кольца
    const outerRadius = 150 / 2; // Внешний радиус кольца (150px диаметр)
    const ringWidth = 30; // Ширина кольца (50px)
    const innerRadius = outerRadius - ringWidth; // Внутренний радиус кольца
    const breakWidth = 30; // Ширина разрыва
    const breakHeight = 70; // Высота разрыва
    let ringX = canvas.width / 2; // Начальная позиция кольца по оси X
    let ringY = canvas.height / 2; // Начальная позиция кольца по оси Y
    let isDragging = false; // Флаг, указывающий, что кольцо перетаскивается

    // Функция для рисования кольца
    function drawGreenRing() {
      ctx.save();
      ctx.beginPath();
      ctx.arc(ringX, ringY, outerRadius, 0, Math.PI * 2);
      ctx.closePath();
      ctx.fillStyle = 'green';
      ctx.fill();

      // Вырезаем прозрачную внутреннюю часть кольца
      ctx.globalCompositeOperation = 'destination-out';
      ctx.beginPath();
      ctx.arc(ringX, ringY, innerRadius, 0, Math.PI * 2);
      ctx.closePath();
      ctx.fillStyle = 'black';
      ctx.fill();

      // Вырезаем разрыв в кольце (прорезь)
      const breakX = ringX - breakWidth / 2; // Разрыв по горизонтали, чтобы он был центрирован
      const breakY = ringY + outerRadius - breakHeight / 2; // Разрыв по вертикали, снизу кольца

      // Режим вычитания для создания разрыва
      ctx.beginPath();
      ctx.rect(breakX, breakY, breakWidth, breakHeight);
      ctx.closePath();
      ctx.fillStyle = 'black'; // Цвет прорези черный, чтобы соответствовать черному кругу
      ctx.fill();

      // Восстановить обычный режим рисования
      ctx.globalCompositeOperation = 'ource-over';
      ctx.restore();
    }

    // Функция для рисования черного квадрата
    function drawBlackSquare() {
      ctx.fillStyle = 'black';
      ctx.fillRect(canvas.width / 2 - 50, canvas.height / 2 + 50, 100, 100);
    }

    // Обработчик событий для перетаскивания кольца
    canvas.addEventListener('mousedown', (e) => {
      const mouseX = e.offsetX;
      const mouseY = e.offsetY;

      // Проверяем, попал ли клик в кольцо
      const distX = mouseX - ringX;
      const distY = mouseY - ringY;
      const distance = Math.sqrt(distX * distX + distY * distY);

      if (distance <= outerRadius) {
        isDragging = true; // Начинаем перетаскивание
      }
    });

    // Обработчик событий для перетаскивания кольца
    canvas.addEventListener('mousemove', (e) => {
      if (isDragging) {
        ringX = e.offsetX;
        ringY = e.offsetY;
        redrawCanvas();
      }
    });

    // Завершаем перетаскивание
    canvas.addEventListener('mouseup', () => {
      isDragging = false;
    });

    // Функция для очистки и перерисовки холста
    function redrawCanvas() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      drawBlackSquare(); // Рисуем черный квадрат
      drawGreenRing(); // Рисуем кольцо
    }

    // Инициализация рисования
    drawBlackSquare(); // Рисуем черный квадрат
    drawGreenRing(); // Рисуем кольцо
  </script>
Вложения:
Тип файла: zip fon_kolco.zip (1.7 Кб, 1 просмотров)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается отобразить объект Jimy Элементы интерфейса 10 27.01.2020 12:29
Откуда начинается фон body? kostyanet (X)HTML/CSS 8 14.04.2015 04:50
Можно ли удалить клонированный объект Евгений_86 jQuery 6 13.04.2011 12:54
Как сделать фон, главной страницы на изображении ? asked86 (X)HTML/CSS 3 03.04.2009 02:54
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37