2014-02-08 2 views
1

(я использую FlashDevelop, чтобы написать это в AS3)Слишком много спрайтов вызывая нижние спрайты не рисовать

Делаю Pikmin вдохновленного 2D платформер, так что, естественно, у меня есть очень большое количество спрайтов на экран сразу. Кажется, что происходит, так это то, что, если на вершине друг друга больше 23 спрайтов, все, что ниже их, не нарисовано.

Here's a picture проблемы. Что вы видите: серый шар - это стопка из 22 спрайтов. Синий фон - спрайт. Парень-пастух - это спрайт. Левый - всего 23 спрайта, а прямо у пастуха - всего 24. Как вы можете видеть, синий в этом перекрытии (который является нижним слоем) не рисует, несмотря на альфу всех пикселей выше он равен нулю.

Это просто вещь с Flash, с которой мне приходится мириться, или я делаю что-то неправильно?

Редактировать: Here's my code Извините, у меня недостаточно репутаций, чтобы опубликовать его как несколько ссылок. Выбейте себя.

Second Edit: Я применил весь свой код и просто добавил много простых спрайтов, и проблема все равно произошла точно в 23 Sprites. Мои подозрения подтверждаются тем, что Flash не может справиться с этими многократными дублирующими Sprites. Я собираюсь поиграть с ним и попытаюсь найти обходное решение.

+0

Это определенно не ошибка со вспышкой и что-то на вашем конце. К сожалению, вы не опубликовали никакого кода, поэтому я не могу дать вам ответ на то, что он. –

+0

Я предполагаю расширениями, которые вы имеете в виду наследование (и все они будут разными), я достаточно опытна и могу сказать, что могу нарисовать тысячи объектов отображения и не иметь этой проблемы. Поэтому публикация некоторого кода была бы полезна. –

+0

Это потому, что эти объекты представляют собой комбинацию нескольких сотен строк кода из трех разных расширений, и будет очень сложно определить общую проблему. Лучше всего найти кого-то, кто испытал это в прошлом, и есть идея, с чего начать искать. Редактировать: Кроме того, объекты не взаимодействуют друг с другом каким-либо образом, поэтому, на мой взгляд, более вероятно, что это будет связано с тем, как Flash обрабатывает отдельные растровые изображения/спрайты, чем ошибка в чем-то, что я сделал , Второе редактирование: Да, extension == inheritance –

ответ

2

Видимо, вы используете не прозрачные растровые изображения повсюду. Скорее всего, ваш лист Wanderer имеет белый фон в определенном кадре, который нарисован вместо синего, и вы ошибочно обвиняете Flash-движок в том, что он не рисует что-либо под непрозрачным растровым изображением.

Следующая: В GameObject.SetSkin() функции у вас есть Skin = new Bitmap(skindata);, вы можете сделать то же самое, присвоив bitmapData свойство Skin новое значение (если оно когда-либо изменения, как вы делаете copyPixels()), так что вы можете свободно отказаться от этого, назначить Skin один раз в конструкторе, а затем перейдите с копией.

Следующий: У вас есть совершенно новый объект Bitmap с полным скином, назначенным каждому из GameObject, независимо от того, был ли он тем же классом с существующими объектами или нет. В то время как у вас мало объектов, это может сработать, но как только вы нажмете определенное количество из них, вам нужно будет сократить использование памяти или риск сбоя Flash. Вы можете использовать public static var SkinSheet:Bitmap, а в конструкторе вы делаете if (!SkinSheet) SkinSheet=new ProperSkinSheet();, где ProperSkinSheet - это скин для текущего класса, будь то Wanderer, Player, Tile и т. Д. Это заставит ваши несколько объектов одного и того же класса использовать один и тот же лист кожи, использование памяти для вашего приложения.

Надеюсь, это немного поможет.

+0

Если у Странника был белый bg в определенном кадре (что я на 99% уверен, что это неверно, так как это всего лишь 5 кадров), это не объяснит полубеловое или как оно всегда появляется на такое же количество объектов. (Я тестировал его, и он делает то же самое с объектами Player. Я исправил строку в 'GameObject.SetSkin()'. Спасибо за подсказку. Что касается создания статического текста в обложке, я не уверен, насколько хорошо который будет работать с несколькими типами объектов, наследующими от одного класса.Я сейчас борюсь с его реализацией. –

+0

Теперь, просматривая код, я думаю, что @Vesper находится на правильном пути с использованием copyPixels и не устанавливает его с прозрачностью. У меня скоро будет ответ. –

+0

Поэтому я не могу подтвердить это, не пропустив весь ваш проект, но я считаю, что вы должны попробовать это, если mergeAlpha установлен в true в 'copyPixels()'. В вашей текущей настройке каждый раз вы 'copyPixels()' Я не верю, что вы blitting на белом фоне, я думаю, что вы фактически очищаете пиксели позади него. Если вы хотите подтвердить эту область на самом деле пуст, попробуйте изменить цвет сцены или нанести какой-то цвет на сцену и посмотреть, все еще ли он белым. Я тестировал это локально с помощью собственных прозрачных текстур и добился аналогичного эффекта. –