Когда игрок теряет всю свою жизнь, я хочу, чтобы весь экран игры становился серым, но не прекращал обновление немедленно. Я также предпочел бы, чтобы он постепенно исчезал в оттенках серого, а не внезапно терял весь цвет. Все, что я нашел до сих пор, - это либо сделать снимок экрана и сделать его в оттенках серого, либо сделать специальную текстуру в оттенках серого. Есть ли способ изменить все игровое поле и все объекты в оттенках серого, не просматривая все?
Самый простой способ сделать это - создать для него шейдер (см. Код ниже). Нарисуйте все в цель рендеринга, затем используйте шейдер, чтобы нарисовать это в свой задний буфер
В записи кода вашей игры, когда игрок умирает, затем в последующих рендерах интерполируйте параметр шейдера между 1 (полный цвет) и 0 (полная шкала серого) в соответствии с CurrentTime-DeadTime / FadeTime
Некоторое время назад я конвертировал rgb в серый, но не смог найти надежный источник, поэтому я просто использовал 1.0 / 3,1.0 / 3,1.0 / 3 ... Можете ли вы предоставить источник для числовых констант 0.2,0.59,0.11?
Тревор Бойд Смит
Я пытался найти, откуда я взял код, но не смог его найти. Вот страница разработчика Valve, в которой используются разные (но примерно одинаковые) значения (0,222, 0,707, 0,071).
я могу подтвердить, что этот шейдер работал для меня в XNA 4.0
Roboblob
0
РЕДАКТИРОВАТЬ
Подумав об этом, если вы не наносите оттенок на что-либо, а используете исходные цвета графики, вы можете просто иметь (как я утверждаю ниже) все ваши цвета нарисованных объектов, установленные в объявленную переменную Color, установленную в белый цвет. (Color NoTint = Color.White;), а затем Lerp, что, если игрок живет, равен нулю. Каждый объект, нарисованный с помощью NoTint Color, будет медленно меняться (в соответствии с вашей частотой интерполяции, указанной ниже) до того, к чему вы его привязываете.
Однако, если у вас разные оттенки на разных объектах, цикл foreach может сработать.
Конец Править
В моих ограниченных знаниях я бы попробовал это: Объявите цвета, которые вы используете при рисовании конкретных объектов, напр. Color catColor = Color.Brown, затем добавьте все цвета ваших игр в список.
publicstaticColor catColor =Color.Brown;List<Color> colorList =newList<Color>(){ catColor };// and other colorsfloat interpolation =0f;float interpolationRate =.01f;...if(playerLives ==0){
interpolation += interpolationRate;if(interpolation >=1){interpolation =1;}foreach(Color c in colorList){Color.Lerp(c,Color.Gray, interpolation);}}
Вы можете даже сделать это для элементов, которые вы рисуете без оттенка, и Lerp Color.White к Color.Gray. (назовите это что-то вроде Color NoTint = Color.White и поместите это на все ваши нарисованные объекты)
Вероятно, есть лучший способ, но я надеюсь, что это поможет!
-1 Это сделает весь экран одним сплошным цветом, а не станет серым. Оттенки серого измеряют цвет по его яркости (цвет воспринимает разные цвета как имеющие разные яркости), он не просто на полпути между цветом и серым (который все еще имеет цвет).
doppelgreener
Превосходно. Я надеюсь, что кто-то еще учится на этом, как я. Благодарность!
РЕДАКТИРОВАТЬ
Подумав об этом, если вы не наносите оттенок на что-либо, а используете исходные цвета графики, вы можете просто иметь (как я утверждаю ниже) все ваши цвета нарисованных объектов, установленные в объявленную переменную Color, установленную в белый цвет. (Color NoTint = Color.White;), а затем Lerp, что, если игрок живет, равен нулю. Каждый объект, нарисованный с помощью NoTint Color, будет медленно меняться (в соответствии с вашей частотой интерполяции, указанной ниже) до того, к чему вы его привязываете.
Однако, если у вас разные оттенки на разных объектах, цикл foreach может сработать.
Конец Править
В моих ограниченных знаниях я бы попробовал это: Объявите цвета, которые вы используете при рисовании конкретных объектов, напр. Color catColor = Color.Brown, затем добавьте все цвета ваших игр в список.
Вы можете даже сделать это для элементов, которые вы рисуете без оттенка, и Lerp Color.White к Color.Gray. (назовите это что-то вроде Color NoTint = Color.White и поместите это на все ваши нарисованные объекты)
Вероятно, есть лучший способ, но я надеюсь, что это поможет!
источник