С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 23
1

Два шарика, которые отталкиваются друг от друга

15.06.2016, 08:59. Показов 4139. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
https://jsfiddle.net/sfjLfd6p/
Подскажите, пожалуйста, как сделать, чтобы шарики создавались в месте клика мышки
HTML5
1
<canvas id="canvas"></canvas>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
function anim(canvas, fps, clear) {
  var context = canvas.getContext("2d");
  var interval = null;
  var update = null;
  var draw = null;
  var min = 0.0005;
  var max = 100;
  this.update = function(func) {
    update = func;
  };
 
  this.draw = function(func) {
    draw = func;
  };
 
  var step = function() {
    if (clear) {
      context.clearRect(0, 0, canvas.width, canvas.height);
    }
    if (update !== null) {
      update();
    }
    if (draw !== null) {
      draw();
    }
  };
 
  this.stop = function() {
    clearInterval(interval);
  };
 
  this.play = function() {
    if (draw !== null) {
      draw();
    }
    interval = setInterval(step, 10 / (Math.random() * (max - min) + min));
  };
}
 
function rect(x, y, width, height) {
  this.x = x;
  this.y = y;
  this.width = width; // ширина
  this.height = height; // высота
  this.draw = function(context, color, globalAlpha) {
    //context.globalAlpha = globalAlpha; // "прозрачность"
    context.fillStyle = color; // цвет заливки
    context.fillRect(this.x, this.y, this.width, this.height);
  };
}
 
function circle(x, y, r) {
  this.x = x;
  this.y = y;
  this.r = r;
  this.draw = function(context, color, globalAlpha) {
    context.globalAlpha = globalAlpha; // "прозрачность"
    context.fillStyle = color; // цвет заливки
    context.beginPath();
    context.arc(this.x, this.y, this.r, 0, Math.PI * 2, true);
    context.fill();
  };
}
 
function init() {
  var a = window.innerWidth;
  var b = window.innerHeight;
  var r = 25;
  var screen = new rect(0, 0, a, b);
  var ball1 = new circle(50, 100, 25);
  var ball3 = new circle(667, 454, 25);
  var vX1 = Math.random();
  var vY1 = Math.random();
  var vX3 = Math.random();
  var vY3 = Math.random();
  var canvas = document.getElementById("canvas");
  var context = canvas.getContext("2d");
  var game = new anim(canvas, 30, false);
  canvas.width = screen.width;
  canvas.height = screen.height;
 
  game.draw(function() {
    screen.draw(context, "black", 0.5);
    ball1.draw(context, "#00FFFF", 1);
    ball3.draw(context, "#00FF00", 1);
  });
 
  game.update(function() {
    // соприкосновение с "полом" и "потолком" холста
    if (ball1.y - ball1.r < 0 || ball1.y + ball1.r > b)
      vY1 = -vY1;
    // соприкосновение с левой и правой "стенкой" холста 
    if (ball1.x - ball1.r < 0 || ball1.x + ball1.r > a)
      vX1 = -vX1;
    // соприкосновение с "полом" и "потолком" холста
    if (ball3.y - ball3.r < 0 || ball3.y + ball3.r > b)
      vY3 = -vY3;
    // соприкосновение с левой и правой "стенкой" холста 
    if (ball3.x - ball3.r < 0 || ball3.x + ball3.r > a)
      vX3 = -vX3;
    // условие соприкосновения шаров друг с другом               
    if (Math.abs(ball1.x - ball3.x) + Math.abs(ball1.y - ball3.y) <= 50) {
 
      vX1 = -vX1;
      vX3 = -vX3;
      vY1 = -vY1;
      vY3 = -vY3;
 
    }
 
    ball1.x += vX1;
    ball1.y += vY1;
    ball3.x += vX3;
    ball3.y += vY3;
 
  });
 
  screen.draw(context, "black", 1);
  ball1.draw(context, "#00FFFF", 1);
  ball3.draw(context, "#00FF00", 1);
 
 
  // Атомы начинают движение по нажатию клавиши пробел
  var click = false;
  addEventListener("keypress", doKeyDown, true)
 
  function doKeyDown(e) {
    if (e.keyCode == 32) {
      if (!click) {
        click = true;
        game.play();
      } else {
        click = false;
        game.stop();
      }
    }
  };
 
}
init();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2016, 08:59
Ответы с готовыми решениями:

Как сделать, чтобы два блока сменяли друг друга при клике?
Здравствуйте. Помогите, пожалуйста решить проблему. Нужно, чтобы при нажатии на кнопку, один блок...

Создать анимацию: два шарика на нитях, стукаются друг о друга
Ребят помогите решить задачу! два шарика на нитях, стукаются друг о друга! создать анимацию!

Шарики отталкиваются от стен и друг друга
Нужна помощь с программой, где несколько шариков отталкиваются от стен и бьются друг об друга. ...

Анимация (в пикчербоксе летают два шарика и при соприкосновении отталкиваются)
Пытаюсь сделать анимацию, где в пикчербоксе летают два шарика и при соприкосновении отталктваются ...

7
Ренегат
Эксперт HTML/CSS
1740 / 1085 / 386
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
15.06.2016, 11:22 2
Cheemical, ну во-первых, все ресурсы для решения задачи должны лежать на форуме, вам предупреждение
во-вторых, когда они сталкиваются, то там надо бы рассчитать угол при котором они столкнулись, потому что у меня при их столкновении они повели себя неожиданно
0
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 23
15.06.2016, 11:39  [ТС] 3
У меня нормально работает, отталкиваются друг от друга
0
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
15.06.2016, 17:46 4
Цитата Сообщение от Cheemical Посмотреть сообщение
interval = setInterval(step, 10 / (Math.random() * (max - min) + min));
Для main loop нужен requestAnimationFrame он оптимизирован для работы с графикой. Для работы с физикой нужны векторы(обычно библиотека с функциями).

Кликните здесь для просмотра всего текста
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
var vector2d = function (x, y) {
        var vec = {
            vx : x,
            vy : y,
            scale : function (scale) {
                vec.vx *= scale;
                vec.vy *= scale;
            },
            add : function (vec2) {
                vec.vx += vec2.vx;
                vec.vy += vec2.vy;
            },
            sub : function (vec2) {
                vec.vx -= vec2.vx;
                vec.vy -= vec2.vy;
            },
            negate : function () {
                vec.vx = -vec.vx;
                vec.vy = -vec.vy;
            },
            length : function () {
                return Math.sqrt(vec.vx * vec.vx + vec.vy * vec.vy);
            },
            lengthSquared : function () {
                return vec.vx * vec.vx + vec.vy * vec.vy;
            },
            normalize : function () {
                var len = this.length();
                if (len) {
                    vec.vx /= len;
                    vec.vy /= len;
                }
                return len;
            },
            rotate : function (angle) {
                var vx = vec.vx,
                vy = vec.vy,
                cosVal = Math.cos(angle),
                sinVal = Math.sin(angle);
                vec.vx = vx * cosVal - vy * sinVal;
                vec.vy = vx * sinVal + vy * cosVal;
            },
 
            ProjOnVec : function (vec2) {
                var res = vec2.normalize();
                res.scale(this.ProjOnScalar(vec2));
                return res;
            },
            
            dot : function (vec2) {
                return x * vec2.x + y * vec2.y;
            },
            
            toString : function () {
                return '(' + vec.vx.toFixed(3) + '.' + vec.vy.toFixed(3) + ')';
            },
 
            degToRad : function (deg) {
                return deg * (Math.PI / 180);
            },
 
            radToDeg : function (rad) {
                return rad * (180 / Math.PI);
            },
 
            getRandom : function (min, max) {
                return Math.floor(Math.random() * (max - min + 1)) + min;
            }
 
        };
        return vec;
    }


Насчет коллизий посмотри здесь https://developer.mozilla.org/... _detection

Здесь обсуждались отражения http://stackoverflow.com/quest... wer-573206


Для описания объектов - можно использовать конструкторы с методами рендеринга и обработки соударений/перемещений:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function myCircle(x,y,radius,color){
  this.x = x || 0;
  this.y = y || 0;
  this.r = radius || 10;
  color = color || gray;
}
 
myCircle.prototype.move = function(){...};
myCircle.prototype.render = function(){...};
 
var circle1 = new myCircle(100, 100, 30);
var circle2 = new myCircle(300, 250, 25);
 
function mainLoop(){
  circle1.move();
  circle1.render();
 
  circle2.move();
  circle2.render();
  id = requestAnimationFrame(mainLoop);
}
 
window.onload = mainLoop;
чтобы приостановить цикл - cancelAnimationFrame(id)
0
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 23
16.06.2016, 09:00  [ТС] 5
Вы, кажется, меня неправильно поняли. Мне просто нужна функция, которая будет создавать шарики в месте клика мышки, а не физика движения шаров
0
32 / 31 / 21
Регистрация: 13.07.2014
Сообщений: 374
16.06.2016, 15:37 6
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
addEventListener("click", newRound, true)
 
  function newRound(e) {
  
    newRound = document.createElement('cavans'); // элемент "шар"
    newRound.style.position = 'absolute';
    newRound.style.height = 50 + 'px';
    newRound.style.width = 50 + 'px';
    newRound.style.background= 'red';
    newRound.style.left = (e.pageX - parseInt(newRound.style.width) / 2) + 'px';
    newRound.style.top = '' + (e.pageY - parseInt(newRound.style.height) / 2) + 'px';
    document.body.appendChild(newRound);
  };
0
BANO
16.06.2016, 15:40
  #7

Не по теме:

WeMeSder, ууу... вообще промазал

0
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
17.06.2016, 06:28 8
Цитата Сообщение от Cheemical Посмотреть сообщение
Вы, кажется, меня неправильно поняли. Мне просто нужна функция, которая будет создавать шарики в месте клика мышки, а не физика движения шаров
Все последующие проблемы обычно вытекают из плохого начала.
0
17.06.2016, 06:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2016, 06:28
Помогаю со студенческими работами здесь

Как скомпилировать два класса, которые используют методы друг друга
Доброго времени суток. имеется 3 файлика: asteroid.cpp starsystem.cpp main.cpp в main.cpp...

Как в PHP отделить элементы друг от друга, чтобы не ругались друг на друга?
&lt;?php $chitat = fopen('yoo.txt', 'r'); if (!$chitat) { echo 'Ошибка при открытии файла...

Изобразить два движущихся навстречу друг другу закрашенных шарика
Изобразить два движущихся навстречу друг другу закрашенных шарика. Движение прерывается после...

OSPF -два ПК не пингуют друг друга
Здравствуйте! В cisco packet tracer настроил сеть из двух маршрутизаторов и двух ПК. Настроил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru