Si utilizo el siguiente¿Hay un valor alfa que hace que el blanco se vuelva invisible?
for(int i = 255; i > 0; i--)
{
Color transparentBlack = new Color(0, 0, 0, i);
}
tengo el efecto del objeto usando este color para dibujar con ir de negro a un gris claro y luego invisible cuando el valor alfa tiende a cero. Sin embargo si comienzo con un valor de blanco:
new Color(255, 255, 255, i);
Los objetos nunca se vuelve invisible y sólo se queda en blanco. También he notado que si uso un valor que es un poco más claro que el negro (digamos 50, 50, 50) el dibujo va de Oscuro, a invisible, a Blanco.
Supongo que simplemente no entiendo cómo funciona la mezcla alfa de mezcla, pero ¿hay alguna manera de hacer que el color blanco se desvanezca a la translucidez?
Editar: El fondo estoy dibujando en es Color.CornflowerBlue (100149237255)
Editar: Muestra el programa XNA reproducir la explicación. Usar; crear un nuevo proyecto XNA Game Studio 4.0 - Windows juego (4.0), lo llaman AlphaBlendTest - & En el proyecto contenido de añadir un nuevo SpriteFont y llamarlo TestFont
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace AlphaBlendTest
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpriteFont font;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
font = Content.Load<SpriteFont>("testfont");
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
//spriteBatch.Draw(tR, new Rectangle(100, 100, 100, 100), Color.Red);
Vector2 v2 = new Vector2(0, 0);
spriteBatch.DrawString(font, "Test - White", v2, Color.White);
v2.Y = v2.Y + 50;
spriteBatch.DrawString(font, "Test - Black", v2, Color.Black);
v2.Y = v2.Y + 50;
Color BlackTransparent = new Color(0, 0, 0, 0);
spriteBatch.DrawString(font, "Test - Black Transparent", v2, BlackTransparent);
v2.Y = v2.Y + 50;
Color WhiteTransparent = new Color(255, 255, 255, 0);
spriteBatch.DrawString(font, "Test - White Transparent", v2, WhiteTransparent);
spriteBatch.End();
base.Draw(gameTime);
}
}
}
Editar: Esta es la imagen de este código dibuja:
Editar: A uno de los comentarios le preocupa que se trate de una "característica" de Windows relacionada con el texto. Usé el texto como un ejemplo para mantener el programa de demostración pequeño; probar con una imagen da el mismo resultado.
Para añadir la caja cuadrada en la que el programa de demostración; cree una imagen PNG cuadrada en blanco y agréguela al directorio de contenido (use los valores predeterminados para la canalización de contenido). A continuación, añadir esto a la clase:
Texture2D tWhiteBox;
Añadir esto en el método de carga:
tWhiteBox = Content.Load<Texture2D>("whitebox");
Luego, en el sorteo, agregue el siguiente debajo de las otras declaraciones de sorteo:
v2.Y = v2.Y + 50;
spriteBatch.Draw(tWhiteBox, v2, WhiteTransparent);
Ahora que tienes mejores respuestas, estoy tentado de eliminar las mías ... pero solo para comprobar, ¿esto sucede con objetos * que no sean de texto * también? –
Sí; Acabo de utilizar Draw String en el ejemplo para no tener que cargar una textura para el programa de prueba simple ;-) Para probar esto, utilicé una imagen que es solo un cuadro blanco y luego la dibujé, usando los diferentes colores en la declaración de dibujo cambiará su color. –