Форум программистов, компьютерный форум, киберфорум
JavaScript: HTML5 Canvas
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Gezerg
4 / 4 / 2
Регистрация: 01.12.2012
Сообщений: 39

Не получается отрисовывать один объект несколько раз! HTML 5 CANVAS

01.07.2013, 06:13. Показов 1192. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я хочу, чтобы при клике на canvas добавлялся один объект в виде эллипса с координатами клика мыши. Этих объектов может быть много.
У каждого созданного объекта есть время жизни. Когда это время кончается, объект начинает увеличиваться. И при достижении определённого размера - исчезает.

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

Например если кликнуть по canvas, то объект создаётся (так и должно быть). После 1 - 2 секунд создаю ещё 5 объектов. К этому времени первый объект уже начал увеличиваться. И когда первый объект увеличился и исчез, то другие объекты тоже тут же исчезают.

Как мне решить данную проблему?

Вот вам мой код на JavaScript (Я пока только начинающий в этой сфере, так что строго не судите ):
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
var canvas, w, h, ctx, game = true;
var bombs; //Массив бомб
var bombBool; //Показывает активна ли текущая бомбы? Если активна, то показать её
var countActiveBomb = 0; //Сколько бомб активированно
var maxBomb = 10; 
 
document.addEventListener('mousedown',function(event) //Событие нажатие левой кнопки мыши
{   
    if(countActiveBomb + 1 < maxBomb)
    {
        bombs[countActiveBomb] = new BOMB(event.offsetX, event.offsetY);
        bombBool[countActiveBomb] = true;
        countActiveBomb++;
    }
});
 
var BOMB = function(x,y)
{
    this.limit = 2000; //Время ожидания взрыва
    this.radius = 10;
    this.maxRadius = 100; //Предел увеличния бомбы
    this.timer = 0; //Текущее время бомбы
    this.x = x;
    this.y = y;
    this.activeBomb = countActiveBomb;
 
    this.draw = function(){
        if(bombBool[countActiveBomb - 1])
        {
            this.timer += 2;
            ctx.fillStyle = '#f00'; 
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.radius, 0, 2*Math.PI, true);
            ctx.closePath();
            ctx.fill();
            if(this.timer > this.limit){ //Если время истекло, то взврываем бомбу           
                var self = this;
                    self.explosion(); //Рисуем взрыв
                this.timer = 0;
            }else{
                var self = this;
                setTimeout(function() {
                    self.draw();
                }, 33);
            }
        }
    }
    //Рисуем взрыв
    this.explosion = function()
    {
        if(this.radius < this.maxRadius){
            //alert(this.radius);
            this.radius += 1;
            ctx.fillStyle = '#f00';
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.radius, 0, 2*Math.PI, true);
            ctx.closePath();
            ctx.fill();
        }else{
            bombBool[this.activeBomb - 1] = false;  
            countActiveBomb--;
        }
    }
 
}
 
window.onload = init;
 
 
function init(){
    canvas = document.getElementById("canvas");
    w = canvas.width;
    h = canvas.height;
    ctx = canvas.getContext('2d');
    bombs = [];
    bombBool = [];
 
    for(var i=0; i<maxBomb;i++){
        bombBool[i] = false; //Все бомбы не активны
    }
    beginGame();
}
 
 
function beginGame(){
    if(game){
        update();
    }else{
        setTimeout(gameover, 200);
    }
}
 
function update(){
    ctx.clearRect(0,0,w,h);
    for(var i=0; i<maxBomb;i++){
        //Если текущая бомба автивна, то рисуем её
        if(bombBool[i]){
            bombs[i].draw();
        }
    }
    window.webkitRequestAnimationFrame(beginGame);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.07.2013, 06:13
Ответы с готовыми решениями:

Как отрисовывать один объект несколько раз! HTML 5 CANVAS
Такая история! Есть плавно увеличивающийся круг на полотне canvas! (круг появляется в рандомном месте полотна canvas). Как мне вызывать...

Один и тот же объект в одном выражении модифицируется несколько раз - неопределенное поведение
Уважаемые форумчане! Недавно столкнулся с интересным на мой взгляд необычным поведением компилятора c++ от keil. Определил класс шаблон...

На Canvas нарисовать не связанные области как один объект
Есть ли возможность нарисовать на Canvas различные несвязанные области, чтобы при экспорте в WMF-файл, они интерпретировались как один...

2
 Аватар для JsLoveR
425 / 167 / 48
Регистрация: 05.12.2012
Сообщений: 855
04.07.2013, 20:39
CSS
1
2
3
4
*{
        margin:0;
        padding:0;
}
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
var canvas, w, h, ctx, game = true;
var bombs = [];
var maxBomb = 10; 
var countActiveBomb = 0;
 
document.addEventListener('mousedown',function(event) //Событие нажатие левой кнопки мыши
{   
    if(countActiveBomb + 1 < maxBomb) {
                var bomb = new BOMB(event.pageX, event.pageY, countActiveBomb);
        bomb.activated = true;
                bombs[countActiveBomb] = bomb;
        countActiveBomb++;
    }
});
 
var BOMB = function(x, y, id)
{
    this.limit = 10; //Время ожидания взрыва
    this.radius = 10;
    this.maxRadius = 100; //Предел увеличния бомбы
    this.timer = 0; //Текущее время бомбы
    this.x = x;
    this.y = y;
    this.activated = false;
                 
    this.draw = function(){
         this.timer += 2;
         ctx.fillStyle = '#f00'; 
         ctx.beginPath();
         ctx.arc(this.x, this.y, this.radius, 0, 2*Math.PI, true);
         ctx.closePath();
         ctx.fill();
         if(this.timer > this.limit){ //Если время истекло, то взврываем бомбу           
            this.explosion(); //Рисуем взрыв
            this.timer = 0;
                    }
    }
    //Рисуем взрыв
    this.explosion = function()
    {
        if(this.radius < this.maxRadius){
            this.radius += 1;
            ctx.fillStyle = '#f00';
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.radius, 0, 2*Math.PI, true);
            ctx.closePath();
            ctx.fill();
        }else{
            this.activated = false; 
                        
                }
    }
 
}
 
window.onload = init;
 
 
function init(){
    canvas = document.getElementById("canvas");
    w = canvas.width;
    h = canvas.height;
    ctx = canvas.getContext('2d');
    bombs = [];
     setInterval(function(){
                beginGame();
        }, 1000 / 60);
}
 
function beginGame(){
    if(game){
        update();
    }else{
        setTimeout(gameover, 200);
    }
}
 
  
function update(){
    ctx.clearRect(0, 0, w, h);
        
    for(var i = 0; i < countActiveBomb; i++){
        //Если текущая бомба автивна, то рисуем её
        if(bombs[i].activated){
            bombs[i].draw();
        }else {
                        bombs.splice(i, 1); 
                        countActiveBomb--;
                }
        }
   
}
1
 Аватар для Gezerg
4 / 4 / 2
Регистрация: 01.12.2012
Сообщений: 39
05.07.2013, 23:37  [ТС]
JsLover, огромное спасибо!))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2013, 23:37
Помогаю со студенческими работами здесь

Вывести числа, которые встречаются в массиве несколько раз / один раз
дан массив состоящий из 100 целых чисел. а)Вывести все числа,которие встречаются в етом массиве несколько раз б)Вывести все...

Ввести массив из 100 целых чисел, сначала вывести встречающиеся несколько раз, а затем те, что встречаются один раз
ввести массив из 100 целых чисел, сначала вывести встречающиеся несколько раз, а затем те, что встречаются один раз

Несколько указателей на один объект
Добрый день, Есть объект и несколько ссылок на него в разных списках (например список для рисования, список для разных таблиц т.е...

Один объект на несколько классов
Есть класс переменные, в котором есть set и get методы. Есть класс в котором переменным присваиваются значения. Есть класс который...

Несколько текстур на один объект
Привет. Уже несколько книг по Директу посмотрел, везде о текстурах говориться &quot;очень много&quot;. Пропишите эти строчки и у вас...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru