PDA

Просмотр полной версии : Бегущая строка. DisplacementMapFilter? BitMap?


wonderwhy
31.08.2006, 01:05
:confused: Мне нужно сделать эффект бегущей строки как в новостях в низу экрана. Не анимацию а эффект так как текст подразумевается динамическим. Я бы хотел, услышат мнения о том, как это можно было бы сделать.
В принципе кое, какие идеи у меня есть но сначала я бы хотел узнать про 2 способа с которыми во Flash я не очень то разбираюсь.

DisplacementMapFilter - теоретически если работать с BitMap, на сколько я понимаю можно добиться того, что для DisplacementMap все пиксели будут иметь смещение в 1 пиксель кроме пикселей крайнего рядя. Крайние будут иметь смещение в обратную сторону равное длине BitMap'a. А далее он будет применяться кадр за кадром. Возможно, ли это и если да то не мог ли бы показать пример в коде, так как я не уверен как это правильно сделать. :confused:

BitMap - вариант второй это работать напрямую с BitMap. Переставлять эти пиксели в ручную таким же образом, как и выше. :confused:

И так я бы хотел услышать мнения по этому поводу. Возможно ли это? Плюсы и минусы каждого метода?
У меня есть предположение что если превращать текст в BitMap будет теряться anti-analising, а это не очень, то, хорошо учитывая что текст может быть маленьким. :confused:

etc
31.08.2006, 14:14
Мне нужно сделать эффект бегущей строки как в новостях в низу экрана.
В низу чьего экрана?

И почему бы не юзать .hscroll обычного текстового поля вместо извращений?

__i
31.08.2006, 14:25
а что просто _x++ уже не катит ?

wonderwhy
31.08.2006, 17:04
В низу чьего экрана?
Это не важно. Просто эффект для текста где текст бежит с лева на право или наоборот.

И почему бы не юзать .hscroll обычного текстового поля вместо извращений?
Хмм некогда с ним не работал. Сеча попробовал. Не совсем подходит так как в исходном виде не позволяет тексу выйти за пределы поля полностью хотя если немного по извращаться то можно за счёт пробелов этого добиться.
а что просто _x++ уже не катит ?
Ну, прост это не удобный способ на самом то деле. Представать, что у меня ширена поля, где идёт прокрутка текста, скажем 300 пикселей в длину, а слово одно и занимает, скажем, 50. Тогда надо создать 5-6 текстовых полей, которые будут _x++ на EnterFrame и в случае, что полностью вышли из поля приносятся в право и опять всё с начала.

Я опробую все способы и выложу результаты и код здесь.

etc
31.08.2006, 17:12
Зачем делать из мухи слона?
Двигать текст можно и под маской, дубовый способ.

wonderwhy
01.09.2006, 01:42
Зачем делать из мухи слона?
Двигать текст можно и под маской, дубовый способ.

Ну, это тот способ, который мне пришел в голову в первую очередь, но он действительно дубовый :wacko: Сегодня опробовал вариант через BitmapData. Получилось неплохо, но сдвиг как минимум на 1 пиксель не меньше. Я думаю, сделаю три варианта.
Первый с маской простое _x++.
Второй через битмап и 3 через hscroll. К последним двум надо будет сделать небольшие примочки, что бы можно было сдвигать меньше чем на пиксель и для hscroll надо еще кое-что сделать. Подтестирую на скорость и вообще как выглядеть будет. А там посмотрим :victory:

lamazz
07.06.2007, 13:03
Интересно чем тесты законцились =)

CrazyFlasher
07.06.2007, 13:07
мда...зачем таким развратом заниматься?? можно просто менять положения по _x под маской и всё!

Aisaid
15.06.2007, 20:05
когда-то я уже эту тему подымал - юзай поиск ;)

у меня получилось довольно неплохой скрол - с возможностью загрузки из внешнего файлика (*.txt) (метод маски), и естественно можно выбрать любой шрифт...

wvxvw
21.06.2007, 18:30
var _txt:TextField = _root.createTextField("_txt", 0, 0, 0, 300, 20);
_txt.text = "It was many and many a year ago, in the castle by the sea. There lived a maiden that you may know by the name of Annabe Lea. ";

_root.onEnterFrame = function(){
var _str = _txt.text;
_str = _str.substr(1, _str.length)+_str.charAt(0);
_txt.text = _str;
}
trace("Edgar 4ever!!! %)");

Serbaev
21.07.2007, 12:15
А скорость движения бегущей строки можно ли регулировать программным способом? Если можно, то как это сделать?

aksios
21.07.2007, 13:16
В общем, делал я делал эфект бегущей строки... Все хорошо когда у вас мелкий шрифт, буковки не сильно контрастные, а вот кода нет... В общем дефехты появляются при движении строки или процессор имеет слишком большую загрузку.
Это при том, что если делать бегущую строку в браузере джабой скриптом, то ваще никаких проблем нету.

Serg_V
21.07.2007, 17:33
import flash.display.BitmapData;
import flash.geom.Rectangle;

function setScrollString(clipName, x, y, width, textSize, textName, scrollSpeed, textString){

var clip = this.createEmptyMovieClip(clipName, this.getNextHighestDepth());

var textMovie = clip.createEmptyMovieClip("textMovie", clip.getNextHighestDepth());
var maskMovie = clip.createEmptyMovieClip("maskMovie", clip.getNextHighestDepth());

var fmt:TextFormat = new TextFormat();
fmt.font = textName;
fmt.size = textSize;

var txt:TextField = textMovie.createTextField("txt", textMovie.getNextHighestDepth(), 0, 0, 10, textSize);
txt.text = textString;
txt.autoSize = true;
txt.setTextFormat(fmt);

var txtClone:TextField = textMovie.createTextField("txtClone", textMovie.getNextHighestDepth(), 0, 0, 10, textSize);
txtClone.text = textString;
txtClone.autoSize = true;
txtClone.setTextFormat(fmt);

if(width > txt._width) width = txt._width;

var myBitmapData:BitmapData = new BitmapData(width, textSize+4, false, 0x00CCCCCC);
maskMovie.attachBitmap(myBitmapData, maskMovie.getNextHighestDepth());
myBitmapData.rectangle = new Rectangle(0, 0, width, textSize);

clip._x = x;
clip._y = y;

textMovie.setMask(maskMovie);

clip.onEnterFrame = function(){

if(txtClone._x < 0){

txt._x = txtClone._x

}

txt._x -= scrollSpeed;
txtClone._x = txt._width + txt._x;

}

return clip;

}

var string1 = setScrollString("string1", 10, 10, 200, 14, "Arial", 2, "Засунь сюда строку любой длинны и это должно работать =). Это один из плохих способов сделать бегущую строку. ");
var string2 = setScrollString("string2", 30, 30, 300, 12, "Arial", 1, "Даже очень короткий текст.");
var string3 = setScrollString("string3", 50, 50, 100, 6, "Arial", 3 ,"И даже очень мелкий, но главное не забуть поставить скорость проигрывания 30 FPS");

trace("ALiEN@eyelinkmedia.com");


Вот посмотри я набросал вариантик ... может поможет? :victory: