Mikle
Что-то я опять трою
есть спрайт куда все будет рисоваться
SpriteOutput
допустим
и есть два спрайта sprite1 просто картинка, sprite2 картинка с альфой
я рисую так
SpriteOutput.Draw(SpriteNoAlpha,0,0)
SpriteOutput.Draw(SpriteAlpha,0,0,Op.AlphaBlend)
вывожу spriteoutput и получается дичь, либо первый спрайт (который типа бэкграунд) рисуется поверх, а того не видно или он позади, либо еще чтото
сделал вот так
SpriteOutput.Op = Op.Paint
SpriteOutput.ClearBuffer(ARGB(255,255,0,0))
SpriteOutput.Draw(SpriteNoAlpha,0,0)
SpriteOutput.Draw(SpriteAlpha,0,0,AplhaBlend)
SpriteOutput.PaintToDevice(Hdc)
и результат просто красный квадрат.
ничего понять не могу...
ps
я помню, что там была проблема что спрайт портил альфу
но не уверен в этом ли дело сейчас
вроде вот недавно рисовал и нормально все было, что там было по другому не уверен
но именно базово, что спрайт клеарится цветом, а поверх рисуется другой спрайт с альфой, и почему-то показывается только цвет которым клеарил...
SilentPrayerCG
> SpriteOutput.Op = Op.Paint
Эта строка не нужна - имеет смысл только Op источников.
> SpriteOutput.ClearBuffer(ARGB(255,255,0,0))
Эта тоже не нужна - всё равно SpriteNoAlpha всё затрёт, в том числе альфаканал.
Но всё должно работать и так, дай проект с файлами картинок, посмотрю.
Mikle
я забыл, а как должно быть вообще?
если я хочу сделать спрайт цвета А
и нарисовать спрайт Б с альфой на него?
и потом все это вывести в буфер который уже нарисовать на девайс?
щас я попробую разобраться в чем там дело было... но почему-то рисовался только цвет которым я клеарил
SilentPrayerCG
> а как должно быть вообще?
SprBack.ClearBuffer(ARGB(255, 255, 0, 0)) SprBack.Draw(SprAlpha, 0, 0, Op.AlphaBlend) SprBack.PaintToDevice(hDC)
Mikle
Сорян, я вчера (сегодня уже получается) до 3ех ночи кодил, и уже голова видимо спеклась
я в начале главному буферу присвоил спрайт который хотел вывести в начале для превью (временно), а потом этот же спрайт начал изменять
надо было не присваивать а через конструктор новый создать в нем
они связались вместе и началась ерунда
Мой косяк. Ну вот и хорошо, а то я уже боялся, какой-нибудь глюк случился не отлавливаемый.
а вот насчёт засарение альфы, получается, если спрайт 1 не прозрачный, я рисую на него спрайт 2 - прозрачный, спрайт 1 получает его альфу так?, если если я спрайт 1 нарисую на спрайт 0 с блендом, то он получиться нарисуется с альфой от спрайта 2 так?
SilentPrayerCG
Сейчас AlphaBlend уже не портит альфу, какая была - такая и останется.
Mikle
Понял, это хорошо.
Привет! у меня несколько недель тоже подобные ошибки начались и при полном отключении в векторном движке обращений к sr2d ошибки пропадали. Ранее всё работало ровно но недавно сначала при изменении размера экрана вылетало а потом по нарастающей и просто при движении изображения. при ресайзе делался Init с новыми размерами спрайта экраного буфера - сам Init норм, а вот при обращении в асм процедуру спрайта вылет (причём в последний месяц не менял движок - просто пользовался при однотипной задаче). попробывал жёстко блокировать весь движок на момент ресайза, вдруг успевает обращение пройти до завершения процедуры Init - помогло ненадолго.
Одним словом на РАССИНХРОН инициализации массива пикселей с обращением к этому массиву похоже.
Начинаю переписывать движок на раздельные буферы изображения (ранее был спрайт рисования и спрайт вывода изображения куда копировался результат из рисовального спрайта - сделал так для упрощения вывода интерфейса поверх изображения). Ну а теперь буду делать два раздельных спрайта рисования с чередованием использования чтобы реинициализация размера спрайта делалась автоматом на неиспользуемый спрайт, а потом следующий кадр в нём рисовать и соответствено Init уже на другой - отпишусь по результату, но не ранее пары недель
P.S. ошибки как в теме из которой обсуждение перешло в эту ветку https://gamedev.ru/community/bycircle/forum/?id=138790&page=45
написал уже тут так как в теме источнике разговор затих
упс забыл спросить - получилось ли разобраться в обсуждаемых ошибках из темы источника, а то я тут нагородю огород. (хотя всё равно переделаю движок для спокойствия)
Neirapik
> написал уже тут так как в теме источнике разговор затих
Тут обсуждаем x64 версию, если у тебя задействована x86, то лучше поднять старую тему.
Neirapik
> РАССИНХРОН
Потоки используются, или всё в один поток?
Neirapik
> получилось ли разобраться в обсуждаемых ошибках из темы источника
Каких именно? Последнее время ошибки были только в x64.
поток один, но ресайз асинхронен и создаёт ненадолго отдельный поток, и да х86
мне начинает казаться что ошибка не в sr2d а в каком-то изменении порядка выделения памяти под массив что выполняется в конечном счёте системой!
Neirapik
> ресайз асинхронен и создаёт ненадолго отдельный поток
Вот тут и надо дождаться завершения работы потока.
>Вот тут и надо дождаться завершения работы потока.
это я строго учёл когда всё началось и ненадолго помогло и самое главное с полгода не разу не было такого (хотя было предчувствие на подобное) началось недавно и sr2d я не обновлял с год где-то
в общем по итогу оно само пришло не виноватая я (хи) - смысл именно в том что нечего не менялось в движке и в способе его использования и всё работало спокойно и ровно - отсюда и подозрение что изменилось что то вне моего проекта!