Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.08.2017, 10:50
Интересующийся
Отправить личное сообщение для Negotiant Посмотреть профиль Найти все сообщения от Negotiant
 
Регистрация: 27.03.2017
Сообщений: 28

Клик в canvas по разным элементам
//Есть у меня такое задание: "Необходимо отловить клик по картинкам-'спутникам', к-е вращаются вокруг десяти "планет"(particles)", -  по 'планетам'  получилось легко, а по летающим вокруг не получается..), буду рад какому-нибудь примеру или пояснению, что поможет реализовать задуманное.. Фрагмент кода:

          var canvas = document.getElementById('canvas');
          var context = canvas.getContext('2d');
 
         var W = window.innerWidth,
         H = window.innerHeight;
    canvas.width  = W;
    canvas.height = H;
 
    var angle = 0;
    
    var currentAngle = 0;
    var TO_RADIANS = Math.PI / 180;
    var particles = [];
    var Lradius = 20;
    var radius = 80;
    var data = { 
cartoons: ['img/1.png','img/2.png','img/3.png','img/4.png', 'img/5.png ]};
    //  картинки-"спутники", произвольное кол-во

    function Particle() {
    this.images = data.cartoons[i];
    this.radius = 20;
    this.radis = 80;
    this.x = Math.floor((Math.random() * canvas.width / 2) + this.radius*1.5);
    this.y = Math.floor((Math.random() * canvas.height / 2) + this.radius*1.5);
    
    this.speedx = Math.round((Math.random() * 101) + 0) / 100;
    this.speedy = Math.round((Math.random() * 101) + 0) / 100;
 
    this.move = function() {
 
    
        context.beginPath();
        context.globalCompositeOperation = "source-over";
 
        context.save();
        context.translate(this.x, this.y);
        context.rotate(Gangle * TO_RADIANS);
        var image = new Image();                //основная картинка
        image.src = 'img/8.png';
        context.drawImage(image,20, -20, 40, 40);
        context.restore();
        angle+=0.1;

        for (var m = 0; m < this.images.length; m++) {  //картинки-"спутники" 
          var image2 = new Image();
          image2.src = this.images[m];
          var dist = Math.PI*2 /this.images.length;
          var pattern2 = context.createPattern(image2, "no-repeat");
          context.fillStyle = pattern2;
          var vx = Math.cos(dist*m+currentAngle) * (this.radius - 5);
          var vy = Math.sin(dist*m+currentAngle) * (this.radius - 5);
          context.drawImage(image2, (this.x -  this.Lradius) + vx, (this.y -  this.Lradius) + vy, this.Lradius*2, this.Lradius*2);
        
        }
    }
    };
 
    for (var i = 0; i < 10; i++) {
      var particle = new Particle();
        particles.push(particle);
    }
 
    function animate() {
      context.clearRect(0, 0, canvas.width, canvas.height);
      for (var i = 0; i < particles.length; i++) {
        particles[i].move();
 
    }
      requestAnimFrame(animate);
    }
    animate();
    
    canvas.addEventListener('mousedown', function (e) {
// клик по 'главным' картинкам. Пробовал так же достучаться до картинок-"спутников", не получается..
        var xCoord = e.offsetX;
        var yCoord = e.offsetY;
  for( var i = 0; i < particles.length; i++ ){
  if((xCoord >= particles[i].x - particles[i].radius && xCoord <= particles[i].x + particles[i].radius) && (yCoord >= particles[i].y - particles[i].radius && yCoord <= particles[i].y + particles[i].radius)){

                var div = document.getElementById("div");
                div.innerHTML = 'click';// проверка
  
            }
  
        }
  
    });
Ответить с цитированием
  #2 (permalink)  
Старый 01.08.2017, 11:06
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Negotiant,
Просто запоминай координаты, где эти спутники были нарисованы, потом в mousedown так же проверяй.
Ответить с цитированием
  #3 (permalink)  
Старый 01.08.2017, 13:31
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Negotiant,
С точки зрения абстракции класса, спутник это та же планета (particle) - спутник вращается вокруг планеты, планета вращается вокруг звезды (солнца), у них абсолютно одинаковый интерфейс: x, y, radius, image, move и тд, осталось добавить type чтобы их отличать и hasClick(clickX, clickY) чтобы клик проверять:
function Particle(type/*, ...*/) {
    this.type = type;
    // ...
}
Particle.prototype.hasClick = function(x, y) {
    return Math.hypot(x - this.x, y - this.y) <= this.radius;
};

particles.push(new Particle('planet'/*, ...*/), new Particle('sputnik'/*, ...*/)/*, ...*/);

canvas.addEventListener('click', function (e) {
    for (var i = 0; i < particles.length; i++) {
        if (particles[i].hasClick(e.offsetX, e.offsetY)) {
            alert(particles[i].type);
        }
    }
});
Ответить с цитированием
  #4 (permalink)  
Старый 01.08.2017, 13:54
Интересующийся
Отправить личное сообщение для Negotiant Посмотреть профиль Найти все сообщения от Negotiant
 
Регистрация: 27.03.2017
Сообщений: 28

Ага, спасибо, буду пробовать..
Ответить с цитированием
  #5 (permalink)  
Старый 01.08.2017, 16:32
Интересующийся
Отправить личное сообщение для Negotiant Посмотреть профиль Найти все сообщения от Negotiant
 
Регистрация: 27.03.2017
Сообщений: 28

Уважаемый Rise, а можно немного подробнее - у меня получается только удвоить кол-во "планет", запушивая new Particle с новым type, хоть и присвоенный "спутникам"..
Ответить с цитированием
  #6 (permalink)  
Старый 01.08.2017, 20:39
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Negotiant,
Не знаю что подробнее, сначала делают на простых фигурах.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повтор фото (getUserMedia(),HTML5 Canvas) aspex Элементы интерфейса 1 27.12.2014 16:46
Как при быстром многократном клике по кнопке обрабатывать только первый клик battrack jQuery 3 22.03.2012 10:47
Создание экземпляра Canvas не затрагивая HTML Tails Общие вопросы Javascript 2 09.03.2012 13:55
Добавить на canvas еще один елемент greengarlic Общие вопросы Javascript 5 22.09.2010 10:16
Разным элементам input - разное форматирование. Как? eclipse (X)HTML/CSS 1 25.10.2007 13:55