gpt4 book ai didi

c++ - 如何在场景中绘制文字?

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:55 26 4
gpt4 key购买 nike

我有一些很久以前从互联网上下载的代码,我想玩一下。

所以我提取了有趣的部分,创建了一个代理 d3d9.dll 并连接到一个游戏。

现在我有一个问题,因为我无法在这两个代码片段之间的绘图中找到差异,这决定了顶点是否必须在屏幕上或在游戏场景中绘制

(我的意思是,就像 - HUD 在屏幕上,您总是能看到它,而车辆在游戏场景中,当您转身时却看不到它)。

第一段是我要编辑的代码,我想让它在游戏场景中显示文本,而不是在屏幕上作为静态文本显示。

DLL中使用的代码是这样的:

float                   m_fTexCoords[224][4];

float CD3DFont::DrawLength ( const char *szText ) const
{
float len = 0.0f;
float sub = ( m_dwCreateFlags & FCR_BORDER ) ? 2.0f : 0.0f;

for ( const char *p = szText; *p; p++ )
{
int c = *(unsigned char *)p - 32;
if ( c >= 0 && c < 224 )
len += ( (m_fTexCoords[c][2] - m_fTexCoords[c][0]) * m_texWidth - sub ) - m_chrSpacing * 2;
}

return len;
}

HRESULT CD3DFont::Print ( float x, float y, DWORD color, const char *szText)
{
if ( !m_isReady )
return E_FAIL;

float strWidth = DrawLength( szText );

x -= (float)m_chrSpacing;

if ( FAILED(this->BeginRender()) )
return E_FAIL;

DWORD fvf;
m_pD3Ddev->GetFVF( &fvf );
m_pD3Ddev->SetFVF( D3DFVF_BITMAPFONT );
m_pD3Ddev->SetTexture( 0, m_pD3Dtex );
m_pD3Ddev->SetStreamSource( 0, m_pD3Dbuf, 0, sizeof(d3dvertex_s) );

while ( *szText )
{
UINT usedTriangles = 0;
d3dvertex_s *pVertex;

if ( FAILED(m_pD3Dbuf->Lock(0, 0, (void **) &pVertex, D3DLOCK_DISCARD)) )
{
m_pD3Ddev->SetFVF( fvf );
this->EndRender();
return E_FAIL;
}


for ( ; *szText; szText++ )
{
int c = *(unsigned char *)szText - 32;
if ( !(c >= 0 && c < 224) )
continue;

float tx1 = m_fTexCoords[c][0];
float tx2 = m_fTexCoords[c][2];
float ty1 = m_fTexCoords[c][1];
float ty2 = m_fTexCoords[c][3];
float w = ( tx2 - tx1 ) * m_texWidth;
float h = ( ty2 - ty1 ) * m_texHeight;

*pVertex++ = Init2DVertex( x - 0.5f, y - 0.5f, color, tx1, ty1 ); //topleft
*pVertex++ = Init2DVertex( x + w - 0.5f, y - 0.5f, color, tx2, ty1 ); //topright
*pVertex++ = Init2DVertex( x - 0.5f, y + h - 0.5f, color, tx1, ty2 ); //bottomleft
*pVertex++ = Init2DVertex( x + w - 0.5f, y - 0.5f, color, tx2, ty1 ); //topright
*pVertex++ = Init2DVertex( x + w - 0.5f, y + h - 0.5f, color, tx2, ty2 ); //bottomright
*pVertex++ = Init2DVertex( x - 0.5f, y + h - 0.5f, color, tx1, ty2 ); //bottomleft
if ( m_dwCreateFlags & FCR_BORDER )
w -= 2.0f;

x += w - ( m_chrSpacing * 2 );

usedTriangles += 2;
if ( usedTriangles >= m_maxTriangles )
break;
}

if ( usedTriangles > 0 )
{
m_pD3Dbuf->Unlock();
m_pD3Ddev->DrawPrimitive( D3DPT_TRIANGLELIST, 0, usedTriangles );
}
}

m_pD3Ddev->SetFVF( fvf );
this->EndRender();

return S_OK;
}

然后我看到一个名为“DrawLine”的函数,所以我决定去看看它做了什么,它在游戏世界中画了一条线,而不是屏幕上的静态线,所以当我转身并看不到具体位置 - 我不会看到该行:

bool CD3DRender::DrawLine ( const D3DXVECTOR3 &a, const D3DXVECTOR3 &b, DWORD dwColor )
{
if ( FAILED(CD3DBaseRender::BeginRender()) )
return false;

////////////////////////////////////////////////////
// Make sure we have a valid vertex buffer.
if ( m_pD3Dbuf == NULL )
{
return false;
}

m_pD3Ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
m_pD3Ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );
//m_pD3Ddev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
//m_pD3Ddev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );

m_pD3Ddev->SetRenderState( D3DRS_CLIPPING, false );
m_pD3Ddev->SetRenderState ( D3DRS_ZENABLE, false );
//m_pD3Ddev->SetRenderState ( D3DRS_LIGHTING, false );
D3DLVERTEX lineList[2];

//////////////////////////////////////////////////
// Lock the vertex buffer and copy in the verts.
m_pD3Dbuf->Lock( 0, 0, (void **) &lineList, D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK ); // flogs: D3DLOCK_NOSYSLOCK, D3DLOCK_DISCARD
{
lineList[0].x = a.x;
lineList[0].y = a.y;
lineList[0].z = a.z;
lineList[0].color = dwColor;
lineList[0].specular = dwColor;

lineList[1].x = b.x;
lineList[1].y = b.y;
lineList[1].z = b.z;
lineList[1].color = dwColor;
lineList[1].specular = dwColor;
}

m_pD3Dbuf->Unlock();

// store FVF to restore original at the end of this function
DWORD fvf;
m_pD3Ddev->GetFVF( &fvf );
m_pD3Ddev->SetFVF( D3DFVF_LVERTEX );
//m_pD3Ddev->SetFVF( D3DFVF_PRIMITIVES );

////////////////////////////////////////////////////
// Draw!
m_pD3Ddev->DrawPrimitiveUP( D3DPT_LINESTRIP, 1, lineList, sizeof(lineList) / 2 );

// reset states
m_pD3Ddev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
m_pD3Ddev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
m_pD3Ddev->SetRenderState ( D3DRS_ZENABLE, true );
m_pD3Ddev->SetRenderState( D3DRS_CLIPPING, true );

// restore FVF
m_pD3Ddev->SetFVF( fvf );

CD3DBaseRender::EndRender();

return true;
}

现在的问题是:区别在哪里?这段代码在哪里告诉:

“嘿,在播放器屏幕上绘制文本并让它留在那儿”?

“嘿,在游戏世界里画这个,只画玩家能看到的部分”?

谁能指出我正确的方向?或者如何编辑打印功能以在游戏世界中显示文本?

提前致谢。


我想要实现的目标的简洁示例:

Print 现在做什么(绿框)和我想要它做什么(红框)

(截取自另一个存在此类“3d 文本”但该程序是封闭源代码的游戏): enter image description here enter image description here

您可以看到红色框中的文本位置在屏幕上发生了变化,但在游戏中却没有。我也想这样做。 (你也可以看到红色和蓝色的#)

DrawLine代码已经在游戏中创建了线条,但它只是一条线条,不是文本,那么最后怎么会出现一个是另一个不是呢?

最佳答案

我只能猜测您的其余代码的作用。看起来 Print 方法是在变换矩阵已设置为形成正交 View 的环境中调用的,而 DrawLine 方法使用游戏的矩阵。

但是,您不想在场景中绘制文本。这将导致文本未对齐和错误缩放。您真正想要做的是在屏幕上找到场景位置所在的位置,并在那里绘制文本。您可以使用 D3DXVec3Project功能。请务必提供正确的变换矩阵。不是用于 2D 渲染的更新版本。

关于c++ - 如何在场景中绘制文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14983793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com