PDA

Просмотр полной версии : выравнивание в бегущей строке


Curizor
26.05.2008, 10:53
Здравствуйте. Вот у меня есть меню в виде бегущей строки. Там названия городов типа плывут. Названия берутся из xml. Подскажите пожалуйста, как мне сделать одинаковое между названиями расстояние? А то получается то шире (если название города короткое), то уже (если длинное). Можно, конечно, пробелов в эксэмэльке понаставить, но она генерится автоматически и города будут меняться заказчиком... Что же делать?

Alex_beginner
26.05.2008, 11:08
Поясните как релизована бегущая строка. Подробно, если можно.

Curizor
26.05.2008, 11:24
Вот код:
var isPlay = true;
var clipList:Array = new Array();
if (_root['href'] == undefined) _root['href'] = "sample.xml";

function initSity(caption, href, index) {

var resultMC = this.cityProto.duplicateMovieClip("city_" + index, this.getNextHighestDepth());

resultMC._y = 0;
resultMC._x = index * resultMC._width;
resultMC.__proto__ = new CSity();
resultMC.init(caption, href, this);
return resultMC;
}

function init(configFileName) {

_root.config = new XML();
_root.config.ignoreWhite = true;
_root.config['owner'] = this;
_root.config.onLoad = function(success:Boolean) {
if (success) {
this['owner'].configure(this);
}
}
_root.config.load(configFileName);
}

function configure(xml:XML) {

var cities = xml.firstChild.childNodes;
var len = cities.length

for(var i = 0; i < len; i++) {
if (cities[i].nodeName == 'city') {
var city = cities[i].childNodes;
var name = city[0].firstChild.nodeValue;
var href = city[1].firstChild.nodeValue;
clipList.push(initSity(name, href, i));
}
}
}

init(_root['href']);

function onEnterFrame() {
// move captions
if (isPlay) {
for (var i = 0; i < clipList.length; i++) {
clipList[i]._x -= 0.3;
if (clipList[i]._x < -clipList[i]._width) {
clipList[i]._x = (clipList.length - 1) * clipList[i]._width;
}
}
}
}
Исходник нужен?

Alex_beginner
26.05.2008, 14:44
Насколько я понимаю расстановка названий по оси X производится в этой строке:resultMC._x = index * resultMC._width;

Поправьте если я неправ.

Curizor
26.05.2008, 15:15
и как же мне сделать, чтобы названия друг от друга шли на динаковом расстоянии?

alexcon314
26.05.2008, 15:21
Curizor, исправьте свой третий пост в этой теме. Для оформления кода надо использовать теги

Alex_beginner
26.05.2008, 15:29
Ответье пожалуйста на поставленный вопрос, заданный в предыдущем моем посте!

Curizor
26.05.2008, 15:41
Вообще-то это ширина всей строки с названиями городов

исправил

Alex_beginner
26.05.2008, 15:46
resultMC._x не может быть шириной. Это позиция левого-верхнего угла клипа, относительно начала координат клипа-носителя. Другое дело, что она рассчитывается через ширину клипа. Но это не имеет отношения к делу.

1.Вы ответьте да или нет. При реализации всего этого Вы подразумевали, что в этой строке будут задаваться позиции названий1/ городов или нет?
2. Что исправили?
3. Работает ли?

Curizor
26.05.2008, 16:07
Да, так. Не работает. "Исправил" я написал модератору. Извините, я в форумах - новичек.

Alex_beginner
26.05.2008, 16:17
1.Скажите this.cityProto имеет точку регистрации в центре мува или левый верхний угол (или иное)?
2.Мне необходимо посмотреть текст класса CSity поскольку именно он отвечает за формирование самих надписей

DJ_Baton
27.05.2008, 02:26
А такой вариант чем плох - брать _x и _y объекта (в зависимости от того где надо отступо по высоте или ширине, прибавлять _width или _height объекта + определенный отступ, тогда можно выдержать четкое расстояние между всеми

Alex_beginner
27.05.2008, 09:47
DJ Baton!Curizor!
Все бы хорошо! Вот только ширина то, текущего клипа, а не предыдущего!

Поэтому, давайте подробно рассмотрим вот этот кусочек кода:

var resultMC = this.cityProto.duplicateMovieClip("city_" + index, this.getNextHighestDepth());

resultMC._y = 0;
resultMC._x = index * resultMC._width;
resultMC.__proto__ = new CSity();
resultMC.init(caption, href, this);

Что происходит в этих строчках!

1. Создается дубликат некоего клипа this.cityProto;
2. Ширина вновь созданного дубликата имеет то же значение, что и дублируемого клипа;
3. Координату левого-верхнего угла клипа-дубликата мы определяем как произведение счетчика цикла (см. ниже) и ширины текущего созданного дубликата;
4. Создаем потомок класса CSity;
5. Вызываем метод init() объекта класса-потомка от CSity.

Проанализируем п.2 и п.3, совместно.
Если, ширина всех создаваемых дубликатов одинакова, строчка:
resultMC._x = index * resultMC._width;

безусловно корректна. Поскольку, ее можно представить как сложение i равных значений. Ситуация в корне меняется, если эти расстояния неравны между собой. Тогда указанная выше формула для расчета положения клипа-названия некорректна, и будет давать искажения положения клипа-названия на родительской временной шкале.
Надейюсь объяснил понятно. Если не понятно, спрашивайте, объясню на примерах.

Теперь, как решить данную проблему.

Необходиму создать некоторую буфферную глобальную переменную в которую на текщей итерации - i, Вы будете записывать сумму ширин всех созданных на предыдущих итерациях дубликатов (клипов-названий). Тогда, позиция левого-верхнего угла текущего клипа-названия-дубликата будет определяться суммой ширин предыдущих. А после установки текущей позциии клипа, прибавив к ней ширину текущего клипа, мы получим позицию для клипа на следующей итерации.

В принципе, можно обойтись и без создания дополнительной глобальной переменной, а рассчитывать положение текущего клипа, как сумму двух значении - позиции _x предыдущего (на итерации i-1) созданного клипа-дубликата и его же ширины.

Это первый возможный вариант. Если он не поможет, то необходимо посмотреть текст реализации класса CSity, потому как именно он отвечает за формирование клипа-названия. Тест класса CSity здесь непредставлен.