一个DirectX的例子 (转)

一个DirectX的例子 (转)[@more@]

 

发信人: winson (阿苦), 信区: Programming 
标 题: 一个DirectX的例子 
发信站: BBS 水木清华站 (Wed Jan 14 16:49:07 1998) 
 
#include <windows.h> 
#include  
#include  
 
IDirectDraw *dd; 
IDirectDrawSurface *dds0, *dds1, *dds2, *dds3; 
IDirectDrawClipper *ddc; 
IDirectSound *ds; 
IDirectSoundbuffer *dsb1, *dsb2; 
 
int x = 20, y = 20; 
int vx = 5, vy = 3; 
 
void MoveBall(HWND hwnd, BOOL bMove) 

 BOOL bBounce = FALSE; 
 RECT rectSrc, rectDest; 
 int ox, oy, nx, ny; 
 GetClientRect(hwnd, &rectDest); 
 ClientToScreen(hwnd, (POINT *)&rectDest.left); 
 ClientToScreen(hwnd, (POINT *)&rectDest.right); 
 if (bMove) 
 { 
 ox = rectDest.left + 
 MulDiv(rectDest.right - rectDest.left - 32, x, 500); 
 oy = rectDest.top + 
 MulDiv(rectDest.bottom - rectDest.top - 32, y, 500); 
 x += vx; 
 y += vy; 
 if (x  if (x >= 500) { x = 1000 - x; vx = -vx; bBounce = TRUE; } 
 if (y  if (y >= 500) { y = 1000 - y; vy = -vy; bBounce = TRUE; } 
 if (bBounce) 
 { 
 dsb1->SetCurrentPosition(0); 
 dsb1->Play(0, 0, 0); 
 } 
 } 
 nx = rectDest.left + 
 MulDiv(rectDest.right - rectDest.left - 32, x, 500); 
 ny = rectDest.top + 
 MulDiv(rectDest.bottom - rectDest.top - 32, y, 500); 
 rectSrc.left = rectSrc.top = 0; 
 rectSrc.right = rectSrc.bottom = 32; 
 if (bMove) 
 { 
 rectDest.left = rectDest.top = 0; 
 rectDest.right = rectDest.bottom = 32; 
 dds2->Blt(&rectDest, dds3, &rectSrc, DDBLT_WAIT, NULL); 
 if (abs(nx - ox)  { 
 if (nx  { 
 rectSrc.left = ox - nx; 
 rectSrc.right = 32; 
 rectDest.left = 0; 
 rectDest.right = 32 - rectSrc.left; 
 } 
 else 
 { 
 rectDest.left = nx - ox; 
 rectDest.right = 32; 
 rectSrc.left = 0; 
 rectSrc.right = 32 - rectDest.left; 
 } 
 if (ny  { 
 rectSrc.top = oy - ny; 
 rectSrc.bottom = 32; 
 rectDest.top = 0; 
 rectDest.bottom = 32 - rectSrc.top; 
 } 
 else 
 { 
 rectDest.top = ny - oy; 
 rectDest.bottom = 32; 
 rectSrc.top = 0; 
 rectSrc.bottom = 32 - rectDest.top; 
 } 
 dds2->Blt(&rectDest, dds1, &rectSrc, DDBLT_WAIT, NULL); 
 } 
 rectSrc.left = rectSrc.top = 0; 
 rectSrc.right = rectSrc.bottom = 32; 
 rectDest.left = ox; 
 rectDest.top = oy; 
 rectDest.right = rectDest.left + 32; 
 rectDest.bottom = rectDest.top + 32; 
 dds0->Blt(&rectDest, dds2, &rectSrc, DDBLT_WAIT, NULL); 
 } 
 rectDest.left = nx; 
 rectDest.top = ny; 
 rectDest.right = rectDest.left + 32; 
 rectDest.bottom = rectDest.top + 32; 
 dds0->Blt(&rectDest, dds1, &rectSrc, DDBLT_WAIT, NULL); 

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, 
 WPARAM wParam, LPARAM lParam) 

 HDC hDC; 
 PAINTSTRUCT paintStruct; 
 switch(uMsg) 
 { 
 case WM_PAINT: 
 hDC = BeginPaint(hwnd, &paintStruct); 
 if (hDC != NULL) 
 { 
 MoveBall(hwnd, FALSE); 
 EndPaint(hwnd, &paintStruct); 
 } 
 break; 
 case WM_TIMER: 
 MoveBall(hwnd, TRUE); 
 break; 
 case WM_KEYDOWN: 
 switch (wParam) 
 { 
 case VK_LEFT: vx--; break; 
 case VK_UP: vy--; break; 
 case VK_RIGHT: vx++; break; 
 case VK_DOWN: vy++; break; 
 case VK_ESCAPE: PostMessage(hwnd, WM_CLOSE, 0, 0); 
 } 
 break; 
 case WM_DESTROY: 
 PostQuitMessage(0); 
 break; 
 default: 
 return DefWindowProc(hwnd, uMsg, wParam, lParam); 
 } 
 return 0; 

int WINapi WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
 LPSTR d3, int nCmdShow) 

 MSG msg; 
 HWND hwnd; 
 WNDCLASS wndClass; 
 DDSURFACEDESC ddsd; 
 DSBUFFERDESC dsbd; 
 HDC hddDC; 
 RECT rect; 
 HRSRC hrsrc; 
 HGLOBAL hRData; 
 Dword *pRData; 
 LPBYTE pMem1, pMem2; 
 DWORD dwSize1, dwSize2; 
 if (hPrevInstance == NULL) 
 { 
 memset(&wndClass, 0, sizeof(wndClass)); 
 wndClass.style = CS_HREDRAW | CS_VREDRAW; 
 wndClass.lpfnWndProc = WndProc; 
 wndClass.hInstance = hInstance; 
 wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
 wndClass.lpszClassName = "BOUNCE"; 
 if (!RegisterClass(&wndClass)) return FALSE; 
 } 
 hwnd = CreateWindow("BOUNCE", "BOUNCE", 
 WS_OVERLAPPEDWINDOW, 
 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 
 NULL, NULL, hInstance, NULL); 
 DirectDrawCreate(NULL, &dd, NULL); 
 dd->SetCooperativeLevel(hwnd, 
 DDSCL_NORMAL | DDSCL_NOWINDOWCHANGES); 
 memset(&ddsd, 0, sizeof(DDSURFACEDESC)); 
 ddsd.dwSize = sizeof(DDSURFACEDESC); 
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; 
 ddsd.dwFlags = DDSD_CAPS; 
 dd->CreateSurface(&ddsd, &dds0, NULL); 
 dd->CreateClipper(0, &ddc, NULL); 
 dds0->SetClipper(ddc); 
 ddc->SetHWnd(0, hwnd); 
 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 
 ddsd.dwHeight = 32; 
 ddsd.dwWidth = 32; 
 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
 dd->CreateSurface(&ddsd, &dds1, NULL); 
 dd->CreateSurface(&ddsd, &dds2, NULL); 
 dd->CreateSurface(&ddsd, &dds3, NULL); 
 dds1->GetDC(&hddDC); 
 SaveDC(hddDC); 
 rect.left = rect.top = 0; 
 rect.right = rect.bottom = 32; 
 FillRect(hddDC, &rect, (HBRUSH)(COLOR_WINDOW + 1)); 
 selectobject(hddDC, GetStockObject(BLACK_BRUSH)); 
 SelectObject(hddDC, GetStockObject(BLACK_PEN)); 
 Ellipse(hddDC, 0, 0, 32, 32); 
 RestoreDC(hddDC, -1); 
 dds1->ReleaseDC(hddDC); 
 dds3->GetDC(&hddDC); 
 FillRect(hddDC, &rect, (HBRUSH)(COLOR_WINDOW + 1)); 
 dds3->ReleaseDC(hddDC); 
 DirectSoundCreate(NULL, &ds, NULL); 
 ds->SetCooperativeLevel(hwnd, DSSCL_NORMAL); 
 memset(&dsbd, 0, sizeof(DSBUFFERDESC)); 
 dsbd.dwSize = sizeof(DSBUFFERDESC); 
 dsbd.dw= (LPWAVEFORMATEX)(pRData + 5); 
 ds->CreateSoundBuffer(&dsbd, &dsb1, NULL); 
 dsb1->Lock(0, dsbd.dwBufferBytes, &pMem1, &dwSize1, 
 &pMem2, &dwSize2, 0); 
 memcpy(pMem1, (LPBYTE)(pRData + 11), dwSize1); 
 if (dwSize2 != 0) 
 memcpy(pMem2, (LPBYTE)(pRData + 11) + dwSize1, dwSize2); 
 dsb1->Unlock(pMem1, dwSize1, pMem2, dwSize2); 
 hrsrc = FindResource(hInstance, "HUM.WAV", "WAVE"); 
 hRData = LoadResource(hInstance, hrsrc); 
 pRData = (DWORD *)LockResource(hRData); 
 dsbd.dwBufferBytes = *(pRData + 10); 
 dsbd.lpwfxFormat = (LPWAVEFORMATEX)(pRData + 5); 
 ds->CreateSoundBuffer(&dsbd, &dsb2, NULL); 
 dsb2->Lock(0, dsbd.dwBufferBytes, &pMem1, &dwSize1, 
 &pMem2, &dwSize2, 0); 
 memcpy(pMem1, (LPBYTE)(pRData + 11), dwSize1); 
 if (dwSize2 != 0) 
 memcpy(pMem2, (LPBYTE)(pRData + 11) + dwSize1, dwSize2); 
 dsb2->Unlock(pMem1, dwSize1, pMem2, dwSize2); 
 dsb2->Play(0, 0, DSBPLAY_LOOping); 
 ShowWindow(hwnd, nCmdShow); 
 UpdateWindow(hwnd); 
 SetTimer(hwnd, 1, 100, NULL); 
 while (GetMessage(&msg, NULL, 0, 0)) 
 DispatchMessage(&msg); 
 KillTimer(hwnd, 1); 
 return msg.wParam; 

 
-- 
※ 来源:·BBS 水木清华站 bbs.NET.tsinghua.edu.cn·[FROM: 166.111.128.111] 

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10790690/viewspace-951073/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10790690/viewspace-951073/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值