Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.05.2014, 15:16
EpicMan вне форума Посмотреть профиль Отправить личное сообщение для EpicMan Найти все сообщения от EpicMan
  № 1  
Ответить с цитированием
EpicMan

Регистрация: Apr 2012
Сообщений: 6
Cool Управление изображениями в игре

Хотелось бы узнать, как вы организуете управление изображениями в игре? То есть, BitmapData'ами.

Сейчас у меня в игре 600 изображений в формате PNG. Работаю я сними следующим образом:
Код AS3:
public class Images 
{
	public static const image_1_class:Class;
	public static var image_1:BitmapData;
 
	public static const image_2_class:Class;
	public static var image_2:BitmapData;
 
	...
}
 
// инициализация при запуске игры
Images.image_1 = new Images.image_1_class().bitmapData;
Images.image_2 = new Images.image_2_class().bitmapData;
Когда мне нужно создать кнопку с нужной текстурой, я делаю так:
Код AS3:
new Button().setTexture(Images.button_close);
Часть изображений используется для лобби, другая часть используется для игрового интерфейса, третья часть используется в качестве атласов. Думается мне, хранить все текстуру в памяти плохой подход, если в конкретный момент используется только часть из них. Допустим, когда я запустил игру, мне не нужны изображения для лобби.

Сейчас я хочу сделать какой-нибудь контент менеджер, но не знаю, насколько это хорошая идея. Он будет создавать изображения только по запросу. Внутри него будет таймер, который будет срабатывать каждые пять минут. И эти каждые пять минут будет происходить проверка - запрашивалось ли изображение за последние пять минут, если нет, то оно освобождается (BitmapData.dispose).

Старый 08.05.2014, 15:52
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 2  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Логичнее проверять "используется ли изображение сейчас", а не "использовалось ли оно недавно". А вот это уже куда интереснее. Для этой задачи можно использовать слабые ссылки на объекты BitmapData (метод dispose Вам не понадобится, потому что сборщик мусора сам сделает всю работу при таком подходе).
Попробуйте разобраться как работает этот класс:
Код AS3:
package keep.it.secret
{
    import flash.utils.Dictionary;
 
    /**
     * Слабая ссылка на объект.
     *
     * @author is.hiding
     */
    public class WeakReference implements IGCController
    {
        private var _useWeakReference:Boolean;
        private var _store:Dictionary;
        private var _strongReference:Object;
 
        public function WeakReference( object:Object = null, weak:Boolean = true )
        {
            _useWeakReference = weak;
 
            if( object ) this.object = object;
        }
 
        /**
         * Получить или сохранить ссылку на объект.
         */
        public function get object():Object
        {
            if( !_store ) return null;
 
            for( var object:Object in _store )
                return object;
 
            return null;
        }
 
        /**
         * @private
         */
        public function set object( value:Object ):void
        {
            if( !_store ) _store = new Dictionary(true);
 
            this.removeObject();
 
            if( value )
            {
                _store[value] = true;
 
                if( !_useWeakReference ) _strongReference = value;
            }
        }
 
        /**
         * Удалить объект, если он есть.
         */
        private function removeObject():void
        {
            if( _strongReference )
            {
                delete _store[_strongReference];
 
                _strongReference = null;
            }
            else
            {
                if( this.object ) delete _store[this.object];
            }
        }
 
        /**
         * @inherit doc
         */
        public function get useWeakReference():Boolean
        {
            return _useWeakReference;
        }
 
        /**
         * @private
         */
        public function set useWeakReference(value:Boolean):void
        {
            if( _useWeakReference == value ) return;
            // если ссылка переключена на слабую
            if( value ) _strongReference = null;
            else _strongReference = this.object;
 
            _useWeakReference = value;
        }
    }
}
__________________
...вселенская грусть

Старый 08.05.2014, 22:55
EpicMan вне форума Посмотреть профиль Отправить личное сообщение для EpicMan Найти все сообщения от EpicMan
  № 3  
Ответить с цитированием
EpicMan

Регистрация: Apr 2012
Сообщений: 6
gloomyBrain
Идея интересная, но смущает то, что придётся создать 600 дополнительных объектов слабых ссылок + 600 объектов Dictionary.

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
bitmapdata
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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