Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Глючит TextFormat (http://www.flasher.ru/forum/showthread.php?t=123565)

Buble 04.04.2009 21:07

Глючит TextFormat
 
Есть простенький класс, с переменной TextField
почему-то когда вызывается scores += 10; то формат текста сбрасывается
в системный шрифт. А если установить embedFonts то не отображается вобще. :eek:

Код AS3:

package game 
{
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.text.TextFormat;
        public class ScoreManager
        {
                private var hiScores:int;
                public var scoreText:TextField;
                public var format:TextFormat;
                private const GREEN_COLOR = 0x42A516;
 
                public function ScoreManager(container:Sprite)
                {
                        hiScores = 0;
                        scoreText = new TextField();       
                        scoreText.text = "Scores: 0";
                        scoreText.selectable = false;
                        //scoreText.embedFonts = true;
                        format = new TextFormat();
                        format = scoreText.getTextFormat();
                        format.font = "Poplar Std";
                        format.color = GREEN_COLOR;
                        format.size = 16;
                        scoreText.setTextFormat(format);
                        container.addChild(scoreText);
                }
                public function get scores():int
                {
                        return hiScores;
                }
                public function set scores(value:int):void
                {
                        hiScores = value;
                        trace(scoreText.text);
                        scoreText.text = "Scores: " + String(hiScores);
                }
        }
}


BlooDHounD 04.04.2009 21:15

defautTextFormat

Buble 04.04.2009 21:50

А я было подумал что объект TextFormat создается где-то не там, спасибо.

willis83 04.04.2009 21:59

У меян тоже проблема! Я тут уже все темы перерыл и никак не могу найти того, что нужно. Пишу в CS4, проблема у меня с русским шрифтом.Русский шрифт получаю через xml и вывожу в текстфилде, но вылазят каракули. Я сначала подумал что шрифт не поддерживает(использую не встроенный), но когда протрейсил понял что дело не только в шрифте, т.к. трэйс тоже каракули выдал. Для начала решил встроить шрифт, облазил тут пол форума, перечитал кучу тем, Но так и не понял как в CS4 встраивать шрифты, при том, что все текстфилды у меня динамические. Вот iNils писал:
Цитата:

Шрифты заменяются только если у вас динамическое поле, чтобы это не происходило надо внедрить шрифты в swf. Для этого надо выбрать текстовое и в панели его свойств нажать кнопку Embed, после чего указать необходимый диапазон символов (можно необходимые символы вбить вручную). Например Cyrillic (не выбирайте All, так как будут внедрены все символы шрифта, а это могут мегабайты лишнего веса)
Во первых текстовых полей у меня нет, всё программно, но это не беда, создал левое поле и пол часа там искал эту ""кнопу Embed"... но нет её там! Ладно, пошел другим путём, несмотря на то что все кричат что шрифт в библиотеке это зло, я его туда добавил, но если в коде указываешь
Код AS3:

mytext.embedFonts = true;

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

BlooDHounD 04.04.2009 22:13

utf-8

willis83 04.04.2009 22:18

А можно чуть-чуть по конкретней? Поиск по AS3 ничего не выдаёт на это

duhowka 04.04.2009 22:34

Цитата:

Сообщение от BlooDHounD (Сообщение 810860)
utf-8

Наверно он имеет ввиду смену кодировки у русского текста на utf-8

willis83 04.04.2009 22:50

Угу, нашел я его же советы по данному вопросу и состряпал такую функцию
Код AS3:

function Encoding(sometext:String):String {
                        var ba:ByteArray = ByteArray(sometext);
                        var utfData:String = String(ba.readMultiByte(ba.bytesAvailable, "utf8"));
                        return utfData
};

Теперь все поля и атрибуты xml которые потенциально могут содержать русский шрифт придётся прогонять через эту функцию. Проще нет решений?

Buble 04.04.2009 22:53

Если trace выводит коракули, может надо сам xml-файл сделать в utf-8?

willis83 04.04.2009 23:00

Теперь выдаёт ошибку :
Цитата:

TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать "bla-bla-blakjhjhfgkjkâñå ìîäåìû ãåè" в flash.utils.ByteArray.
Buble, xml мне отдаёт php скрипт, если подскажешь что надо написать в скрипте или в выводимом xml буду очень благодарен

BlooDHounD 04.04.2009 23:06

willis83, String нельзя сконвертировать в ByteArray.

willis83 04.04.2009 23:10

BloodHound, у Вас такие исчерпывающие ответы...
Может подскажете решение данной проблемы?

BlooDHounD 04.04.2009 23:14

http://www.flasher.ru/forum/showpost...66&postcount=9

Buble 04.04.2009 23:16

Может такое написать в php-скрипте
$title = iconv("ISO-8859-1","utf-8",$title); // из ISO в UTF.

Или поищи в google, там тоже куча функций для php

willis83 04.04.2009 23:17

Buble, спасибо за совет. Буду пытаться

Добавлено через 3 часа 46 минут
Плохо, что нет конкретного решения и в каждом отдельном случае человеку приходится решать проблему с самого начала... могли бы уже придумать чё-нибудь... вот мне сейчас больше делать нечего как разбираться в тонкостях кодировок.

etc 05.04.2009 10:01

willis83, есть только одна кодировка — utf-8. Никаких тонкостей больше нет. Всё остальное — не кодировки.

willis83 05.04.2009 13:26

Ерунда какая-то!!! Это может в CS4 глюк какой, потому что БД отдаёт все на UTF-8, не может же php сам кодировку поменять при выводе!!! А флэш всё равно каляку маляку видит.... уже не знаю чё делать.

Добавлено через 11 минут
О! Единственное что даёт результат это прогон ответов БД через функцию iconv в php скрипте.... но я, блин, крякну все ответы через эту функцию прогонять..

etc 05.04.2009 13:41

Переведите БД на utf. Если бы она была в этой кодировке, у вас проблем не возникло бы.

willis83 05.04.2009 13:46

Версия сервера: 5.0.22
Версия протокола: 10
Сервер: Localhost via UNIX socket
Пользователь: wondernet@localhost
MySQL-кодировка: UTF-8 Unicode (utf8)
Сопоставление соединения с MySQL: utf8_unicode_ci

Куда ещё больше?

iNils 05.04.2009 14:00

Судя по тексту на первой страницы, у вас вместо кодовой страницы CP1251 стоит CP1252.

etc 05.04.2009 14:13

willis83, это вовсе не означает, что сами данные в базе именно в этой кодировке :)

willis83 05.04.2009 14:17

Не знаю.... я вообще не понимаю откуда вылазят CP-125*
Я свою проблему решил так. Добавил в php это:
PHP код:

function echoutf($mystring) {
$mystringutf iconv("cp1251","utf-8"$mystring);
return 
$mystringutf;
};

...

while (
$x mysql_numrows($result)) : 
        ...
        
$myvar mysql_result($result$x'myvar');
        
$myvar echoutf($myvar); 
        echo 
"<teg1 name=\"$myvar\" /> \n";
        ... 

Короче прогоняю все ответы через этот iconv и флэш нормально распознаёт русский, а почему до этого не работало так и не понял.

etc 05.04.2009 14:19

Значит данные в базу сохраняются именно в CP1251.

willis83 05.04.2009 14:22

__etc, а как узнать в какой они там кодировке и сделать чтобы они были там в utf-8??? База в приницпе тестовая и наполнял я её в ручную через phpMyAdmin

etc 05.04.2009 14:29

В своё время я пару дней потратил на перевод данных из cp1251 в utf-8. Гонял туда-сюда бекапы и прочая. Так до конца с этим phpMyAdmin не разобрался, но в конечном итоге каким-то мистическим образом добился конвертации в нужный формат. Дело было давно, подробностей не помню. Надеюсь, больше мне этим заниматься никогда не придется.

willis83 05.04.2009 14:31

Наверное из-за phpMyAdmin и получилось CP-1251, потому как через веб интерфейс команды проходили

etc 05.04.2009 14:32

Скорее всего.

willis83 05.04.2009 14:34

Получается, когда база будет наполнятся по запросам от swf необходимость в iconv отпадёт и можно будет функцию echoutf выкинуть из скрипта?

etc 05.04.2009 14:38

По идее да. Вообще никаких конвертаций не производить потом.

willis83 05.04.2009 15:56

Нашел где собака зарыта - сами тэйблы на CP-1251. PhpMyAdmin по умолчанию создаёт в этой кодировке... мда, работа меня нашла, придётся всё перетращивать по новой

Мечтатель 05.04.2009 20:56

willis83, встраивание шрифтов в Adobe Flash CS4 (Professional) дело несложное. Раз уж вы кучу инфы перерыли и так и не поняли, как это делается, попытаюсь объяснить Вам еще раз. Может у меня лучше получится?!))
Есть два способа встраивания шрифтов в свое Flash-приложение:
-традиционный Flash способ. В среде разработки Adobe Flash CS4 открываем библиотеку символов. Правой кнопкой мыши вызываете контекстное меню, в котором выбираете пункт New Font... Далее из выпадающего списка шрифтов (Font), установленных в системе, выбираем тот, который собираемся использовать в своем Flash-приложении. Убираем галочку с пункта Bitmap text. Пункт Name играет чисто косметическую роль для отображения имени шрифта в библиотеки символов. Теперь ставим галочки напротив пунктов Action For ActionScript и Export In Frame 1. После всего этого жмем "Ok" (Flash выведет Вам предупреждение о том, что класс шрифта не найден и будет создан автоматически при экспорте в SWF-файл, можете смело игнорировать данное предупреждение). Вот и всё - шрифт встроен.
Однако, Вы можете быть очень удивлены, что шрифт, поддерживающий русский язык фактически не отображает его в проекте. Такое часто происходит в CS4 с ttf-шрифтами, подерживающими русский язык. Суть проблемы со шрифтами TTF заключается в том, что в большинстве (но не во всех!) существующих кириллических шрифтов Unicode-индексы символов, изображающих русские буквы, соответствуют латинской кодовой таблице CP1252, а не кириллической CP1251. Поэтому среда разработки попросту не обнаружит глифов для отображения кирилицы, а следовательно, если текстовое поле отоборжает текст с помощью встроенных шрифтов (myTextField.embedFonts=true) русский текст отображен не будет. В этом случае приходит на помощь нетрадиционный для Flash способ встраивания шрифтов...Способ второй "Flex спешит на помощь" читай ниже...
-Второй способ заключается во встраивании шрифтов не с помощью среды разработки Flash, а с помощью AS 3.0 кода и библиотеки Flex SDK. Последняя распространяется бесплатно, актуальный релиз можно скачать с официального сайта корпорации Adobe. Итак скачиваем Flex SDK, создаем новый as-файл следующего содержания (к примеру):
Код AS3:

package {
        import flash.display.Sprite;
        import flash.text.*;
 
        public class Fonts extends Sprite{
 
                [Embed(source="c:/windows/fonts/Arial.ttf", fontFamily="Arial")]
                private var arial:Class;
 
                [Embed(source="c:/windows/fonts/univers ru.ttf", fontFamily="Univers")]
                private var univers:Class;
 
                [Embed(source="c:/windows/fonts/domino.ttf", fontFamily="a_DomIno")]
                private var domino:Class;
 
                [Embed(source="c:/windows/fonts/lcdnova.ttf", fontFamily="a_LCDNova")]
                private var lcdnova:Class;
 
                [Embed(source="c:/windows/fonts/huxl_c.ttf", fontFamily="a_HuxleyCaps")]
                private var huxleycaps:Class;
 
                [Embed(source="c:/windows/fonts/crystal.ttf", fontFamily="Crystal")]
                private var crystal:Class;
 
 
                public function Fonts()
                {
                        Font.registerFont(arial);
                        Font.registerFont(univers);
                        Font.registerFont(domino);
                        Font.registerFont(lcdnova);
                        Font.registerFont(huxleycaps);
                        Font.registerFont(crystal);
 
                }
        }
}

Далее с помощью среды разработки компилируем этот класс в swf-файл (программа Вас попросит прописать путь к Flex SDK) и затем используем его для динамической загрузки шрифтов в проект на этапе выполнения.

ВНИМАНИЕ!!! Эти два способа не взаимоисключаемые, их можно использовать в комбинации. Например, шрифты, с которыми не возникает проблем могут быть встроены с помощью традиционного метода (да, в таком случае, не забудьте в первом кадре fla-файла с помощью статического метода класса Font - registerFont, добавить втроенные шрифты в глобальный список шрифтов) а проблемные путем подключения класса Fonts. Будьте внимательны, возможно такое, что шрифты, которые нормально внедряются через библиотеку символов - оплошаются при их внедрении с помощью Flex SDK (а чаще всего так и происходит).

willis83 05.04.2009 21:12

Спасибо! Достойный, развёрнутый ответ. На счёт первого способа, уже столкнулся с проблемой: шрифт встроил, но при
Код AS3:

mytext.embedFonts = true;

текст всё равно не видимый

Добавлено через 1 минуту
текст на английском

Мечтатель 05.04.2009 21:24

willis83, встроили шрифт с пощью библиотеки символов. Проверьте наличие глифов для английского текста и для русского следующим методом:
Код AS3:

var fontName:String="yourFont"; /*Имя шрифта, который проверяем на наличие необходимых глифов (имя шрифта указывайте то, которое отображается в поле Class (библиотека символов, ваш шрифт))*/
var font:Font; //В эту переменную позже запишем ссылку на экземпляр класса Font
var fonts:Array=Font.enumerateFonts(false); /*Статический метод класса Font, который возвращает список .встроенных шрифтов */
 
for(var i:int=0; i<fonts.length; i++){
if(fonts[i].fontName==fontName){
 font=fonts[i];
 break;
}
}
 
trace(font.hasGlyphs("Привет, Мир!"));
//Выводит false, т.е. в шрифте yourFont отсутствуют необходимые глифы для отображения русского текста.
trace(font.hasGlyphs("Hellow, Word!"));
//Выводит false, т.е. в шрифте yourFont отсутствуют необходимые глифы для отображения английского текста.

Если в обоих случаях будет false, выложите мне шрифт.
P.S. каким способом форматируете TextField? Передаете ссылку на экземпляр класса TextFormat в свойство defaultTextFormat экземпляра класса TextField, или же с помощью метода экземпляра класса TextField setTextFormat??

willis83 05.04.2009 22:16

Чё-то я прикола не пойму, у меня он не видит встроенный шрифт, т.е. при попытке скомпилить ваш код выдаёт ошибку:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
ссылуи я правильно прописал, галочки все поставил... не знаю почему не видит

Добавлено через 1 минуту
про способ форматирования - setTextFormat

Мечтатель 05.04.2009 22:20

willis83, скиньте мне исходник.))
Используйте defaultTextFormat

willis83 05.04.2009 22:43

Вложений: 1
вот...

Мечтатель 05.04.2009 23:07

willis83, простите меня за описку, при проверке на наличие глифов нужно указывать Имя Шрифта, которое указано в поле Font. У меня показало, что этот встроенный шрифт не содержит глифов для отображения русского текста, так что встраивать его нужно посредством Flex SDK 3.0.2

Это код рабочего класса main (блин, давайте имена классам с Большой буквы, а то, глаза режет))))
Код AS3:

package { 
        import flash.display.Sprite;
        import flash.text.*;
 
        public class main extends Sprite {
            public function main():void {
                        var myTf:TextField = new TextField();
                    myTf.text = "hfghfghgfhвпвтволаббю";
 
                        var format:TextFormat = new TextFormat();
                        format.color = 0xFF0000;
                        format.font = "Tahoma";
                        format.size = 35;
 
                        myTf.embedFonts = true;   
                        myTf.y = 100;
                        myTf.x = 100;
                        myTf.width = 800;
                        myTf.setTextFormat(format);
                        addChild(myTf);
                        //var fontName:String="MyFont"; /*Имя шрифта, который проверяем на наличие необходимых глифов (имя шрифта указывайте то, которое отображается в поле Class (библиотека символов, ваш шрифт))*/
                        //var font:Font; //В эту переменную позже запишем ссылку на экземпляр класса Font
                        //var fonts:Array=Font.enumerateFonts(false); /*Статический метод класса Font, который возвращает список .встроенных шрифтов */
 
                        //for(var i:int=0; i<fonts.length; i++){
                        //if(fonts[i].fontName==fontName){
                        //font=fonts[i];
                        //break;
                        //}
                        //}
            //trace(font.hasGlyphs("Привет, Мир!"));
            //trace(font.hasGlyphs("Hellow, Word!"));
                };
        };
};

отображается только латиница. Встраивать нужно посредством Flex этот шрифт. У Вас есть Flex SDK?

P.S. В fla-файле в библиотеке Вы все встроили правильно.)

willis83 06.04.2009 13:03

Flex SDK сегодня перепишу и попробую разобраться со вторым способом

nOobCrafter 06.04.2009 15:57

Делал проект на ас2 (под кс3), сення с дуру снес кс3, но есть кс4, открыл, сразу же скомпилил (ничего не менял) и как пишете выше "Однако, Вы можете быть очень удивлены" Ага, русские шрифты пропали, хотя все честь по чести, в библиотеке валяется самый обычный Trebuchet MS / 10 с линкейджем. Как тут быть?..второй способ как понял только для ас3?

willis83 06.04.2009 16:03

да, похоже второй способо только для ас3, т.к. поддержка embed необходима. Мне кажется что если нет надобности с текстом выделывать трюки, то можно остановиться на использовании не втроенных шрифтов и не парить мозги


Часовой пояс GMT +4, время: 05:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.