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

📄 d3dfont.cs

📁 Beginning C# Game Programming 的源代码
💻 CS
📖 第 1 页 / 共 2 页
字号:

	/// <summary>
	/// Draw some text on the screen
	/// </summary>
	public void DrawText(float xpos, float ypos, Color color, string text, RenderFlags flags) {
		if (text == null)
			return;

		// Setup renderstate
		savedStateBlock.Capture();
		drawTextStateBlock.Apply();
		device.SetTexture(0, fontTexture);
		device.VertexFormat = CustomVertex.TransformedColoredTextured.Format;
		device.PixelShader = null;
		device.SetStreamSource(0, vertexBuffer, 0);

		// Set filter states
		if ((flags & RenderFlags.Filtered) != 0) {
			samplerState0.MinFilter = TextureFilter.Linear;
			samplerState0.MagFilter = TextureFilter.Linear;
		}

		// Adjust for character spacing
		xpos -= spacingPerChar;
		float fStartX = xpos;

		// Fill vertex buffer
		int iv = 0;
		int dwNumTriangles = 0;

		foreach (char c in text) {
			if (c == '\n') {
				xpos = fStartX;
				ypos += (textureCoords[0,3]-textureCoords[0,1])*textureHeight;
			}

			if ((c-32) < 0 || (c-32) >= 128-32)
				continue;

			float tx1 = textureCoords[c-32,0];
			float ty1 = textureCoords[c-32,1];
			float tx2 = textureCoords[c-32,2];
			float ty2 = textureCoords[c-32,3];

			float w = (tx2-tx1) *  textureWidth / textureScale;
			float h = (ty2-ty1) * textureHeight / textureScale;

			int intColor = color.ToArgb();
			if (c != ' ') {
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+h-0.5f,0.9f,1.0f), intColor, tx1, ty2);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,0.9f,1.0f), intColor, tx1, ty1);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,0.9f,1.0f), intColor, tx2, ty2);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+0-0.5f,0.9f,1.0f), intColor, tx2, ty1);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,0.9f,1.0f), intColor, tx2, ty2);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,0.9f,1.0f), intColor, tx1, ty1);
				dwNumTriangles += 2;

				if (dwNumTriangles*3 > (MaxNumfontVertices-6)) {
					// Set the data for the vertexbuffer
					vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
					device.DrawPrimitives(PrimitiveType.TriangleList, 0, dwNumTriangles);
					dwNumTriangles = 0;
					iv = 0;
				}
			}

			xpos += w - (2 * spacingPerChar);
		}

		// Set the data for the vertex buffer
		vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
		if (dwNumTriangles > 0)
			device.DrawPrimitives(PrimitiveType.TriangleList, 0, dwNumTriangles);

		// Restore the modified renderstates
		savedStateBlock.Apply();
	}




	/// <summary>
	/// Draws scaled 2D text.  Note that x and y are in viewport coordinates
	/// (ranging from -1 to +1).  fXScale and fYScale are the size fraction 
	/// relative to the entire viewport.  For example, a fXScale of 0.25 is
	/// 1/8th of the screen width.  This allows you to output text at a fixed
	/// fraction of the viewport, even if the screen or window size changes.
	/// </summary>
	public void DrawTextScaled(float x, float y, float z, 
		float fXScale, float fYScale, 
		System.Drawing.Color color,
		string text, RenderFlags flags) {
		if (device == null)
			throw new System.ArgumentNullException();

		// Set up renderstate
		savedStateBlock.Capture();
		drawTextStateBlock.Apply();
		device.VertexFormat = CustomVertex.TransformedColoredTextured.Format;
		device.PixelShader = null;
		device.SetStreamSource(0, vertexBuffer, 0);

		// Set filter states
		if ((flags & RenderFlags.Filtered) != 0) {
			samplerState0.MinFilter = TextureFilter.Linear;
			samplerState0.MagFilter = TextureFilter.Linear;
		}

		Viewport vp = device.Viewport;
		float xpos = (x+1.0f)*vp.Width/2;
		float ypos = (y+1.0f)*vp.Height/2;
		float sz = z;
		float rhw = 1.0f;
		float fLineHeight = (textureCoords[0,3] - textureCoords[0,1]) * textureHeight;

		// Adjust for character spacing
		xpos -= spacingPerChar * (fXScale*vp.Height)/fLineHeight;
		float fStartX = xpos;

		// Fill vertex buffer
		int numTriangles = 0;
		int realColor = color.ToArgb();
		int iv = 0;

		foreach (char c in text) {
			if (c == '\n') {
				xpos  = fStartX;
				ypos += fYScale*vp.Height;
			}

			if ((c-32) < 0 || (c-32) >= 128-32)
				continue;

			float tx1 = textureCoords[c-32,0];
			float ty1 = textureCoords[c-32,1];
			float tx2 = textureCoords[c-32,2];
			float ty2 = textureCoords[c-32,3];

			float w = (tx2-tx1)*textureWidth;
			float h = (ty2-ty1)*textureHeight;

			w *= (fXScale*vp.Height)/fLineHeight;
			h *= (fYScale*vp.Height)/fLineHeight;

			if (c != ' ') {
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+h-0.5f,sz,rhw), realColor, tx1, ty2);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,sz,rhw), realColor, tx1, ty1);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,sz,rhw), realColor, tx2, ty2);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+0-0.5f,sz,rhw), realColor, tx2, ty1);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,sz,rhw), realColor, tx2, ty2);
				fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,sz,rhw), realColor, tx1, ty1);
				numTriangles += 2;

				if (numTriangles*3 > (MaxNumfontVertices-6)) {
					// Unlock, render, and relock the vertex buffer
					vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
					device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);
					numTriangles = 0;
					iv = 0;
				}
			}

			xpos += w - (2 * spacingPerChar) * (fXScale*vp.Height)/fLineHeight;
		}

		// Unlock and render the vertex buffer
		vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
		if (numTriangles > 0)
			device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);

		// Restore the modified renderstates
		savedStateBlock.Apply();
	}




	/// <summary>
	/// Draws scaled 2D text.  Note that x and y are in viewport coordinates
	/// (ranging from -1 to +1).  fXScale and fYScale are the size fraction 
	/// relative to the entire viewport.  For example, a fXScale of 0.25 is
	/// 1/8th of the screen width.  This allows you to output text at a fixed
	/// fraction of the viewport, even if the screen or window size changes.
	/// </summary>
	public void DrawTextScaled(float x, float y, float z, 
		float fXScale, float fYScale, 
		System.Drawing.Color color,
		string text) {
		this.DrawTextScaled(x,y,z,fXScale, fYScale, color, text, 0);
	}




	/// <summary>
	/// Renders 3D text
	/// </summary>
	public void Render3DText(string text, RenderFlags flags) {
		if (device == null)
			throw new System.ArgumentNullException();

		// Set up renderstate
		savedStateBlock.Capture();
		drawTextStateBlock.Apply();
		device.VertexFormat = CustomVertex.PositionNormalTextured.Format;
		device.PixelShader = null;
		device.SetStreamSource(0, vertexBuffer, 0, VertexInformation.GetFormatSize(CustomVertex.PositionNormalTextured.Format));

		// Set filter states
		if ((flags & RenderFlags.Filtered) != 0) {
			samplerState0.MinFilter = TextureFilter.Linear;
			samplerState0.MagFilter = TextureFilter.Linear;
		}

		// Position for each text element
		float x = 0.0f;
		float y = 0.0f;

		// Center the text block at the origin
		if ((flags & RenderFlags.Centered) != 0) {
			System.Drawing.SizeF sz = GetTextExtent(text);
			x = -(((float)sz.Width)/10.0f)/2.0f;
			y = -(((float)sz.Height)/10.0f)/2.0f;
		}

		// Turn off culling for two-sided text
		if ((flags & RenderFlags.TwoSided) != 0)
			renderState.CullMode = Cull.None;

		// Adjust for character spacing
		x -= spacingPerChar / 10.0f;
		float fStartX = x;

		// Fill vertex buffer
		GraphicsStream strm = vertexBuffer.Lock(0, 0, LockFlags.Discard);
		int numTriangles = 0;

		foreach (char c in text) {
			if (c == '\n') {
				x = fStartX;
				y -= (textureCoords[0,3]-textureCoords[0,1])*textureHeight/10.0f;
			}

			if ((c-32) < 0 || (c-32) >= 128-32)
				continue;

			float tx1 = textureCoords[c-32,0];
			float ty1 = textureCoords[c-32,1];
			float tx2 = textureCoords[c-32,2];
			float ty2 = textureCoords[c-32,3];

			float w = (tx2-tx1) * textureWidth  / (10.0f * textureScale);
			float h = (ty2-ty1) * textureHeight / (10.0f * textureScale);

			if (c != ' ') {
				strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+0,y+0,0), new Vector3(0,0,-1), tx1, ty2));
				strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+0,y+h,0), new Vector3(0,0,-1), tx1, ty1));
				strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+w,y+0,0), new Vector3(0,0,-1), tx2, ty2));
				strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+w,y+h,0), new Vector3(0,0,-1), tx2, ty1));
				strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+w,y+0,0), new Vector3(0,0,-1), tx2, ty2));
				strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+0,y+h,0), new Vector3(0,0,-1), tx1, ty1));
				numTriangles += 2;

				if (numTriangles*3 > (MaxNumfontVertices-6)) {
					// Unlock, render, and relock the vertex buffer
					vertexBuffer.Unlock();
					device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);
					strm = vertexBuffer.Lock(0, 0, LockFlags.Discard);
					numTriangles = 0;
				}
			}

			x += w - (2 * spacingPerChar) / 10.0f;
		}

		// Unlock and render the vertex buffer
		vertexBuffer.Unlock();
		if (numTriangles > 0)
			device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);

		// Restore the modified renderstates
		savedStateBlock.Apply();
	}




	/// <summary>
	/// Get the dimensions of a text string
	/// </summary>
	private System.Drawing.SizeF GetTextExtent(string text) {
		if (null == text || text == string.Empty)
			throw new System.ArgumentNullException();

		float fRowWidth  = 0.0f;
		float fRowHeight = (textureCoords[0,3]-textureCoords[0,1])*textureHeight;
		float fWidth     = 0.0f;
		float fHeight    = fRowHeight;

		foreach (char c in text) {
			if (c == '\n') {
				fRowWidth = 0.0f;
				fHeight  += fRowHeight;
			}

			if ((c-32) < 0 || (c-32) >= 128-32)
				continue;

			float tx1 = textureCoords[c-32,0];
			float tx2 = textureCoords[c-32,2];

			fRowWidth += (tx2-tx1)*textureWidth - 2*spacingPerChar;

			if (fRowWidth > fWidth)
				fWidth = fRowWidth;
		}

		return new System.Drawing.SizeF(fWidth, fHeight);
	}




	/// <summary>
	/// Cleanup any resources being used
	/// </summary>
	public void Dispose(object sender, EventArgs e) {
		if (systemFont != null)
			systemFont.Dispose();

		systemFont = null;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -