Вторник, 26 Ноября 2024, 10:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Обрезка спрайта
CmaujlukДата: Пятница, 15 Мая 2015, 18:59 | Сообщение # 1
участник
Сейчас нет на сайте
Всем привет!
Столкнулся с такой проблемкой, гугл помочь не смог.
Суть в чем, есть 2Dспрайт, например, кольца, можно каким либо способом вырезать из него кусок кодом?
Т.е. например если обрезать все что больше оси Х получим букву С
Если взять например все что выше оси y+3 то получим букву U, и т.д.
Или вообще сделать отверстия через каждые 10 пикселей.
С меня как всегда +.


Не жадный на плюсы.
Наши проекты:
Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft
Angry Bee Evolution - Эволюция с элементами кликера
Чего не хватает? - Викторина на логику"
AevienДата: Пятница, 15 Мая 2015, 19:12 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Этого добиться можно при помощи написания своего шейдера. Для этого нужно изучить документацию по их программированию. Понятно, что трудно, но направление я тебе дал точное. Успехов! smile
HardcoreCoderДата: Пятница, 15 Мая 2015, 19:33 | Сообщение # 3
частый гость
Сейчас нет на сайте
Программирую с нуля, без движков типа Юнити, так что не знаю че да как там :). Обрезка спрайтов называется Rect, когда программа вырезает часть картинки и выводит ее на экран. Так что ищи подобное для Юнити smile


SimpleMoscowGuy

С++ & C# programmer
PAWN scripter
Всегда буду рад вам помочь, обращайтесь.


Сообщение отредактировал HardcoreCoder - Пятница, 15 Мая 2015, 19:34
CmaujlukДата: Пятница, 15 Мая 2015, 19:44 | Сообщение # 4
участник
Сейчас нет на сайте

быстрый паинт.
Нужно именно прозрачный т.к. видимая часть будет тригером.
Похоже что Aevien прав, придется пилить шейдер.


Не жадный на плюсы.
Наши проекты:
Clicker Mine Mania 2 - Увлекательный кликер в стиле Minecraft
Angry Bee Evolution - Эволюция с элементами кликера
Чего не хватает? - Викторина на логику"


Сообщение отредактировал Cmaujluk - Пятница, 15 Мая 2015, 19:45
berilДата: Пятница, 15 Мая 2015, 23:26 | Сообщение # 5
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Как уже было сказано выше: шейдерами + маска. Смотри в сторону Transparent Cutout шейдеров



Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
TymonrДата: Суббота, 16 Мая 2015, 00:23 | Сообщение # 6
With OpenSource forever
Сейчас нет на сайте
Я в юнити, конечно, ничего не понимаю, но неужели в движке такого уровня нет функций типа rect() и системы tile(sprite) sheet'a?

Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах
berilДата: Суббота, 16 Мая 2015, 06:45 | Сообщение # 7
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Цитата Tymonr ()
Я в юнити, конечно, ничего не понимаю, но неужели в движке такого уровня нет функций типа rect() и системы tile(sprite) sheet'a?

Я так понимаю автору нужно обрезать не прямоугольную илли овальную область, а произвольную.




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
TymonrДата: Суббота, 16 Мая 2015, 10:35 | Сообщение # 8
With OpenSource forever
Сейчас нет на сайте
beril, а, да, извиняюсь, что-то я протупил.

Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах
D0NДата: Суббота, 18 Июля 2015, 06:29 | Сообщение # 9
был не раз
Сейчас нет на сайте
Всем привет!Собственно у меня примерно такая-же проблема, необходимо обрезать спрайт по маске.Полезной информации очень мало,
буквально по крупицам приходится собирать и сложить все это в одно целое у меня не получилось.Есть предположение, что нужно наложить
маску на текстуру, добавив альфа канал, либо с шейдером нужно как-то шаманить, однако все на уровне догадок.Может кто направить в правильное русло?
Куда дальше то плыть? smile


Сообщение отредактировал D0N - Суббота, 18 Июля 2015, 15:49
TymonrДата: Суббота, 18 Июля 2015, 08:22 | Сообщение # 10
With OpenSource forever
Сейчас нет на сайте
Оно, не?

Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах
D0NДата: Суббота, 18 Июля 2015, 16:01 | Сообщение # 11
был не раз
Сейчас нет на сайте
Цитата Tymonr ()
Оно, не?

Возможно, позже нужно будет потестить.А если стоит задача разделить один объект на несколько дочерних, причем срезы должны быть произвольные.
В этом случае так-же необходимо маскировать спрайт, создавая дочерние объекты, либо же проще юзать меши?
Например, как здесь реализовано - Sprite Slicer?


Сообщение отредактировал D0N - Суббота, 18 Июля 2015, 16:02
KamiRoninДата: Суббота, 18 Июля 2015, 16:43 | Сообщение # 12
почти ветеран
Сейчас нет на сайте
Версия 1 - просто отрезать:
Код


// создаем спрайт из исходного, с урезанным или тем же размером (Rect)
Sprite newSpr = Sprite.Create(OriginalSprite.sprite.texture, new Rect(startX, startY, width, height), new Vector2(0.5f, 0.5f), 100f);

// заменяем в оригинальном спрайте урезанный спрайт
OriginalSprite.sprite = newSpr;


где переменные startX, startY, width, height - задаются до этого участка согласно нужному расположению

Версия 2 - сложная модификация:
Код

// создаем текстуру для модификации...
Texture2D newTexture = new Texture2D(width, height);

Color newColor = Color.clear;
newTexture.SetPixel(x, y, newColor); <- тут в цикле по известным координатам (нужно посчитать отдельно) - стираем цвет

// создаем спрайт из исходного, с урезанным или тем же размером (Rect)
Sprite newSpr = Sprite.Create(newTexture, new Rect(startX, startY, width, height), new Vector2(0.5f, 0.5f), 100f);

// заменяем в оригинальном спрайте урезанный спрайт
OriginalSprite.sprite = newSpr;


все.


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Суббота, 18 Июля 2015, 16:45
D0NДата: Суббота, 18 Июля 2015, 18:28 | Сообщение # 13
был не раз
Сейчас нет на сайте
@KamiRonin, спасибо вторая версия подойдет, однако как это повлияет на производительность?
Все-таки циклически проверять каждый пиксель, по-моему не очень продуктивно, или это обычная практика в Unity?
KamiRoninДата: Суббота, 18 Июля 2015, 18:37 | Сообщение # 14
почти ветеран
Сейчас нет на сайте
Цитата D0N ()
однако как это повлияет на производительность?

на самом деле ожидается что будет это делаться не так часто.. т.е. отрисовал свое U или C и дальше не занимаешь этим процесс.
а так, доступ к элементам массива очень быстрый. вообще тормоза начинаются при большом размере исходной текстуры и очень частой перерисовке.
поэтому думаю это вполне оптимальный алгоритм при небольших спрайтах и рациональном режиме смены спрайтов.
быстрее только заготовить "алфавит" заранее и просто показывать другой спрайт. что обычно и делается wink


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг