繁体   English   中英

将Direct3D C ++函数转换为Delphi

[英]Convert Direct3D C++ function to Delphi

我正在尝试将此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;

我想我正在转换错误,但是我不知道是什么...

谁能帮我? 谢谢

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

您还会遇到另一个错误。 请记住,在C语言中,return立即退出函数,而在Delphi中则不是这种情况,因此,如果if调用失败,您将需要以下代码:

if failed(pD3Ddev.CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, nil)) then
begin
  result := E_FAIL;
  Exit;
end;

我注意到的一件小事情:Inc(pDst16 ^)应该在赋值之下,因为C ++版本使用后递增表示法,而不是前递增表示法。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM