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

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

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

Регистрация: Apr 2004
Адрес: Ramat Gan, Israel
Сообщений: 30
Question TestureAtlas vs Clipped Image

У меня есть картинка размером чуть больше размера экрана. Когда игра поднимается, я должна порезать ее на полосы - количесво полос задается в начале на экране конфигурации (допустим, полос может быть от 3-х до 10-ти, но не больше), после чего я режу картинку на полосы и показываю все полосы - каждая двигается отдельно. Я вижу несколько способов сделать это:

1. Сделать атласы (если картинку можно разрезать на 3-10 частей, то мне понадобится 8 отдельных атласов) под каждое количество полос, загрузить картинку как класс, загрузить соответствуюший атлас, создать TexturedAtlas, создавать по текстуре на каждую полоску и из этих текстур настричь Image-ей.

2. Сделать один атлас со всеми полосками, а дальше, как и в первом случае: загрузить картинку как класс, создать TexturedAtlas, по текстуре на каждую полоску (в смысле, что в моем атласе будут 52 полосы, но мне понадобятся только, нарпимер, 5 (если на экране конфигурации выбрали 5 полос)), и из полученных текстур наделать Image-ей.

3. Не пользоваться алтасами, а загрузить картинку, как класс, сделать соответствующее количество Image-ей со всей картинкой и обрезать каждый из них, чтобы получились полоски.

Теперь вопросы:

а) В плане скорости написания кода второй вариант мне удобнее всего. Но я думаю, что TexturedAtlas, содержащий 8 разных вариантов нарезки базовой картинки будет занимать в 8 раз больше оперативной памяти, чем TexturedAtlas, содержащий только один вариант, я права?

б) Кроме того, если в моем случае я могу нарезать картинку вручную, может, мне стоит съэконимоить ресурсы и не создавать TexturedAtlas вообще?
в) Есть ли потом разница в работе с Image-ем, если он обрезан? Какие у него потом будут размеры - оригинальной картинки или урезанной? А что будет храниться в оперативной памяти: вся базовая картинка или только обрезанная?

г) Может, есть еще варианты, о которых я не подумала?

Заранее спасибо

Старый 29.01.2014, 17:35
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Не придется ничего "разрезать" в буквальном смысле.

1. Создаем текстуру, ширина и высота которой, будучи равны степени двойки, окажутся достаточными, чтобы вместить в себя исходное изображение, и рисуем в нее изображение (например в верхний левый угол).
Код AS3:
var texW:int =  Math.pow(2, Math.ceil(Math.log(myImage.width) / Math.LN2));
var texH:int =  Math.pow(2, Math.ceil(Math.log(myImage.height) / Math.LN2));
var texBMD:BitmapData = new BitmapData(texW, texH, true, 0);
    texBMD.draw(myImage);
var texture:Texture = new Texture.fromBitmap(texBMD);
2. находим uv-координаты правого нижнего угла изображения.
Код AS3:
var imgCornerU:Number = myImage.width / texW;
var imgCornerV:Number = myImage.height / texH;
3. В цикле создаем изображения, каждое из которых будет отображать свою "полосочку".
Код AS3:
var stripImages:Array = [];
var dU:Number = imgCornerU / numStrips;
for (var i:int = 0; i < numStrips; i++)
{
    var image:Image = new Image(texture);
        // Если не путаю порядок вершин, то так:
        image.setTexCoordsTo(0, dU * i, 0);
        image.setTexCoordsTo(1, dU * (i + 1), 0);
        image.setTexCoordsTo(2, dU * i, imgCornerV);
        image.setTexCoordsTo(3, dU * (i + 1), imgCornerV);
    stripImages[i] = image;
}
Писал все прямо тут, работоспособность кода в таком виде не проверял, но суть как бы вот.
__________________
Поймай яблоко 2!

Старый 29.01.2014, 23:41
olkina вне форума Посмотреть профиль Отправить личное сообщение для olkina Найти все сообщения от olkina
  № 3  
Ответить с цитированием
olkina
 
Аватар для olkina

Регистрация: Apr 2004
Адрес: Ramat Gan, Israel
Сообщений: 30
Спасибо огромное!

И размеры полосок будут (myImage.width / numStrips) или myImage.width?

Старый 30.01.2014, 00:31
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от olkina Посмотреть сообщение
myImage.width / numStrips
Именно так.
__________________
Поймай яблоко 2!

Старый 30.01.2014, 10:33
olkina вне форума Посмотреть профиль Отправить личное сообщение для olkina Найти все сообщения от olkina
  № 5  
Ответить с цитированием
olkina
 
Аватар для olkina

Регистрация: Apr 2004
Адрес: Ramat Gan, Israel
Сообщений: 30
Спасибо. Пошла воплощать

Старый 30.01.2014, 11:49
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 6  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
И все же насчет ширины могу ошибаться. Возможно там же в цикле после инициации текстурных координат нужно будет еще вызвать reajustSize()
__________________
Поймай яблоко 2!

Старый 30.01.2014, 12:10
olkina вне форума Посмотреть профиль Отправить личное сообщение для olkina Найти все сообщения от olkina
  № 7  
Ответить с цитированием
olkina
 
Аватар для olkina

Регистрация: Apr 2004
Адрес: Ramat Gan, Israel
Сообщений: 30
Окей, значит, проверим по ходу.

У меня, если можно, еще один делитанстцкий вопрос: я должна поддерживать две резолюции: ширину экрана 2048 и 1024. На данный момент мои фоны по 1024 пикселя в ширину, растянутые на 2048 они выглядят вполне прилично, график доволен и не хочет их увеличивать.

Как мне растяннуть их наиболее экономичным способом? Перед началом всей этой процедуры сделать исходному Image scale, и тогда, когда я буду делать new Texture.fromBitmap(texBMD), у меня будет текстура 2048 пикселей в ширину?

Еще раз спасибо

Старый 30.01.2014, 12:40
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 8  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
У нас принято в одной теме обсуждать один вопрос. Нужно стараться придерживаться )
Вопрос разработки на Starling под разные экраны рассмотрен здесь (англ.)
__________________
Поймай яблоко 2!

Старый 30.01.2014, 16:05
olkina вне форума Посмотреть профиль Отправить личное сообщение для olkina Найти все сообщения от olkina
  № 9  
Ответить с цитированием
olkina
 
Аватар для olkina

Регистрация: Apr 2004
Адрес: Ramat Gan, Israel
Сообщений: 30
Извините, буду иметь в виду.

Спасибо за линк, ушла учить матчасть

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

Теги
setTexCoords , Starling , texture , TexturedAtlas
Опции темы
Опции просмотра

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

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


 


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


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