Форум 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=169200)

flax4Noob 29.09.2011 20:42

Один большой спрайт или много маленьких?
 
Вот я два месяца ковыряю АС3, флеш и флекс. И все это на примере мелкой игры крестики-нолики, которая позволяет проработать все мелочи. И вот "оно" запрофилировалось первый раз, и что я узрел.

У меня "поле" из квадратнх спрайтов. К каждому я привязал "битмап" для фона (чтобы на нем динамически рисовать, ибо сплошная заливка скучна). К большинству клеток привязываются спрайты "крестика" или "нолика". Которые анимируются.

По объему занимаемой памяти клетки у меня занимают столько же памяти, сколько и "битмапы" к ним привязаные. Основное назначение "клеток" - это чтобы повесить на нее обработчик кнопки (подсвечивать клетку). И вот теперь я задумываюсь: можно же сделать один большой битмап, и рисовать на нем всё (и крестики, и подложку... придется только рассчитывать куда мышка ткнулась. И над какой клеткой она сейчас находится, чтбобы подсвечивать.

Вопрос к тем, кто имел подобный опыт - на сколько оно будет "отваливаться" при масштабируемости? И вообще, может зря я так критично к модели с кучей клеток-спрайтов? Кстати, я сейчас столкнулся с проблемой "межклеточного взаимодействия" =) Ведь все клетки на разной "z"-высоте. И эффект, скажем, glow от крестика, вылезающий за пределы клетки периодически скрывается "за" соседними спрайтами. Воть такая "думка". Поделитесь опытом.

tofflife 30.09.2011 01:30

Вообще, рисовать на один битмап - идея хорошая. Производительность повысить должно, так как Flash Player обсчитывает кажлдый элемент в списке отображения поотдельности. И пусть у тебя будет хоть размером с пиксел,но 10000 объктов, тормозить будет жутко. Ваш способ хорош, но есть большое но. Это событие MouseMove - оно будет портить всю малину, поскольку придеться руками считать координаты. На мой взгляд, если размер поля не будет превышать 8x8, а каждый квадратик будет размером, скажем не более 50x50, то для производительности вполне сгодиться. Ну а если больше... Что ж, рисуйте битмап, а вместо mouseMove используйте по таймеру, скажем раз в 100 миллисекунд позитию курсора из stage.mouseX

По поводу высоты. Перед эффектов вызывайте

children.parent.setChildIndex(children, children.parent.numChildren-1);

Естественно, children.parent красивее сохранить в отдельную переменную и воткнуть пару проверок на null.

flax4Noob 30.09.2011 03:37

В as3 нет методов "рисования" на BitmapData? я нашел только setPixel32 оО
Я так понимаю, что всю графику мне придется делать "Спрайтами" и копировать из подгруженных картинок?
=( Чота не по феншую.

ProxyGreen 30.09.2011 03:46

Для "рисования" в BitmapData можно использовать методы draw() или copyPixels().

flax4Noob 30.09.2011 04:11

Код AS3:

                        var t:Sprite = new Sprite();
                        this.addChild(t);
 
                        var n:Graphics = t.graphics;
 
                        n.beginFill(0xffffff,1);
                        n.lineStyle(1, 0x000000);
                        n.drawRect(0, 0, 31, 31);
                        var tempBitmap:BitmapData = new BitmapData(32,32,false,0x000000);
 
                        tempBitmap.draw(t);
 
                        this.removeChild(t);

Феншуйствую! =)

GBee 30.09.2011 08:15

Можно и в один graphics рисовать.

ProxyGreen 30.09.2011 15:55

Если копировать данные напрямую из "t", this.addChild(t) и this.addChild(t) не требуются. Добавление элемента в контейнер влияет на "графические данные" контейнера, а не элемента.

flax4Noob 01.10.2011 03:03

Все просто суперски, и действительно прилично ускоряет работу всей флешки в целом. (Если не тупо перерисовывать все при каждом фрейме, а только обновлять изменения) :yahoo:

Итак, вот какая засада обозначилась. Если кто-то читал стартовый топик, то он помнит, что в исходной флешке у меня "поля", и к ним "прицеплены" Спрайты крестиков/ноликов и проч. Как я сейчас добавляю это дело на сцену:

На Сцене создан Bitmap, по всему размеру поля.
При обработке "Энтерфрейма" в цикле пробегаем все клетки. Если в клетке были изменения, то:
Код AS3:

tempBitmap.draw(cells[i][j]);
plainBitmap.copyPixels(tempBitmap,tempBitmap.rect,new Point(cellSize*i, cellSize*j));

Ну, локи и таймеры я заскипал. Все работает отлично, tempBitmap по размеру равна клетке и вообще просто эйфория от всего этого. Пока в одной из Клеток не появляется Спрайт вылезающий за пределы своего квадрата. Он, разумеется, не влезает в tempBitmap и, соответственно, выглядит крайне печально.

Если увеличить размеры tempBitmap, то это не решает проблемы "невлезания" спрайтов, части которых находятся в "области отрицательных координат" чтоль... не знаю как понятнее объяснить :) Ну и плюс к этому появляется проблема с позиционированием такого "кривого по размерам" битмапа на основной карте. Но это мелочи.

Как отDrawить спрайт, который рисует в отрицательные координаты?

Код AS3:

drawCircle(0, 0, 10); //Например.

Рисует 1/4 круга :eek:

Добавлено через 1 минуту
Пока что раскуриваю "Скрол" битмапа.

GBee 01.10.2011 11:55

Зачем вам ентерфрейм в пошаговой игре?

Цитата:

Рисует 1/4 круга
Спрайт подвиньте в координаты ненулевые.

flax4Noob 01.10.2011 19:44

Цитата:

Зачем вам ентерфрейм в пошаговой игре?
М... анимация фона? Анимация клеток при наведении мышки? Крестики, например, "темные" и затемняют вокруг себя клетки. А нолики светлые. С эффектом Glow, беленьким. Эффект меняется с течением времени как бы пульсируя. Очень няшно.


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

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