Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Текстовая Анимация на Canvase. (https://javascript.ru/forum/dom-window/36938-tekstovaya-animaciya-na-canvase.html)

Mike_Kharkov 01.04.2013 20:25

Текстовая Анимация на Canvase.
 
Вложений: 1
Здравствуйте.
Недавно начал разбираться над тем, что представляет из себя тег Canvas и по ходу дела столкнулся с вопросами,связанными с текстовой анимацией(и не только):

1) Есть страница,
http://yamaradg.narod2.ru/Canvas/canvas_4.html
на которой имеется анимация!(см. на словосочетание 'First Sector')
В нём используется подгрузка нестандартных шрифтов через Font-Face из за чего пришлось городить много лишнего.

В данной реализации возникают определённые трудности:
В браузере Safary появляются глюки(скрин прикрепил) Необходимо подождать пока текст до нижней части холста 'дойдёт' – что бы это увидеть...

Идея текстовой анимации такова:
Перед каждым выводом текста заново должен прорисовывается фон. В данном случае это обеспечивает бежевый квадрат 200 х 200:
ctx.fillRect(48,48,200,200);

Вопросы:
1) Когда слова выходят за пределы этого квадрата, начинают оставаться следы от этих слов. как это можно обойти?
Не хотелось бы пропуcкать весь холст через setInterval !?
Поскольку во первых происходит задержка при подгрузке всего содержимого, а во вторых тени также начинают копироваться вместе с текстом(если их включать):
http://yamaradg.narod2.ru/Canvas/canvas_3.html
(что естественно не приемлимо.)

2) Cуществует ли какой-нибудь механизм в JS, который бы 'подчищал' всё то лишнее, что рисуется в более глубоких слоях?(в данном примере.) + старые текстовые слои?

3) Возможно ли осуществить тестовую анимацию на холсте как то по другому?

4) Пока не могу разобраться, как прописать ф-цию(в js я не силён) , которая заставляла бы текст прекращать движение в случае если он подходит к краям бежевого слоя(с красной рамкой.)
Возможно ли использовать в данном случае св-во 'isPointInPath'?
Не могу понять как оно функционирует. :)
(облазил весь инет - не нашёл ни одного нормального, детального разбора(с примерами) этого св-ва!)

Код с вышеописанным примером выглядит следующим образом:
var canvas, ctx, w, h;
	             
	             canvas = document.getElementById('canvas');
	             w = canvas.width;
	             h = canvas.height;
	             ctx = canvas.getContext('2d');
	             ctx.save();
	             
	             ctx.beginPath();
	             ctx.shadowColor = "red";
	             ctx.shadowOffsetX=1;
	             ctx.shadowOffsetY=1;
	             ctx.shadowBlur =2;
	             ctx.strokeStyle="red";
	             ctx.strokeRect(48,48,200,200);
	             ctx.closePath();
	             
                  x=10;y=10;

	             function myTimeout(){	             	
	             	
	                     ctx.beginPath();
	                     ctx.shadowColor = "transparent";
	                     ctx.fillStyle="#CC9933";
			             ctx.fillRect(48,48,200,200);
	             	     ctx.closePath();
	             	     
	             	     ctx.beginPath();
			            ctx.shadowColor = "transparent";
	             	    ctx.fillStyle="blue";
	             	    ctx.fillRect(48,48,100,100);
	             	    ctx.closePath();
	             	    
	             	    ctx.beginPath();
	             	    ctx.shadowColor = "transparent";
	                    ctx.fillStyle = "green";
	                    ctx.arc(148, 148, 25, Math.PI*3/2, Math.PI, false); 
	                    ctx.fill();
	                    ctx.closePath();
	             	    
	             	    ctx.beginPath();
	             	    if (ctx.isPointInPath(50,50)==true) {
	                    	alert('Ура !');
	                    };
	             	    ctx.fillStyle="red";
					    ctx.font="400 15px orbitronioregular";
					    ctx.shadowBlur = 40;
			            ctx.shadowOffsetX=7;
			            ctx.shadowOffsetY=7;
			            ctx.shadowColor = "#cc9933";
	                    ctx.fillText("First",x+64,y+82);
	                    ctx.fillText("Sector",x+56,y+102);
	                    ctx.restore();
	                    x+=5;y+=5;
	                    
	                    ctx.closePath();
	                    
					};
					
					intervalID=setInterval(myTimeout,1000);


<!DOCTYPE html>
<html>
<head>
	<link href="style_2.css" type="text/css" rel="stylesheet">
</head>
<body>
		<canvas id="canvas" width="298" height="298">
			           Not Support Canvas
		</canvas>
		<span>Text For Canvas</span>
	
	<script src="script_4.js" type="text/javascript"></script>
</body>
</html>


Код:

@font-face {
    font-family: 'orbitronioregular';
    src: url('orbitronio-webfont.eot');
    src: url('orbitronio-webfont.eot?#iefix') format('embedded-opentype'),
        url('orbitronio-webfont.woff') format('woff'),
        url('orbitronio-webfont.ttf') format('truetype'),
        url('orbitronio-webfont.svg#orbitronioregular') format('svg');
    font-weight: normal;
    font-style: normal;

}
body{
        margin:0;
        padding:0;
        background-color:#fff;
}
span{position:absolute;
        font:normal 16px/21px  orbitronioregular;
        color:orange;
        margin:0 0 0 -9999px;
}
#canvas{
        border-radius:155px;
        border:1px solid #CC9933;
        background-color:#c0c0c0;
        margin:10px 0 0 10px;
        box-shadow:2px 2px 15px #CC9933;
}

Буду очень признателен, если кто поможет разобраться хоть в каких то вопросах, относительно данной ситуации..

dmitriymar 01.04.2013 20:32

Лень смотреть код и читать написанное.
Проблема в том что , когда текст выходит за пределы "стираемой области" след от него остаётся - он не стирается?
Даже при сохранении состояния канвы?
Если да -сохранение и возврат состояния канвы не очищает нарисованное, а возвращает состояние к сохранённому: угол поворота, центр...

Mike_Kharkov 01.04.2013 20:35

Цитата:

Сообщение от dmitriymar (Сообщение 243747)
Проблема в том что , когда текст выходит за приделы "стираемой области" след от него остаётся - он не стирается?
Даже при сохранении состояния какнвы? Если да -сохранение состояния канвы не очищает нарисованное, а возвращает состояние к сохранённому: угол поворота, центр...

Текст не стирается. Св-во Save(); не запоминает состояние текста, насколько мне известно.
Насчёт угла поворота центра и т.д. - я не совсем вас понял?

dmitriymar 01.04.2013 20:42

Цитата:

Сообщение от Mike_Kharkov
Текст не стирается.

почему он должен стираться за пределами очищаемой области?
пока сами не сотрёте то, что нарисовано -оно не затрёться
под сотрётся: затирание другим контентом, очистка области , заливка необходимым цветом ..
Цитата:

Сообщение от Mike_Kharkov
Cуществует ли какой-нибудь механизм в JS, который бы 'подчищал' всё то лишнее, что рисуется в более глубоких слоях?(в данном примере.) + старые текстовые слои?

Нет такого механизма -всё руками задавать

Всё что нарисовано на канве , не удалится при восстановлении до состояния "пока не рисовалось"

Mike_Kharkov 01.04.2013 20:46

Цитата:

Сообщение от dmitriymar (Сообщение 243752)
Нет такого механизма -всё руками задавать

Всё что нарисовано на канве , не удалится при восстановлении до состояния "пока не рисовалось"

Именно это меня и интересует!
Что конкретно нужно прописать(руками) что бы все старые ненужные слои подчищались?

dmitriymar 01.04.2013 20:48

Цитата:

Сообщение от Mike_Kharkov
Что конкретно нужно прописать(руками) что бы все старые ненужные слои подчищались?

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

Mike_Kharkov 01.04.2013 20:53

Цитата:

Сообщение от dmitriymar (Сообщение 243755)
задать обшласть какую стирать и стирать её либо очисткой

Как конкретно это можно сделать?

Цитата:

Сообщение от dmitriymar (Сообщение 243755)
а в обще может поможет "слоёная канва" -несколько канв , опрт размера лежащих друг на друге

Вы имеете ввиду несколько тегов Canvas? (Или слоёв внутри тега? Именно так, насколько я понимаю и реализован мой пример.)

Цитата:

Сообщение от dmitriymar (Сообщение 243755)
а в обще всё ответы е=но подобные вопросы ,есть в мало мальски приличном тутореале по канве, каких в сети тысячи

Можете примеры привести на русском языке(не на инглише)?
(что бы описывалось, как именно решать данный вопрос с текстовой анимацией. Лично я найти этого не смог.)

dmitriymar 01.04.2013 21:04

Цитата:

Сообщение от Mike_Kharkov
(Или слоёв внутри тега? Именно так, насколько я понимаю и реализован мой пример.)

чего?
В канве всегда 1 слой!! А различные изображения, фигуры наслаиваются на канву(на существующее изображение канвы и образуя "новое изображение" канвы) в порядке их рисования и по заданным правилам .

Цитата:

Сообщение от Mike_Kharkov
Как конкретно это можно сделать?

Не полинитись и воспользуйтесь гуглом
Цитата:

Сообщение от Mike_Kharkov
Можете примеры привести на русском языке(не на инглише)?

??? а вот на подобное предложение я вызверюсь, в гугле забанили ? не получается ввести фразу поисковую типа стереть canvas?

Mike_Kharkov 01.04.2013 21:14

Спасибо за 'помощь'!
Я перед созданием поста - сутки в гугле инфу пробивал по данной тематике. Если бы, что то обнаружил(ответы на свои вопросы) то точно бы сюда не обращался..
P.S. Под слоями(внутри холста) я подразумевал контуры..

Беру пример описания метода 'isPointInPath':
http://www.xiper.net/manuals/canvas/...intInPath.html
Как конкретно он работает я так и не понял!?
(Пробую в разные места кода(вместе с этим методом) Аlert подставлять и ноль реакции!)
В других источниках тоже самое примерно!
(в том числе и в поиске по этому форуму!)
Где мне ещё гуглить?

dmitriymar 01.04.2013 21:20

Цитата:

Сообщение от Mike_Kharkov
Спасибо за 'помощь'!
Я перед созданием поста - сутки в гугле инфу пробивал по данной тематике. Если бы, что то обнаружил(ответы на свои вопросы) то точно бы сюда не обращался..
P.S. Под слоями(внутри холста) я подразумевал контуры..

ну тогда в первую очередь нужно научится пользоваться гуглом
http://www.google.com.ar/search?sour...%83+javascript

первый же http://vremenno.net/js/introducing-canvas/
А вы уважаемый, не путайте помощь и посадку на голову . Потратить немного времени не влом , но хотеть чтоб тратилось время на
Цитата:

Сообщение от Mike_Kharkov
Можете примеры привести на русском языке(не на инглише)?
(что бы описывалось, как именно решать данный вопрос с текстовой анимацией. Лично я найти этого не смог.)

с учётом того что информации по этой теме много, не закрытая и ищется в течении пары минут -это хамство как минимум. проще всего сказать "я не смог"
Или ,по вашему , всем информацию на блюдечке приносили? Нет, искали в интернете , в книгах -и это дело буквально часа полутора -чтоб всё найти


Часовой пояс GMT +3, время: 09:21.