Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Неадекватная область содержимого (http://www.flasher.ru/forum/showthread.php?t=153169)

ShadowsInRain 29.03.2011 21:55

Неадекватная область содержимого
 
Привет.

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

Создаю экземпляр спрайта. Очищаю. Рисую. Ловлю событие мыши. Итоговый размер спрайта получается гораздо больше, чем его визуальная часть. Это видно, если сделать его фон непрозрачным, ну и мышь, соответсно, ловится этой "лишней" областью.

Пруф:
[IMG]http://plasmon.**********/4987754.image[/IMG]

Вот ключевой код:

Код AS3:

                        // это в конструкторе
                        m_CaptionContainer = new Sprite();
                        f_Redraw_Caption();
                        ...
                        m_CaptionContainer.addEventListener(MouseEvent.MOUSE_MOVE, f_MouseOverCaption);
 
...
 
                protected function f_Redraw_Caption()
                {
                        m_CaptionEntity.x = m_CaptionEntity.y = m_Margin - 2;
 
                        var w:Number = 2 * m_Margin + m_CaptionEntity.textWidth;
                        var h:Number = 2 * m_Margin + m_CaptionEntity.textHeight;
 
                        m_CaptionContainer.graphics.clear();
                        m_CaptionContainer.graphics.lineStyle(1, 0xFFFFFF);
                        m_CaptionContainer.graphics.beginFill(0xFFFFFF, 0.35);
                        m_CaptionContainer.graphics.drawRect(0, 0, w, h);
                        m_CaptionContainer.graphics.endFill();
 
                        m_CaptionContainer.opaqueBackground = 0xFF0000; // для дебага
                }
 
...
 
                // для дебага
                protected function f_MouseOverCaption(event:MouseEvent)
                {
                        Popup.instance.text = String(event.target)
                                + "\n" + m_CaptionContainer.width + " * " + m_CaptionContainer.height;
                        Popup.instance.x = x + width;
                        Popup.instance.y = event.stageY;
                }

Среда разработки (вдруг это имеет значение): CS5.
За стилистику не пинайте, я всего три дня в AS3, а душу уже продал С++.

goodguy 29.03.2011 22:35

А почему показан лишь кусок кода?
По нему ничего толком сказать нельзя. Но спрайт сам по себе не может быть больше, чем положено. Его размер, определяется размерами содержимого. Здесь видно текст филд внутри спрайта, от так же влияет на его размеры. Скорее всего по умолчанию этот текстфилд слишком высокий (я имею в виду не высоту текста, а высоту самого текстового поля), поэтому и спрайт тянется до ненужных размеров. Это можно проверить назачив текстфилду значения border и borderColor. Сам много раз наступал на эти грабли, причем даже несколько минут назад )

bav 29.03.2011 22:36

Я подозреваю, что где-то в коде у вас присутствует строчка
Код AS3:

m_CaptionContainer.addChild(m_CaptionEntity);

Если я прав, то ситуацию можно объяснить тем, что текстовое поле имеет размеры по-умолчанию 100x100.

Добавлено через 3 минуты
Отключить реакцию на мышь у текстового поля можно установив свойство mouseEnabled в false.

fish_r 29.03.2011 22:56

а сократить размеры текстового поля до тех которые реально занимает текст можно:
Код AS3:

 var myText:TextField = new TextField();
 myText.autoSize = "left";

Добавлено через 1 минуту
вообще, подробнее здесь: http://help.adobe.com/ru_RU/AS3LCR/F....html#autoSize

Котяра 30.03.2011 00:35

Цитата:

За стилистику не пинайте, я всего три дня в AS3, а душу уже продал С++.
На С++ тоже нормально пишут, а не убогой венгерской нотацией. В AS пишут почти так же.
Если задержитесь в AS - озаботьтесь вниканием в принятые конвенции. Полезно будет.

i.o. 30.03.2011 09:06

хм, а в плюсах суффиксом рекоммендуют подчеркивание в приватах писать.. ;)
Код:

class SomeClass {
    private:
        int length_;
}


fish_r 30.03.2011 09:44

Прикольно, что акронимы в С++ рекомендуют писать прямо противоположно тому, что рекомендуется для кода в AS...

... однако мы с вами, ShadowsInRain, в ад вместе попадём. Я ведь тоже нарушитель(о_0) соглашения :)

ShadowsInRain 30.03.2011 12:47

Всё правильно, текстфилд я добавил чайлдом, а про его размеры забыл. Вот он и палится: 100 свой размер, + 8 отступ от угла. Как его укращать, я уже в курсе.
Странно, что Adobe сделали такой конкретный размер по-умолчанию и вырубили автосайз. Имхо, здравый смысл подсказывает, что по-умолчанию должен быть только автосайз.
Спасибо всем большое. :3

bav, я использую mouseChildren. Тем не менее, сообщение дошло до контейнера, иначе бы я не узнал о деффекте.

Оффтоп на счёт стилистики.
Во-первых, поля с m_ и так непубличные. Во-вторых, в некоторых конторах (Microsoft, Valve) есть мода использовать m_ для для любого "member". Такой стиль оченнь понравился. В какой-то ветке писали, что современные IDE с их плюшками должны избавить от проблем определения типа на глаз. Да вот, я вам скажу, что это нифига не работает, потому что среди месива из всех 100500 определений разобраться отнюдь не легко. А тут я ставлю m_, зову автодополнение, и сразу вижу список всех свойств / переменных. Ставлю f_, и вижу список непубличных функций. И ещё меня коробит писать первое слово в составном имени с нижнего регистра.

fish_r, мы попадём в ад только если наш код будет глючным и непонятным, или сломает кому-то мозг при рефакторинге. Стилистика не причём.)

etc 30.03.2011 15:47

ShadowsInRain, вместо m_ давно уже пользуют this.

Котяра 30.03.2011 19:04

Цитата:

И ещё меня коробит писать первое слово в составном имени с нижнего регистра.
но вы ведь пишите addEventListener, stageX и т.п.,
почему же тут коробит, а тут не коробит...
Я не против собственных конвенций, просто проблема в том, что конвенция должна быть одна.
А тут идёт смесь своей конвенции и конвенции базовых классов, а если вы ещё какую либу подключите (тоже со своим уставом)?
Просто я когда вижу такой код - заставляю переписывать ибо:
Цитата:

сломает кому-то мозг при рефакторинге


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

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