2013-02-20 7 views
1

오래 전 인터넷에서 다운로드 한 몇 가지 코드가 있는데, 나는 그 코드를 가지고 놀고 싶었습니다.장면에 텍스트를 그리는 방법은 무엇입니까?

재미있는 부분을 추출하여 프록시 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의 위치를 ​​볼 수 있습니다 enter image description here enter image description here

: 예 : "3D 텍스트는"프로그램 존재하지만 게임은 비공개 소스)입니다 빨간색 상자의 내선이 화면에서 변경되었지만 게임 내에서 변경되지 않았습니다. 나도 그렇게하고 싶다. (빨간색과 파란색도 볼 수 있습니다.)

DrawLine 코드는 이미 게임에서 라인을 생성하지만 텍스트가 아닌 라인이기 때문에 최종적으로 다른 플레이어와 다른 플레이어가 어떻게 될까요? 아니?

+0

** 간략한 ** 문제의 예는 무엇입니까? 질문과 코드가 너무 길어 누구나 읽을 수 없으며 답을 공식화 할 수는 없습니다. –

+0

@TonyTheLion은 –

답변

1

코드의 나머지 부분을 추측 할 수 있습니다. DrawLine 메서드가 게임의 행렬을 사용하는 동안 변형 행렬이 정사영 뷰를 형성하도록 설정된 환경에서 Print 메서드가 호출 된 것으로 보입니다.

그러나 장면에 텍스트를 그리지 않으려 고합니다. 이로 인해 텍스트의 정렬이 잘못되거나 잘못 스케일링 될 수 있습니다. 당신이해야 할 일은 화면 상에 장면 위치가 있고 텍스트를 그리는 위치를 얻는 것입니다. 이를 위해 D3DXVec3Project 함수를 사용할 수 있습니다. 올바른 변환 행렬을 제공하십시오. 2D 렌더링을위한 업데이트 된 것들은 아닙니다.

+0

흠을 추가했습니다. 내가 살펴볼 것입니다. –

관련 문제