游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4636|回复: 4

请教各位用D3DXFONT渲染字体的问题!

[复制链接]

2

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
QQ
发表于 2006-9-7 19:25:00 | 显示全部楼层 |阅读模式
我是游戏初学者,正在学习《DirectX角色扮演游戏编程》这本书,里面渲染字体的程序写错了,我查了很多资料,把LOGFONT试改用过D3DXFONT_DESC,但还是有窗体没字体。,请高手们帮帮忙,谢谢。。还有,我想请求站长给开个DirectX的专区,这样DirectX的帖子集中,可以互相讨论和帮忙。

代码:
//=====WinMain.cpp=====
#include <windows.h>
#include <stdio.h>
#include "d3d9.h"
#include "d3dx9.h"

// Window handles, class and caption text
HWND          g_hWnd;
HINSTANCE     g_hInst;
static char   g_szClass[]   = "FontClass";
static char   g_szCaption[] = "Font Demo by Jim Adams";

// The Direct3D and Device object
IDirect3D9       *g_pD3D       = NULL;
IDirect3DDevice9 *g_pD3DDevice = NULL;

// The Font object
ID3DXFont *g_pFont = NULL;

// Function prototypes
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev,                             LPSTR szCmdLine, int nCmdShow);
long FAR PASCAL WindowProc(HWND hWnd, UINT uMsg,                                         WPARAM wParam, LPARAM lParam);

BOOL DoInit();
BOOL DoShutdown();
BOOL DoFrame();
BOOL SetupMeshes();

int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev,                             LPSTR szCmdLine, int nCmdShow)
{
  WNDCLASSEX wcex;
  MSG        Msg;

  g_hInst = hInst;

  // Create the window class here and register it
  wcex.cbSize        = sizeof(wcex);
  wcex.style         = CS_CLASSDC;
  wcex.lpfnWndProc   = WindowProc;
  wcex.cbClsExtra    = 0;
  wcex.cbWndExtra    = 0;
  wcex.hInstance     = hInst;
  wcex.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  wcex.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wcex.hbrBackground = NULL;
  wcex.lpszMenuName  = NULL;
  wcex.lpszClassName = g_szClass;
  wcex.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
  if(!RegisterClassEx(&wcex))
    return FALSE;

  // Create the Main Window
  g_hWnd = CreateWindow(g_szClass, g_szCaption,
        WS_CAPTION | WS_SYSMENU,
        0, 0, 400, 400,
        NULL, NULL,
        hInst, NULL );
  if(!g_hWnd)
    return FALSE;
  ShowWindow(g_hWnd, SW_NORMAL);
  UpdateWindow(g_hWnd);

  // Run init function and return on error
  if(DoInit() == FALSE)
    return FALSE;

  // Start message pump, waiting for signal to quit
  ZeroMemory(&Msg, sizeof(MSG));
  while(Msg.message != WM_QUIT) {
    if(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
    }
    if(DoFrame() == FALSE)
      break;
  }

  // Run shutdown function
  DoShutdown();
  
  UnregisterClass(g_szClass, hInst);

  return Msg.wParam;
}

long FAR PASCAL WindowProc(HWND hWnd, UINT uMsg,                                         WPARAM wParam, LPARAM lParam)
{
  switch(uMsg) {
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;

  }

  return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

BOOL DoInit()
{
  D3DPRESENT_PARAMETERS d3dpp;
  D3DDISPLAYMODE        d3ddm;
  LOGFONT               Font;

  // Do a windowed mode initialization of Direct3D
  if((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
    return FALSE;
  if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    return FALSE;
  ZeroMemory(&d3dpp, sizeof(d3dpp));
  d3dpp.Windowed = TRUE;
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  d3dpp.BackBufferFormat = d3ddm.Format;
  d3dpp.EnableAutoDepthStencil = FALSE;
  if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd,
                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  &d3dpp, &g_pD3DDevice)))
    return FALSE;

  // Create the font
  ZeroMemory(&Font, sizeof(Font));
  strcpy(Font.lfFaceName, "Arial");
  Font.lfHeight = -32;
  D3DXCreateFontIndirect(g_pD3DDevice, &Font, &g_pFont);

  return TRUE;
}

BOOL DoShutdown()
{
  // Release font
  if(g_pFont != NULL)
    g_pFont->Release();

  // Release device and 3D objects
  if(g_pD3DDevice != NULL)
    g_pD3DDevice->Release();

  if(g_pD3D != NULL)
    g_pD3D->Release();

  return TRUE;
}

BOOL DoFrame()
{
  RECT Rect = { 0,0,400,400 };

  // Clear device backbuffer
  g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,                                       D3DCOLOR_RGBA(0,64,128,255), 1.0f, 0);

  // Begin scene
  if(SUCCEEDED(g_pD3DDevice->BeginScene())) {

    // Draw some text
    g_pFont->Begin();
    g_pFont->DrawText(NULL,&quotrogramming is Fun!", -1, &Rect, DT_CENTER | DT_VCENTER, 0xFFFFFFFF);
    g_pFont->End();

    // End the scene
    g_pD3DDevice->EndScene();
  }

  // Display the scene
  g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

  return TRUE;
}
/*错误提示有4个:
(138) : error C2664: 'D3DXCreateFontIndirectA' : cannot convert parameter 2 from 'struct tagLOGFONTA *' to 'const struct _D3DXFONT_DESCA *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
(171) : error C2039: 'Begin' : is not a member of 'ID3DXFont'
(173) : error C2039: 'End' : is not a member of 'ID3DXFont'
*/
[em17]有心无力,心痛也~~

2

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
QQ
 楼主| 发表于 2006-9-8 13:01:00 | 显示全部楼层

Re:请教各位用D3DXFONT渲染字体的问题!

都快沉底了,请求有人可以帮我解答,谢谢。

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2006-9-8 16:23:00 | 显示全部楼层

Re:请教各位用D3DXFONT渲染字体的问题!


要使用Device的BeginScene和EndScene

画的范围不能超出可显示范围,否则画不出

72

主题

447

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
QQ
发表于 2006-9-11 14:04:00 | 显示全部楼层

Re:请教各位用D3DXFONT渲染字体的问题!

看看这篇文章也许对你有帮助吧!
http://www.dingge.com/forum/dispbbs.asp?BoardID=46&ID=5558&replyID=&skin=1

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2007-3-16 12:08:00 | 显示全部楼层

Re:请教各位用D3DXFONT渲染字体的问题!

//创建文字对象
        D3DXFONT_DESCW font2={
                Size, //大小
                0,//宽度
                (Bold)?FW_HEAVY:FW_THIN,//粗度
                1, //MipLevels
                bItalic,//下划线
                DEFAULT_CHARSET,
                OUT_DEFAULT_PRECIS,
                CLEARTYPE_QUALITY,
                DEFAULT_PITCH |FF_DONTCARE,
                NULL };
        wcsncpy(font2.FaceName, Path,UI_FONTNAME_MAX);
        if(D3DXCreateFontIndirectW( m_pDevice,&font2, &tmp_Font.p2DFontStand ) != D3D_OK)
        {
                wstring tem_str = L"创建序号为[";
                tem_str += g_PathLoader.GetStringByID(ResID);
                tem_str += L"]的文字资源失败。";
                g_ErrorLogRecorder.AddErrorToLog(tem_str.data());
                return false;
        }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 17:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表