0

我正在尝试将此 C++ Direct3D 函数转换为 Delphi,但我遇到了麻烦..

HRESULT GenerateTexture(IDirect3DDevice9 *pD3Ddev, IDirect3DTexture9 **ppD3Dtex, DWORD colour32)
{
    if( FAILED(pD3Ddev->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, NULL)) )
        return E_FAIL;

    WORD colour16 =    ((WORD)((colour32>>28)&0xF)<<12)
            |(WORD)(((colour32>>20)&0xF)<<8)
            |(WORD)(((colour32>>12)&0xF)<<4)
            |(WORD)(((colour32>>4)&0xF)<<0);

    D3DLOCKED_RECT d3dlr;  
    (*ppD3Dtex)->LockRect(0, &d3dlr, 0, 0);
    WORD *pDst16 = (WORD*)d3dlr.pBits;

    for(int xy=0; xy < 8*8; xy++)
        *pDst16++ = colour16;

    (*ppD3Dtex)->UnlockRect(0);

    return S_OK;
}

这是我的 Delphi 转换函数,但有错误:

function GenerateTexture(pD3Ddev: IDirect3DDevice9; ppD3Dtex: IDirect3DTexture9; colour32: dword):HRESULT;
var
 colour16: word;
 d3dlr: D3DLOCKED_RECT;
 pDst16: pword;
 xy: integer;
begin
 if failed(pD3Ddev.CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, nil)) then result := E_FAIL;

 colour16 := (word(((colour32 shr 28)and $F) shl 12)
             or word((((colour32 shr 20)and $F) shl 8))
             or word((((colour32 shr 12)and $F) shl 4))
             or word((((colour32 shr 4)and $F) shl 0)));

  ppD3Dtex.LockRect(0, d3dlr, 0, 0);
  pDst16 := PWORD(d3dlr.pBits);
  xy:=0;
  while xy<(8*8) do begin
   Inc(pDst16^);
   pDst16^ := color16; //THIS IS THE LINE WITH ERROR: '('Expected but ';' found.
   inc(xy);
  end;
  ppD3Dtex.UnlockRect(0);

  Result := S_OK;
end;

我想我在转换一些错误的东西,但我不知道是什么......

谁能帮我?谢谢

4

3 回答 3

2

您的变量称为 colour16,而不是 color16。

您还有另一个更高的错误。请记住,在 C 中,return 会立即退出函数,而在 Delphi 中并非如此,因此在 if failed 调用中需要类似这样的内容:

if failed(pD3Ddev.CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, nil)) then
begin
  result := E_FAIL;
  Exit;
end;
于 2012-04-12T16:27:44.997 回答
1

只是我注意到的一件小事: Inc(pDst16^) 应该低于赋值,因为 c++ 版本使用后增量符号,而不是前增量。

于 2012-04-13T07:12:48.733 回答
0
function GenerateTexture(pD3Ddev: IDirect3DDevice9; ppD3Dtex: IDirect3DTexture9; colour32: dword):HRESULT;
var
    colour16: word;
    d3dlr: D3DLOCKED_RECT;
    pDst16: pword;
    xy: integer;
begin
     if Failed(pD3Ddev.CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, nil)) then
     begin
        result := E_FAIL;
        Exit;
    end;
    colour16 := (word(((colour32 shr 28)and $F) shl 12)
        or word((((colour32 shr 20)and $F) shl 8))
        or word((((colour32 shr 12)and $F) shl 4))
        or word((((colour32 shr 4)and $F) shl 0)));

    ppD3Dtex.LockRect(0, d3dlr, nil, 0);
    pDst16 := PWORD(d3dlr.pBits);
    xy:=0;
    while xy<(8*8) do begin
        Inc(pDst16^);
        pDst16^ := colour16;
        Inc(xy);
    end;
    ppD3Dtex.UnlockRect(0);
    Result := S_OK;
end;
于 2013-01-20T21:49:13.107 回答