오래 전 인터넷에서 다운로드 한 몇 가지 코드가 있는데, 나는 그 코드를 가지고 놀고 싶었습니다.장면에 텍스트를 그리는 방법은 무엇입니까?
재미있는 부분을 추출하여 프록시 d3d9.dll을 생성하고 게임에 연결했습니다. 나는 정점 화면 또는 게임 장면
(내가 좋아하는, 의미에 그려야하는지 확인이 두 코드 조각 사이의 도면에서 차이을 찾을 수 없기 때문에
지금 나는 질문이 있습니다 - HUD가 화면 상에 있고, 당신은 항상 그것을보고, 차량이 게임 장면에 있습니다.
첫 번째 부분은 편집하고 싶은 코드입니다. 정적 텍스트로 화면에 표시되는 것이 아니라 게임 장면에 텍스트를 표시하려고합니다.
다음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"라는 이름의 기능을보고, 그래서 그것을 확인하고 무엇을보기로 결정하고, 그것이 선을 그립니다 :
는 DLL에서 사용되는 코드는 다음입니다 게임 세계에, 화면에없는 정적 라인, 그래서 주변에 돌고 특정 위치가 표시되지 않는 경우 - 나는 선이 표시되지 않습니다 :
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;
}
이제 질문은 어디에이다 차? 이 코드의 위치 :
"플레이어 화면에 텍스트를 그려두고 거기에 머물게하십시오"
및
"이봐 플레이어가 볼 수있는 유일한 조각을 그릴, 게임 세계에서이 그리는"?
누구나 올바른 방향으로 나를 가리킬 수 있습니까? 아니면 인쇄 기능을 편집하여 게임 세계에 텍스트를 표시하는 방법이 있습니까?
미리 감사드립니다.
간결 내가 무엇을 달성하고자하는의 예 :
무엇 인쇄 지금 (녹색 상자) 수행하고 난
(화면은 서로 촬영 (빨간색 상자)을 수행 할 작업 당신은 t의 위치를 볼 수 있습니다
: 예 : "3D 텍스트는"프로그램 존재하지만 게임은 비공개 소스)입니다 빨간색 상자의 내선이 화면에서 변경되었지만 게임 내에서 변경되지 않았습니다. 나도 그렇게하고 싶다. (빨간색과 파란색도 볼 수 있습니다.)
DrawLine 코드는 이미 게임에서 라인을 생성하지만 텍스트가 아닌 라인이기 때문에 최종적으로 다른 플레이어와 다른 플레이어가 어떻게 될까요? 아니?
** 간략한 ** 문제의 예는 무엇입니까? 질문과 코드가 너무 길어 누구나 읽을 수 없으며 답을 공식화 할 수는 없습니다. –
@TonyTheLion은 –