🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: cn.bbs.comp.program
1 messages
1 total messages Started by �ϵ� Sun, 19 Apr 1998 00:00
һ��DirectX������
#1158
Author: �ϵ�
Date: Sun, 19 Apr 1998 00:00
244 lines
8718 bytes
������: njhe (ra), ����: RAD
��  ��:  һ��DirectX������
����վ: '3m�Ͻ�ɺ�m' (Thu Feb 26 13:42:04 1998) , ת��

#include <windows.h>
#include <ddraw.h>
#include <dsound.h>

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 < 0) { x = 0; vx = -vx; bBounce = TRUE; }
        if (x >= 500) { x = 1000 - x; vx = -vx; bBounce = TRUE; }
        if (y < 0) { y = -y; vy = -vy; bBounce = TRUE; }
        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) < 32 && abs(ny - oy) < 32)
        {
            if (nx < ox)
            {
                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 < oy)
            {
                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;
}

--

\|/ ____ \|/
~@-/ oO \-@~   ������!!!
/_( \__/ )_\
    \__U_/

m;37m�� ��Դ:���Ͻ�ɺ� bbs.njupt.edu.cn��[FROM: 202.119.236.104]m

--
�� ��Դ:���ϴ�С�ٺ���Ϣ����վ bbs.nju.edu.cn��[FROM: a507yjh.nju.edu]
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads