2012-04-12 62 views
0

我想這個C++的Direct3D功能德爾福轉換,但我有麻煩..轉換Direct3D的C++函數德爾福

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; 
} 

這是我的德爾福轉換函數錯誤:

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

colour16的拼寫錯誤也許? – 2012-04-12 16:23:07

+0

LOL ...哈哈,謝謝..我沒有注意..其餘的都沒問題?一切正確轉換? – paulohr 2012-04-12 16:28:20

+0

我認爲TheVedge在他的答案中得到了答案。 – 2012-04-12 16:30:32

回答

2

你的變量叫colour16,而不是color16。

您還有其他更高的錯誤。請記住,在C,返回立即退出功能,這是不是在德爾福的情況下,所以你會想是這樣的,如果失敗的呼叫:

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

謝謝! 其餘的轉換是否正確? – paulohr 2012-04-12 16:31:45

+0

據我可以告訴,但你確實有LockRect上的編譯警告(第三個參數應該是一個指針,而不是一個int) – ESG 2012-04-12 16:36:30

1

只是一個很小的事情,我注意到:公司(pDst16 ^)應該低於賦值,因爲C++版本使用後增值符號,而不是預增值。

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;