⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canvas.cs

📁 运用directX完成的坦克游戏雏形
💻 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 + -