📄 canvas.cs
字号:
using System;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Microsoft.Samples.DirectX.UtilityToolkit;
using System.Drawing;
using System.Collections;
namespace TankGogogo.GameRenderer
{
/// <summary>
/// 32位ARGB画布
/// </summary>
public class Canvas:IDisposable
{
Texture tex;
SurfaceDescription desc;
int size=0;
/// <summary>
/// 新建一块画布,画布简单包装了一个用于直接画成象素点的托管的pool texture,
/// </summary>
/// <paramref name="device"/>当前D3D 设备</param>
/// <param name="targetWidth">画布宽</param>
/// <param name="targetHeight">画布高</param>
public Canvas(Device device,int targetWidth,int targetHeight)
{
if(!Manager.CheckDeviceFormat(device.CreationParameters.AdapterOrdinal,device.CreationParameters.DeviceType,
device.PresentationParameters.BackBufferFormat,Usage.None,ResourceType.Textures,Format.A8R8G8B8))
{
throw new ApplicationException("Canvas format is unsupported!!!");
}
//用单一层次创建一个托管的池纹理(pool texture)
tex=new Texture(device,targetWidth,targetHeight,1,Usage.None,Format.A8R8G8B8,Pool.Managed);
//获取画布的描述和尺寸
desc=tex.GetLevelDescription(0);
size=desc.Height*desc.Width;
}
/// <summary>
/// 给整块画布加锁
/// </summary>
/// <param name="Readonly">指定是否只读</param>
/// <returns>描述了被加锁区域的数组</returns>
public int[] Lock(bool Readonly)
{
LockFlags flags=LockFlags.None;
if(Readonly)
{
flags|=LockFlags.ReadOnly;
}
return tex.LockRectangle(typeof(int),0,flags,size) as int[];
}
/// <summary>
/// 给某一区域加锁
/// </summary>
/// <param name="ReadOnly">指定是否只读</param>
/// <param name="rect">指定需要加锁的区域</param>
/// <returns>包含被加锁块的数据的数组</returns>
public GraphicsStream LockToGrapicStream(bool ReadOnly,Rectangle rect)
{
LockFlags flags=LockFlags.None;
if(ReadOnly)
{
flags|=LockFlags.ReadOnly;
}
return tex.LockRectangle(0,rect,flags);
}
/// <summary>
/// 解锁
/// </summary>
public void Unlock()
{
tex.UnlockRectangle(0);
}
/// <summary>
/// 绘制画布
/// </summary>
/// <param name="sprite"></param>
/// <param name="sourceRect"></param>
/// <param name="destRect"></param>
/// <param name="color"></param>
public void Draw(Sprite sprite,Rectangle sourceRect,Rectangle destRect, Color color)
{
if(sourceRect==Rectangle.Empty) sourceRect=new Rectangle(0,0,desc.Width,desc.Height);
Matrix transform=Matrix.Scaling((float)sourceRect.Width/(float)destRect.Width,
(float)sourceRect.Height/(float)destRect.Height,1f);
sprite.Transform=transform;
Vector3 pos=new Vector3((float)destRect.X,(float)destRect.Y,0f);
sprite.Draw(tex,sourceRect,pos,Vector3.Empty,color);
}
/// <summary>
/// 画布宽度
/// </summary>
public int Width
{
get
{
return desc.Width;
}
}
/// <summary>
/// 画布高度
/// </summary>
public int Height
{
get
{
return desc.Height;
}
}
/// <summary>
/// 画布尺寸
/// </summary>
public int Size
{
get
{
return size;
}
}
#region IDisposable 成员
public void Dispose()
{
tex.Dispose();
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -