Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 15.11.2019, 16:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Malleys,
вариант, с перезапуском в любой момент(с новым или старым counter) и остановкой animate в конце цикла.
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

</head>

<body>
<canvas id="canvas" width=300 height="300"></canvas>
<script>
	function Timer(canvas, num = 90) {
		this.canvas = canvas;
		this.context = canvas.getContext("2d");
		this.x = canvas.width / 2;
		this.y = canvas.height / 2;
        this.counter = num;
		this.activity();
	}
    Timer.prototype.activity = function activity(num = this.counter){
        cancelAnimationFrame(this.timer);
        this.lastTime = performance.now();
        this.counter = num;
        this.txt = this.counter;
        this.timer = requestAnimationFrame(this.animate.bind(this));
    }
	Timer.prototype.draw = function draw() {
		var color = "blue";
		var ctx = this.context;
		ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
		ctx.fillStyle = "black";
		ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
		ctx.fill();
		ctx.font = "40px Times New Roman";
		ctx.textAlign = 'center';
		ctx.textBaseline = "middle";
		ctx.fillStyle = color;
		ctx.fillText(this.txt, this.x, this.y);
		ctx.strokeStyle = color;
		ctx.lineWidth = 3;
		ctx.beginPath();
		ctx.arc(this.canvas.width / 2, this.canvas.height / 2, 30, 0, Math.PI * 2, false);
		ctx.stroke();
	};

	Timer.prototype.animate = function animate(time) {
		if(time - this.lastTime >= 1000 && this.txt > 0) {
			this.txt--;
			this.lastTime = time;
        	}
		if(this.txt === 0)
		"counterendCallback" in this  &&  this.counterendCallback.bind(this);
        else this.timer = requestAnimationFrame(this.animate.bind(this));
    	this.draw();
	};

	var timer = new Timer(document.getElementById("canvas"));
    setTimeout(()=> timer.activity(10), 3000);
    setTimeout(()=> timer.activity(), 15000);
</script>

</body>
</html>
Ответить с цитированием
  #12 (permalink)  
Старый 15.11.2019, 16:49
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от рони
вариант, с перезапуском в любой момент(с новым или старым counter) и остановкой animate в конце цикла.
Вообще по хорошему должен быть отдельный Renderer, который отрисовывает все таймеры и всё остальное...


Обычно таймер «не знает» когда он начался, и вы ещё можете захотеть «вживую», т. е. во время его работы, добавить время!

https://answers.unity.com/questions/...timer-c-1.html
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просмоторщик 3d-моделей. Как организовать отдачу файлов с сервера? microb Серверные языки и технологии 4 25.03.2014 21:58
Как организовать выбор новости из списка (JavaScript + RSS or HTML парсер) Wolfak Общие вопросы Javascript 2 24.02.2014 14:08
как изментить функцию прямо из кода!! magavnuk Events/DOM/Window 2 27.12.2009 10:33
lightbox галлерея + комменты - как организовать? linderox Элементы интерфейса 0 02.06.2009 13:50
Как с помощью JS "на-лету" менять часть HTML кода greendoc Общие вопросы Javascript 2 18.03.2008 20:43