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

📄 d3dfont.cs

📁 Game Engine Desing Direct X and C#.rar
💻 CS
📖 第 1 页 / 共 2 页
字号:
				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 );
		}
		catch
		{
		}
		finally
		{

			// 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();
    }
    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 + -