PDA

View Full Version : DirectX basic/advance/linh tinh tutorials



CrazyBabe
23-10-2003, 23:30
Topic này để các tutor về DX. Đề nghi kô chat chit ở đây hén.

DieHard
06-11-2003, 11:48
Direct Draw bài 1. Tạo 3D trên màn hình 2D

Source code ở đây
http://www.gamevn.com/forum/attachment.php?attachmentid=1052

http://www.gamevn.com/forum/forumdisplay.php?f=43

Trần văn Lưu
09-11-2003, 01:01
khó quábvbbbbbbbbb

DieHard
09-11-2003, 07:59
khó quábvbbbbbbbbb

Cái source code này được zip bằng WinRar3.0
Dùng Visual Studio 6 để mở cái project. Có sẵng ...Release\XPro.exe trong đó để chạy thử.
Direct X SDK download từ Microsoft.
Class chính trong chương trình:
http://www.gamevn.com/forum/attachment.php?attachmentid=1064

VB programmers, đến lúc Vứt Bỏ nó được rồi.
Cần phải biết 1 chút về VC++, tạo window bằng WinAPI. Biết về COM càng tốt.

txt
12-11-2003, 17:15
bạn nào đã từng lập trình DIRECTRAW 7 (của DX8.1)với VB6 ,xin chỉ cách sử dụng.Mình chẳng biết BLIT,SURFACE là cái gì và cách thức hoạt động của nó( dù đã đọc kỹ tài liệu SDK),xin chỉ dùm .Mình đã thực hiện y chang tutorial 1 của MSDN(10-2001),(không có source code) nhưng chảng thấy ảnh hiện lên dù chương trình không báo lỗi.Mình nản ghê gớm!!!!

DieHard
12-11-2003, 20:05
bạn nào đã từng lập trình DIRECTRAW 7 (của DX8.1)với VB6 ,xin chỉ cách sử dụng.Mình chẳng biết BLIT,SURFACE là cái gì và cách thức hoạt động của nó( dù đã đọc kỹ tài liệu SDK),xin chỉ dùm .Mình đã thực hiện y chang tutorial 1 của MSDN(10-2001),(không có source code) nhưng chảng thấy ảnh hiện lên dù chương trình không báo lỗi.Mình nản ghê gớm!!!!
Nếu thật sự muốn đi về software graphics/games nên dùng VC++. Đặc biệt là nó được hổ trợ sẳng DirẹctX
Dùng VB hay Delphi thì củng được thôi .Tớ sẻ đưa lên 1 ví dụ giống như ví dụ ở trên nhưng mà dùng Delphị

Hàm Blt trong DirectDrawSurface dùng để vẽ nhanh, chuyển hình từ 1 surface này qua 1 surface khác. Surface là 1 memory buffer dùng để lu hình. Coi Blt củng giống như là copy memory thì có thể dể hiểu hơn

InstCode
10-01-2004, 14:00
Chào các bác !
Lập trình DirectDraw thi mình cũng OK, nhưng khi với đến phần DirectInput thì có một cái mà không biết làm seo ?

Tức là bên DI nó ánh xạ từng phím thành các hằng số và define với tiếp đầu ngữ cho mỗi thằng là DIK_<Phím> ... Bây giờ muốn chuyển qua lại từ mấy thằng VK_<Phím> như của API bình thường thì làm sao ta ? Ví dụ có công thức tổng quát nào cho việc chuyển đổi này hay không ?

CrazyBabe
10-01-2004, 23:55
Predefined key code:
Key_Escape = $01;
Key_1 = $02;
Key_2 = $03;
Key_3 = $04;
Key_4 = $05;
Key_5 = $06;
Key_6 = $07;
Key_7 = $08;
Key_8 = $09;
Key_9 = $0A;
Key_0 = $0B;
Key_Minus = $0C;//- on main keyboard
Key_Equals = $0D;
Key_Back = $0E;//Backspace
Key_Tab = $0F;
Key_Q = $10;
Key_W = $11;
Key_E = $12;
Key_R = $13;
Key_T = $14;
Key_Y = $15;
Key_U = $16;
Key_I = $17;
Key_O = $18;
Key_P = $19;
Key_LBracket = $1A;
Key_RBracket = $1B;
Key_Return = $1C;//Enter on main keyboard
Key_LControl = $1D;
Key_A = $1E;
Key_S = $1F;
Key_D = $20;
Key_F = $21;
Key_G = $22;
Key_H = $23;
Key_J = $24;
Key_K = $25;
Key_L = $26;
Key_SemiColon = $27;
Key_Apostrophe = $28;
Key_Grave = $29;//Accent grave
Key_LShift = $2A;
Key_BackSlash = $2B;
Key_Z = $2C;
Key_X = $2D;
Key_C = $2E;
Key_V = $2F;
Key_B = $30;
Key_N = $31;
Key_M = $32;
Key_Comma = $33;
Key_Period = $34;//. on main keyboard
Key_Slash = $35;///on main keyboard
Key_RShift = $36;
Key_Multiply = $37;//* on numeric keypad
Key_LMenu = $38;//Left Alt
Key_Space = $39;
Key_Capital = $3A;
Key_F1 = $3B;
Key_F2 = $3C;
Key_F3 = $3D;
Key_F4 = $3E;
Key_F5 = $3F;
Key_F6 = $40;
Key_F7 = $41;
Key_F8 = $42;
Key_F9 = $43;
Key_F10 = $44;
Key_NumLock = $45;
Key_Scroll = $46;//Scroll Lock
Key_NumPad7 = $47;
Key_NumPad8 = $48;
Key_NumPad9 = $49;
Key_Subtract = $4A;//- on numeric keypad
Key_NumPad4 = $4B;
Key_NumPad5 = $4C;
Key_NumPad6 = $4D;
Key_Add = $4E;//+ on numeric keypad
Key_NumPad1 = $4F;
Key_NumPad2 = $50;
Key_NumPad3 = $51;
Key_NumPad0 = $52;
Key_Decimal = $53;//. on numeric keypad
Key_F11 = $57;
Key_F12 = $58;
Key_F13 = $64;//NEC PC98
Key_F14 = $65;//NEC PC98
Key_F15 = $66;//NEC PC98
Key_Kana = $70;//Japanese keyboard
Key_Convert = $79;//Japanese keyboard
Key_NoConvert = $7B;//Japanese keyboard
Key_Yen = $7D;//Japanese keyboard
Key_NumPadEquals = $8D;//= on numeric keypad NEC PC98
Key_CircumFlex = $90;//Japanese keyboard
Key_AT = $91;//NEC PC98
Key_Colon = $92;//NEC PC98
Key_UnderLine = $93;//NEC PC98
Key_Kanji = $94;//Japanese keyboard
Key_Stop = $95;//NEC PC98
Key_AX = $96;//Japan AX
Key_UnLabeled = $97;//J3100
Key_NumPadEnter = $9C;//Enter on numeric keypad
Key_RControl = $9D;
Key_NumPadComma = $B3;//,on numeric keypad NEC PC98
Key_Divide = $B5;///on numeric keypad
Key_SysRQ = $B7;
Key_RMenu = $B8;//Right Alt
Key_Pause = $C5;//Pause
Key_Home = $C7;//Home on arrow keypad
Key_Up = $C8;//UpArrow on arrow keypad
Key_Prior = $C9;//PgUp on arrow keypad
Key_Left = $CB;//LeftArrow on arrow keypad
Key_Right = $CD;//RightArrow on arrow keypad
Key_End = $CF;//End on arrow keypad
Key_Down = $D0;//DownArrow on arrow keypad
Key_Next = $D1;//PgDn on arrow keypad
Key_Insert = $D2;//Insert on arrow keypad
Key_Delete = $D3;//Delete on arrow keypad
Key_LWin = $DB;//Left Windows Key
Key_RWin = $DC;//Right Windows Key
Key_Apps = $DD;//AppMenu Key
Key_Power = $DE;
Key_Sleep = $DF;
Key_BackSpace = Key_Back ;//Backspace
Key_NumPadStar = Key_Multiply;//* on numeric keypad
Key_LAlt = Key_LMenu ;//Left Alt
Key_CapsLock = Key_Capital ;//CapsLock
Key_NumPadMinus = Key_Subtract;//- on numeric keypad
Key_NumPadPlus = Key_Add ;//+ on numeric keypad
Key_NumPadPeriod = Key_Decimal ;//. on numeric keypad
Key_NumPadSlash = Key_Divide ;///on numeric keypad
Key_RAlt = Key_RMenu ;//Right Alt
Key_UpArrow = Key_Up ;//UpArrow on arrow keypad
Key_PgUp = Key_Prior ;//PgUp on arrow keypad
Key_LeftArrow = Key_LEFT ;//LeftArrow on arrow keypad
Key_RightArrow = Key_Right ;//RightArrow on arrow keypad
Key_DownArrow = Key_Down ;//DownArrow on arrow keypad
Key_PgDn = Key_Next ;//PgDn on arrow keypad

InstCode
12-01-2004, 20:04
Hic, :( ... Hông phải vậy !
Cái đó là định nghĩa của mình rồi ... Mở file dinput.h ra cũng có cả đống mừ !....
Ý em là vậy nè :
- Game của em có 2 thằng chơi ... Yêu cầu đặt ra là có thể config lại cái keyboard control cho mỗi thằng.
- Do đó em dùng một cái hotkey control để user thiết lập (giao diện giống như cách thiết lập Accelerator Keyboard Shortcut của VC++ cho mấy cái ID đó !!) ...
=> Khổ nỗi là thằng này nó xài theo kiểu VK_<Tên phím> ... trong khi đó thằng DInput thì nó xài theo dạng DIK_<Tên phím> ... 2 thằng điên này lại chẳng thấy công thức tổng quát gì để chuyển đổi cả ... Hic, một thằng thì ánh xạ như trên bàn phím, còn thằng VK_ thì ánh xạ trên cái luật rừng nó đặt ra ... Hic ... Điếc luôn !... Ai giúp em dzới !!....

CrazyBabe
13-01-2004, 00:38
Dùng bảng ánh xạ sang là xong mừ ?

InstCode
13-01-2004, 10:22
Vậy bác có bảng đó hông ? Cho em xin ... gõ cái đó chắc cũng mất cả tháng? hỉ ?

babylearntochat
24-01-2004, 09:45
Cho hỏi làm sao để Clip 1 LPDIRECTDRAWSURFACE?

InstCode
24-01-2004, 22:21
Hic ... cuối cùng cũng gõ xong ... may là nhờ RegExp của VC++... Tặng các bác xài chơi ...

void CDInput::InitKeyMap()
{
m_DIK2VK[DIK_ESCAPE] = VK_ESCAPE;
m_DIK2VK[DIK_1] = '1';
m_DIK2VK[DIK_2] = '2';
m_DIK2VK[DIK_3] = '3';
m_DIK2VK[DIK_4] = '4';
m_DIK2VK[DIK_5] = '5';
m_DIK2VK[DIK_6] = '6';
m_DIK2VK[DIK_7] = '7';
m_DIK2VK[DIK_8] = '8';
m_DIK2VK[DIK_9] = '9';
m_DIK2VK[DIK_0] = '0';
m_DIK2VK[DIK_MINUS] = 0xBD; /* - on main keyboard */
m_DIK2VK[DIK_EQUALS] = 0xBB;
m_DIK2VK[DIK_BACK] = VK_BACK; /* backspace */
m_DIK2VK[DIK_TAB] = VK_TAB;
m_DIK2VK[DIK_Q] = 'Q';
m_DIK2VK[DIK_W] = 'W';
m_DIK2VK[DIK_E] = 'E';
m_DIK2VK[DIK_R] = 'R';
m_DIK2VK[DIK_T] = 'T';
m_DIK2VK[DIK_Y] = 'Y';
m_DIK2VK[DIK_U] = 'U';
m_DIK2VK[DIK_I] = 'I';
m_DIK2VK[DIK_O] = 'O';
m_DIK2VK[DIK_P] = 'P';
m_DIK2VK[DIK_LBRACKET] = 0xDB;
m_DIK2VK[DIK_RBRACKET] = 0xDD;
m_DIK2VK[DIK_RETURN] = VK_RETURN; /* Enter on main keyboard */
m_DIK2VK[DIK_LCONTROL] = VK_LCONTROL;
m_DIK2VK[DIK_A] = 'A';
m_DIK2VK[DIK_S] = 'S';
m_DIK2VK[DIK_D] = 'D';
m_DIK2VK[DIK_F] = 'F';
m_DIK2VK[DIK_G] = 'G';
m_DIK2VK[DIK_H] = 'H';
m_DIK2VK[DIK_J] = 'J';
m_DIK2VK[DIK_K] = 'K';
m_DIK2VK[DIK_L] = 'L';
m_DIK2VK[DIK_SEMICOLON] = 0xBA;
m_DIK2VK[DIK_APOSTROPHE] = 0xDE;
m_DIK2VK[DIK_GRAVE] = 0xC0; /* accent grave */
m_DIK2VK[DIK_LSHIFT] = VK_LSHIFT;
m_DIK2VK[DIK_BACKSLASH] = 0xDC;
m_DIK2VK[DIK_Z] = 'Z';
m_DIK2VK[DIK_X] = 'X';
m_DIK2VK[DIK_C] = 'C';
m_DIK2VK[DIK_V] = 'V';
m_DIK2VK[DIK_B] = 'B';
m_DIK2VK[DIK_N] = 'N';
m_DIK2VK[DIK_M] = 'M';
m_DIK2VK[DIK_COMMA] = 0xBC;
m_DIK2VK[DIK_PERIOD] = 0xBE; /* . on main keyboard */
m_DIK2VK[DIK_SLASH] = 0xBF; /* / on main keyboard */
m_DIK2VK[DIK_RSHIFT] = VK_RSHIFT;
m_DIK2VK[DIK_MULTIPLY] = VK_MULTIPLY; /* * on numeric keypad */
m_DIK2VK[DIK_LMENU] = VK_LMENU; /* left Alt */
m_DIK2VK[DIK_SPACE] = VK_SPACE;
m_DIK2VK[DIK_CAPITAL] = VK_CAPITAL;
m_DIK2VK[DIK_F1] = VK_F1;
m_DIK2VK[DIK_F2] = VK_F2;
m_DIK2VK[DIK_F3] = VK_F3;
m_DIK2VK[DIK_F4] = VK_F4;
m_DIK2VK[DIK_F5] = VK_F5;
m_DIK2VK[DIK_F6] = VK_F6;
m_DIK2VK[DIK_F7] = VK_F7;
m_DIK2VK[DIK_F8] = VK_F8;
m_DIK2VK[DIK_F9] = VK_F9;
m_DIK2VK[DIK_F10] = VK_F10;
m_DIK2VK[DIK_NUMLOCK] = VK_NUMLOCK;
m_DIK2VK[DIK_SCROLL] = VK_SCROLL; /* Scroll Lock */
m_DIK2VK[DIK_NUMPAD7] = VK_NUMPAD7;
m_DIK2VK[DIK_NUMPAD8] = VK_NUMPAD8;
m_DIK2VK[DIK_NUMPAD9] = VK_NUMPAD9;
m_DIK2VK[DIK_SUBTRACT] = VK_SUBTRACT; /* - on numeric keypad */
m_DIK2VK[DIK_NUMPAD4] = VK_NUMPAD4;
m_DIK2VK[DIK_NUMPAD5] = VK_NUMPAD5;
m_DIK2VK[DIK_NUMPAD6] = VK_NUMPAD6;
m_DIK2VK[DIK_ADD] = VK_ADD; /* + on numeric keypad */
m_DIK2VK[DIK_NUMPAD1] = VK_NUMPAD1;
m_DIK2VK[DIK_NUMPAD2] = VK_NUMPAD2;
m_DIK2VK[DIK_NUMPAD3] = VK_NUMPAD3;
m_DIK2VK[DIK_NUMPAD0] = VK_NUMPAD0;
m_DIK2VK[DIK_DECIMAL] = VK_DECIMAL; /* . on numeric keypad */
m_DIK2VK[DIK_F11] = VK_F11;
m_DIK2VK[DIK_F12] = VK_F12;
m_DIK2VK[DIK_F13] = VK_F13; /* (NEC PC98) */
m_DIK2VK[DIK_F14] = VK_F14; /* (NEC PC98) */
m_DIK2VK[DIK_F15] = VK_F15; /* (NEC PC98) */
m_DIK2VK[DIK_KANA] = VK_KANA; /* (Japanese keyboard) */
m_DIK2VK[DIK_CONVERT] = VK_CONVERT; /* (Japanese keyboard) */
m_DIK2VK[DIK_RCONTROL] = VK_RCONTROL;
m_DIK2VK[DIK_DIVIDE] = VK_DIVIDE; /* / on numeric keypad */
m_DIK2VK[DIK_RMENU] = VK_RMENU; /* right Alt */
m_DIK2VK[DIK_PAUSE] = VK_PAUSE; /* Pause */
m_DIK2VK[DIK_HOME] = VK_HOME; /* Home on arrow keypad */
m_DIK2VK[DIK_UP] = VK_UP; /* UpArrow on arrow keypad */
m_DIK2VK[DIK_PRIOR] = VK_PRIOR; /* PgUp on arrow keypad */
m_DIK2VK[DIK_LEFT] = VK_LEFT; /* LeftArrow on arrow keypad */
m_DIK2VK[DIK_RIGHT] = VK_RIGHT; /* RightArrow on arrow keypad */
m_DIK2VK[DIK_END] = VK_END; /* End on arrow keypad */
m_DIK2VK[DIK_DOWN] = VK_DOWN; /* DownArrow on arrow keypad */
m_DIK2VK[DIK_NEXT] = VK_NEXT; /* PgDn on arrow keypad */
m_DIK2VK[DIK_INSERT] = VK_INSERT; /* Insert on arrow keypad */
m_DIK2VK[DIK_DELETE] = VK_DELETE; /* Delete on arrow keypad */
m_DIK2VK[DIK_LWIN] = VK_LWIN; /* Left Windows key */
m_DIK2VK[DIK_RWIN] = VK_RWIN; /* Right Windows key */
m_DIK2VK[DIK_APPS] = VK_APPS; /* AppMenu key */

/*
* Virtual Keys, Standard Set
*/
m_VK2DIK[VK_BACK] = DIK_BACK;
m_VK2DIK[VK_TAB] = DIK_TAB;
m_VK2DIK[VK_RETURN] = DIK_RETURN;
m_VK2DIK[VK_PAUSE] = DIK_PAUSE;
m_VK2DIK[VK_CAPITAL] = DIK_CAPITAL;
m_VK2DIK[VK_KANA] = DIK_KANA;
m_VK2DIK[VK_KANJI] = DIK_KANJI;
m_VK2DIK[VK_ESCAPE] = DIK_ESCAPE;
m_VK2DIK[VK_CONVERT] = DIK_CONVERT;
m_VK2DIK[VK_SPACE] = DIK_SPACE;
m_VK2DIK[VK_PRIOR] = DIK_PRIOR;
m_VK2DIK[VK_NEXT] = DIK_NEXT;
m_VK2DIK[VK_END] = DIK_END;
m_VK2DIK[VK_HOME] = DIK_HOME;
m_VK2DIK[VK_LEFT] = DIK_LEFT;
m_VK2DIK[VK_UP] = DIK_UP;
m_VK2DIK[VK_RIGHT] = DIK_RIGHT;
m_VK2DIK[VK_DOWN] = DIK_DOWN;
m_VK2DIK[VK_INSERT] = DIK_INSERT;
m_VK2DIK[VK_DELETE] = DIK_DELETE;
m_VK2DIK['A'] = DIK_A;
m_VK2DIK['B'] = DIK_B;
m_VK2DIK['C'] = DIK_C;
m_VK2DIK['D'] = DIK_D;
m_VK2DIK['E'] = DIK_E;
m_VK2DIK['F'] = DIK_F;
m_VK2DIK['G'] = DIK_G;
m_VK2DIK['H'] = DIK_H;
m_VK2DIK['I'] = DIK_I;
m_VK2DIK['J'] = DIK_J;
m_VK2DIK['K'] = DIK_K;
m_VK2DIK['L'] = DIK_L;
m_VK2DIK['M'] = DIK_M;
m_VK2DIK['N'] = DIK_N;
m_VK2DIK['O'] = DIK_O;
m_VK2DIK['P'] = DIK_P;
m_VK2DIK['Q'] = DIK_Q;
m_VK2DIK['R'] = DIK_R;
m_VK2DIK['S'] = DIK_S;
m_VK2DIK['T'] = DIK_T;
m_VK2DIK['U'] = DIK_U;
m_VK2DIK['V'] = DIK_V;
m_VK2DIK['W'] = DIK_W;
m_VK2DIK['X'] = DIK_X;
m_VK2DIK['Y'] = DIK_Y;
m_VK2DIK['Z'] = DIK_Z;
m_VK2DIK['0'] = DIK_0;
m_VK2DIK['1'] = DIK_1;
m_VK2DIK['2'] = DIK_2;
m_VK2DIK['3'] = DIK_3;
m_VK2DIK['4'] = DIK_4;
m_VK2DIK['5'] = DIK_5;
m_VK2DIK['6'] = DIK_6;
m_VK2DIK['7'] = DIK_7;
m_VK2DIK['8'] = DIK_8;
m_VK2DIK['9'] = DIK_9;
m_VK2DIK[VK_LWIN] = DIK_LWIN;
m_VK2DIK[VK_RWIN] = DIK_RWIN;
m_VK2DIK[VK_APPS] = DIK_APPS;
m_VK2DIK[VK_NUMPAD0] = DIK_NUMPAD0;
m_VK2DIK[VK_NUMPAD1] = DIK_NUMPAD1;
m_VK2DIK[VK_NUMPAD2] = DIK_NUMPAD2;
m_VK2DIK[VK_NUMPAD3] = DIK_NUMPAD3;
m_VK2DIK[VK_NUMPAD4] = DIK_NUMPAD4;
m_VK2DIK[VK_NUMPAD5] = DIK_NUMPAD5;
m_VK2DIK[VK_NUMPAD6] = DIK_NUMPAD6;
m_VK2DIK[VK_NUMPAD7] = DIK_NUMPAD7;
m_VK2DIK[VK_NUMPAD8] = DIK_NUMPAD8;
m_VK2DIK[VK_NUMPAD9] = DIK_NUMPAD9;
m_VK2DIK[VK_MULTIPLY] = DIK_MULTIPLY;
m_VK2DIK[VK_ADD] = DIK_ADD;
m_VK2DIK[VK_SUBTRACT] = DIK_SUBTRACT;
m_VK2DIK[VK_DECIMAL] = DIK_DECIMAL;
m_VK2DIK[VK_DIVIDE] = DIK_DIVIDE;
m_VK2DIK[VK_F1] = DIK_F1;
m_VK2DIK[VK_F2] = DIK_F2;
m_VK2DIK[VK_F3] = DIK_F3;
m_VK2DIK[VK_F4] = DIK_F4;
m_VK2DIK[VK_F5] = DIK_F5;
m_VK2DIK[VK_F6] = DIK_F6;
m_VK2DIK[VK_F7] = DIK_F7;
m_VK2DIK[VK_F8] = DIK_F8;
m_VK2DIK[VK_F9] = DIK_F9;
m_VK2DIK[VK_F10] = DIK_F10;
m_VK2DIK[VK_F11] = DIK_F11;
m_VK2DIK[VK_F12] = DIK_F12;
m_VK2DIK[VK_F13] = DIK_F13;
m_VK2DIK[VK_F14] = DIK_F14;
m_VK2DIK[VK_F15] = DIK_F15;
m_VK2DIK[VK_NUMLOCK] = DIK_NUMLOCK;
m_VK2DIK[VK_SCROLL] = DIK_SCROLL;
}

InstCode
24-01-2004, 22:25
Clip thì dùng LPDIRECTDRAWCLIPPER ...

babylearntochat
25-01-2004, 14:11
Ba'c gio'i thieu so ve LPDIRECTDRAWCLIPPER duoc khong?
No' cu~ng co' vai tro` nhu 1 surface phai kho^ng?

babylearntochat
25-01-2004, 21:01
Ví dụ như tớ có 2 surface:
Sur1(800,600) chứa 1 bitmap 800,600 làm background
Sur2(400,400) chứa 1 bitmap hình con người

khi tui BltFast sur2 vào sur1 tại x=600,y=600, thì sur1 chẳgn có gì thay đổi cả,
còn khi blit vào tọa độ 0,0 của sur1 thì hình con người lại hiện lên, tui nghĩ là phải blit vào sao cho sur2 ko vượt qúa giới hạn của sur1 phải không?
Vậy có ai chỉ tui cách cắt bớt sur2 sao cho blit được vô sur1 ko?
vô cùng cám ơn

InstCode
25-01-2004, 22:48
Xài cái này để clip một hình vào một vùng cho trước để tránh blit những chi tiết dư thừa lên một surface ... Nó chỉ

đóng vai trò clipping cho một surface mà thôi !

Cách xài tương tự như làm với mấy interface khác :

B1. Khai báo một thằng IDirectDrawClipper : LPDIRECTDRAWCLIPPER pDDClipper;
B2. Có nhiều cách khởi tạo :
+ Trực tiếp : CoCreateInstance(..., &pDDClipper, ...) => Sau đó => pDDClipper->Initialize(...)
+ Đơn giản trực tiếp : DirectDrawCreateClipper(..., &pDDClipper, ...)
+ Tạo và attach với một DirectDraw inteface : IDirectDraw::CreateClipper(..., &pDDClipper, ...)
B3. Ánh xạ vùng cho phép blit : pDDClipper->SetClipList(...), trong này sẽ đặc tả một danh sách các vùng (mỗi

vùng xác định bởi một hình chữ nhật) cho phép blit lên, còn lại sẽ bị clip ...
B4. Attach với một cửa sổ : pDDClipper->SetHWnd(...), pDDClipper->GetHWnd(...)
B5. Attach với một surface : IDirectDrawSurface7::SetClipper(...), pass 'NULL' pointer vào hàm trên là detach,

muốn lấy đối tượng từ surface thì dùng IDirectDrawSurface7::GetClipper(...) ...
B6. Huỷ như thông thường IDirectDrawClipper::Release() hoặc CoUninstal...

Bác coi thêm tài liệu đi ... Lượm mấy cuốn DirectX SDK của M$ íí...!...

Tiện đây cho hỏi, có ai có mấy cuốn ebook về lập trình Game với DirectX như :
+ Cutting Edge Direct3D Prgramming (???)
+ Programming Role Playing Game with DirecX (???)
+ Effective ... DirectX ... (???)
+ ... (sách về DirectX) ... (???)
... cho em xin FREE (hic, nó ở chỗ amazon không à !!!). Cám ơn trước !...

babylearntochat
26-01-2004, 18:31
Cho tui hỏi ở B5, surface bác nói đó là surface nào? surface nguồn hay là đích?
Tui làm mãi mà hông được, thôi thì bác có hướng dẫn nào có ví dụ cụ thể thì cho tui xin nhá, thanks

InstCode
27-01-2004, 11:55
Cho tui hỏi ở B5, surface bác nói đó là surface nào? surface nguồn hay là đích?
Tui làm mãi mà hông được, thôi thì bác có hướng dẫn nào có ví dụ cụ thể thì cho tui xin nhá, thanks

- Surface đó là Primary (Front) Surface hoặc là cái Surface mà bác muốn blit lên í ...



Ví dụ như tớ có 2 surface:
Sur1(800,600) chứa 1 bitmap 800,600 làm background
Sur2(400,400) chứa 1 bitmap hình con người

khi tui BltFast sur2 vào sur1 tại x=600,y=600, thì sur1 chẳgn có gì thay đổi cả,
còn khi blit vào tọa độ 0,0 của sur1 thì hình con người lại hiện lên, tui nghĩ là phải blit vào sao cho sur2 ko vượt qúa giới hạn của sur1 phải không?
Vậy có ai chỉ tui cách cắt bớt sur2 sao cho blit được vô sur1 ko?
vô cùng cám ơn

- Cái này thì tui nghĩ bác sai ở đâu đó rồi !... Clipping chỉ tránh blit vào những vùng vô ích thui ... Coi lại phần create, blit, flip ....

babylearntochat
27-01-2004, 14:00
Không đâu , tui đã thử blit lên các tọa độ khác nhau, nếu sur2 mà vượt quá sur1 (tức là mình chỉ blit 1 phần của sur2 lên sur1, phần còn lại vượt quá màn hình nên ko thấy) thì chỉ thấy sur1 thôi ( mà lẽ ra phải thấy sur1 làm nền và 1 phần của sur2 nằm trên sur1).
Nếu sur2 kô tràn quá màn hình thì vẫn được bình thường

InstCode
27-01-2004, 16:43
À, xin lỗi ... Nếu vượt quá màn hình thì phải clip thôi ... Thử dùng theo cách trên xem có được không ? Nếu tui nhớ không lầm thì bộ DirectX SDK phần DD có ví dụ clipping đó ... Bác kiếm lại thử xem ...

babylearntochat
27-01-2004, 17:13
Cám ơn nhìu mấy câu trả lời của bác,Tui hổng có DX SDK, chỉ có MSDN thui, trong đó cũng có ví dụ nhưng ít và không rõ ràng, nên tui mới cầu cứu các bác đấy, bác có DX SDK thì gửi cho tui mí ví dụ đó đi, thank lần nữa.
Mail tui: semit_semit@yahoo.com

babylearntochat
01-02-2004, 13:10
Ủa sao ko có ai trả lời zậy?

InstCode
03-02-2004, 09:51
Hí ... mấy hôm nay bận đi sinh hoạt lớp nên ít lên ...
Thôi để tối tui viết cái demo rồi gửi lên ... Nhưng giờ bác có thể dùng mấy giải thuật clipping để cắt bỏ phần dư ấy đi ... Thường LPDDCLP chỉ dùng để clip trong vùng hiển thị của màn hình mà thui ... Vậy hén ... Ủa, sao bác CrazyBabe chủ xị hổng trả lời dùm đi ...

CrazyBabe
03-02-2004, 11:21
All stuff at http://www.chobanchotoi.com/download/crazybabe/Avenus2D.zip and http://www.chobanchotoi.com/download/crazybabe/AvenusTutor.zip, that require http://www.chobanchotoi.com/download/crazybabe/DirectXLib.zip

babylearntochat
04-02-2004, 14:13
Tui dùng VC chứ đâu dùng Delphi như ông

CrazyBabe
04-02-2004, 23:56
Má ơi, zị không đọc được code nữa àh ? Pó toàn thân.
Tôi không có cái kiểu gắp bỏ tận mồm mô, sozzy hén.

babylearntochat
05-02-2004, 12:04
Ông nói CODE gì, tui mới download cái Avenus , nghe nói dùng cho delphi nên tui đâu có đụng tới, gắp bỏ tận mồm là sao, tui chỉ hỏi zề 1 cái duy nhứt thôi mà nói nặng zậy hả

CrazyBabe
06-02-2004, 00:56
Gòi oi, nói năng giề ? Điên àh...
Ý tui là kô làm kĩ đến mức đấy được, làm ơn đọc code delphi mà hiểu đi. Nó đơn giản quá gồi ?
PS: Mấy pa toàn trầm trọng hóa ý tôi nói thui, hic hic... mai này chắc hổng dám dùng từ tượng thanh+thành ngữ nữa....

InstCode
08-02-2004, 09:33
Hey .. Cáo lỗi ... Lâu nay bận quá nên chưa viết kịp ...

Demo này tui clip cho cái Primary Surface, chạy lên (fullscreen/windowed mode) thì bác để ý có một cái đống lửa nhỏ nhỏ cháy bên cạnh một đống bự hơn, đống bự đã bị clip rồi !... Hic, chương trình đơn giản, chưa bẫy hết lỗi (thêm mấy cái if ... then ... else ấy mà :-)...)

Chú ý : nếu bác dùng BltFast thay cho Blt thì sẽ không chạy được đâu nhá !

frozenheart
09-02-2004, 08:56
Tôi cũng đang kiếm DX SDK, có địa chỉ mà ko tải nổi, có bán CD ko vậy?

Mach2
09-02-2004, 10:01
Hồi xửa hồi xưa CB có 1 bộ Game Kit: http://www.diendantinhoc.com/showthread.htm?t=22836, ko biết bi giờ hắn còn bán ko. Nếu bạn ở HN thì liên hệ hắn thử xem.
to CB: bán được thì nhớ tiền hoa hồng cho anh hẩy? :P

babylearntochat
11-02-2004, 17:33
Hey .. Cáo lỗi ... Lâu nay bận quá nên chưa viết kịp ...

Demo này tui clip cho cái Primary Surface, chạy lên (fullscreen/windowed mode) thì bác để ý có một cái đống lửa nhỏ nhỏ cháy bên cạnh một đống bự hơn, đống bự đã bị clip rồi !... Hic, chương trình đơn giản, chưa bẫy hết lỗi (thêm mấy cái if ... then ... else ấy mà :-)...)

Chú ý : nếu bác dùng BltFast thay cho Blt thì sẽ không chạy được đâu nhá !

Thì ra là vậy, BltFast hông dùng được , sao bác hông nói sớm , tui cũng có đọc ít tài lịu nói BltFast hông xài được , thank bác nhá lol

Lost myWay
17-05-2004, 04:36
Cho tui hỏi tí nị nhá? Dùng cái DirectDrawSurface có sài được ba cái hiệu ứng Blending không nhỉ? Trường hợp không có thì chỉ cho tui xíu xíu cách lập trình cái hiệu ứng đó với nhá. Hay một manh mối gì đó càng tốt.
Many thanks.!

ipvn
11-06-2005, 15:00
sao bac viet code loang ngoang vay, noi r ra duoc khong

Cong Thanh
02-06-2008, 09:20
Minh không tải được mã nguồn nữa! Có ai con cho minh xin nha!
Hic hic!

amda641
09-03-2009, 22:32
Có ai giúp mình cái vấn đề này với :
Mình vẽ một mình hộp 3d sau đó cho nó quay theo tọa độ x,y,z bây giờ có một yêu cầu đặt gia như thế này :
Mình muốn khi nhấn một phím nào mình chỉ định, thì cái hình hộp của mình nó sẽ dừng lại đúng vị chí lúc mình nhấn vào mình bỏ khỏi nút nhấn thì nó tiếp tục quay với vị trí lúc nhấn, mình bị vướng chỗ khi mình nhấn thì nó dừng quay nhưng vị trí của nó thì không dừng đúng vị trí nút nhấn, hai là khi bỏ tay ra khỏi nút nhấn thì nó quay nhưng vị trị của nó cũng không quáy tiếp tục chỗ mình nhấn
Các bạn xem code rồi cho mình ý kiến
còn đây là cả bài đầy đủ :http://www.mediafire.com/?yog1zwhmmeu
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
LRESULT CALLBACK WinProc (HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInst;
HWND wndHandle;

//khai bao bien con tro
LPDIRECT3D9 pD3D;//->doi tuong 3D
LPDIRECT3DDEVICE9 pd3dDevice; //->thiet bi ket xuat
LPDIRECT3DVERTEXBUFFER9 buffervertex=NULL;//->vung dem
LPDIRECT3DTEXTURE9 pTexture;


//khai bao mau
bool initWindow(HINSTANCE);
bool initDirect3D();
bool initvertex();
void game_run(HWND);
void game_end(HWND);
void SetCamera(void);
void SetPerspective(void);
void SetRotation(void);
void initLight(void);

#define D3DFVF_MYVERTEX D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1
#define SafeRelease(pObject)if(pObject!=NULL){pObject->Release();pObject=NULL}
#define KEY_DOWN(vk_code)((GetAsyncKeyState(vk_code)& 0x8000)?1:0)
#define KEY_UP(vk_code)((GetAsynckeyState(vk_code)& 0x8000)?1:0)

D3DXMATRIX matWorld1,matWorld1X,matWorld1Y,matWorld1Z,
matWorld2,matWorld2X,matWorld2Y,matWorld2Z,matWorl dTranslate2,
matWorld3,matWorld3X,matWorld3Y,matWorld3Z,matWorl dTranslate3;

//khai bao cau truc
struct customvertex
{
float x,y,z;
D3DVECTOR normal;
float u,v;
};
//mang kieu cau truc gom cac dinh cua khoi hinh hop se show ra man hinh
customvertex myvertex[]={
//top face
{-5.0f,5.0f,-5.0f,0,1,0,0.0f,1.0f},
{-5.0f,5.0f,5.0f,0,1,0,0.0f,0.0f},
{5.0f,5.0f,-5.0f,0,1,0,1.0f,1.0f},
{5.0f,5.0f,5.0f,0,1,0,1.0f,0.0f},
//face 1
{-5.0f,-5.0f,-5.0f,1,1,1,0.0f,1.0f},
{-5.0f,5.0f,-5.0f,1,1,1,0.0f,0.0f},
{5.0f,-5.0f,-5.0f,1,1,1,1.0f,1.0f},
{5.0f,5.0f,-5.0f,1,1,1,1.0f,0.0f},
//face 2
{5.0f,-5.0f,5.0f,1,0,0,0.0f,1.0f},
{5.0f,5.0f,5.0f,1,0,0,0.0f,0.0f},
//face 3
{-5.0f,-5.0f,5.0f,0,0,1,1.0f,1.0f},
{-5.0f,5.0f,5.0f,0,0,1,1.0f,0.0f},
//face 4
{-5.0f,-5.0f,-5.0f,-1,0,0,0.0f,1.0f},
{-5.0f,5.0f,-5.0f,-1,0,0,0.0f,0.0f},
//face 5
{5.0f,-5.0f,-5.0f,0,-1,0,0.0f,1.0f},
{5.0f,-5.0f,5.0f,0,-1,0,0.0f,0.0f},
{-5.0f,-5.0f,-5.0f,0,-1,0,1.0f,1.0f},
{-5.0f,-5.0f,5.0f,0,-1,0,1.0f,0.0f},

};
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{

if (!initWindow(hInstance))
return false;
if (!initDirect3D())
return false;
if(!initvertex())
return false;

MSG msg;
ZeroMemory(&msg, sizeof(msg));

while (msg.message !=WM_QUIT)
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{

TranslateMessage (&msg);
DispatchMessage (&msg);

}
else
{
game_run(wndHandle);
}
return (int) msg.wParam;//ep kiu
}
bool initWindow(HINSTANCE hInstance)
{
WNDCLAS*** wcex;
wcex.cbSize = sizeof(WNDCLAS***);
wcex.style = CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc = WinProc;
wcex.cbWndExtra = 0;
wcex.cbCl***tra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"About Window";
wcex.hIconSm = 0;


RegisterClas*** (&wcex);
wndHandle = CreateWindow(L"ABout Window",
L"The Hello Program",
WS_OVERLAPPEDWINDOW,//->che do cua so
//WS_EX_TOPMOST|WS_POPUP|WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
NULL,
NULL,
hInstance,
NULL );

if (!wndHandle)
return false;

ShowWindow(wndHandle, SW_SHOW);
UpdateWindow(wndHandle);

return true;
}

bool initDirect3D(void)
{
pD3D = NULL;
pd3dDevice = NULL;
if(NULL==(pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
{
return false;
}
D3DPRESENT_PARAMETERS d3dpp;
//xoa bo nho con tro
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed =true;//->che do cua so
//d3dpp.Windowed =false;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;//->che do cua so
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferHeight =600;
d3dpp.BackBufferWidth =800;
d3dpp.hDeviceWindow = wndHandle;
//cho fep tinh do xau
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;

if (FAILED (pD3D ->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,
wndHandle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&pd3dDevice)))
{
return false;
}
D3DXCreateTextureFromFile(pd3dDevice,L"13.jpg",&pTexture);

//tat anh sang


pd3dDevice->SetRenderState(D3DRS_LIGHTING,true);

pd3dDevice->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(50,50,5 0));
/*cho fep tinh do xau
pd3dDevice->SetRenderState(D3DRS_ZENABLE,true);*/
return true;
}

//ham ve hinh len vung dem
void game_run(HWND wndHandle)
{
pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
pd3dDevice->Clear(0,NULL,D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);//cho fep tinh do xau
pd3dDevice->SetTexture(0,pTexture);


pd3dDevice->BeginScene();

//goi ham
SetRotation();
SetCamera();
SetPerspective();
initLight();
//chỉ định khi nhấn phim a thì hình sẽ dừng lại, khi bỏ ra thì tiếp tục quay
//vấn đề là chỗ này mong chỉ dúp
if(KEY_DOWN(0x41))
{
D3DXMatrixTranslation(&matWorld1,timeGetTime()/800.0f,timeGetTime()/800.0f,timeGetTime()/800.0f);

}
else
{

}
pd3dDevice->SetStreamSource(0,buffervertex,0,sizeof(customvert ex));
pd3dDevice->SetFVF(D3DFVF_MYVERTEX);

pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld1);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);//diem,dt,tamgic,hinh vuong<->point,line,triangle,quad
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,8);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,14,2);
pd3dDevice->EndScene();
//xuat file anh ra man hinh
pd3dDevice->Present(NULL,NULL,NULL,NULL);


}

LRESULT CALLBACK WinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}

//ham khai bao & khoi tao vertexbuffer
bool initvertex (void)
{

HRESULT result;
result=pd3dDevice->CreateVertexBuffer(sizeof(customvertex)*sizeof(myv ertex),
0,
D3DFVF_MYVERTEX,//FVF<->Flexible Vertex Format->do co gian
D3DPOOL_DEFAULT,
&buffervertex,//lay dia chi con tro
NULL);

//test
if FAILED(result)
return false;

VOID* pVertices;//tro toi kiu du lieu chua bit truoc

//khoa buffer
result=buffervertex->Lock(0,sizeof(myvertex),(void**)&pVertices,0);

//test
if FAILED(result)
return false;
//memcpy
memcpy(pVertices,myvertex,sizeof (myvertex));

//mo khoa buffer
buffervertex ->Unlock();

//return S_OK;


return true;

}
//ham xoay
void SetRotation()
{

D3DXMatrixRotationX(&matWorld1X, timeGetTime()/800.0f);// toa do x,goc quay
D3DXMatrixRotationY(&matWorld1Y,timeGetTime()/800.0f);// toa do y...
D3DXMatrixRotationZ(&matWorld1Z,timeGetTime()/800.0f);//toa do z
//nhan ma tran xoay
D3DXMatrixMultiply(&matWorld1,&matWorld1X,&matWorld1Y);
D3DXMatrixMultiply(&matWorld1,&matWorld1,&matWorld1Z);

pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld1);


}
//ham view
void SetCamera()
{
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f,0.0f,-60.0f),//koag cach giua anh va camera(tam nhin)
&D3DXVECTOR3(0.0f,0.0f,0.0f),//nhin goc toa do
&D3DXVECTOR3(0.0f,1.0f,0.0f));//huong nhin len theo truc y

pd3dDevice->SetTransform(D3DTS_VIEW,&matView);
}
//ham chieu
void SetPerspective()
{
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,500.0f);
pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}

void initLight()
{
D3DLIGHT9 light;//create the light struct
D3DMATERIAL9 material;//create the material struct

ZeroMemory (&light,sizeof(light));//clear out the struc for use

light.Type=D3DLIGHT_DIRECTIONAL;//make the light type 'direttional light'
light.Diffuse.r =0.5f;//.5 red
light.Diffuse.g=0.5f;//.5 green
light.Diffuse.b=0.5f;//.5 blue
light.Diffuse.a= 1.0f ;//full alpha (we'll get too that soon)

D3DVECTOR vecDirection ={0.0f,-3.0f,-1.0f};//the direction of the light
light.Direction=vecDirection;//set the direction
pd3dDevice->SetLight(0,&light);//send the light struct properties to light #0
pd3dDevice->LightEnable(0,TRUE);//turn on light #0

ZeroMemory(&material,sizeof(D3DMATERIAL9));//clear out the struc for use
material.Diffuse.r=material.Ambient.r = 1.0f;//set the material to full red
material.Diffuse.g=material.Ambient.g = 1.0f;//set the material to full green
material.Diffuse.b=material.Ambient.b = 1.0f;//set the material to full blue
material.Diffuse.a=material.Ambient.a = 1.0f;//set the material to full alpha

pd3dDevice ->SetMaterial(&material);//set the globably-use

}

[=========> Bổ sung bài viết <=========]

sao không có ai cho mình ý kiến vậy, cho mình hỏi tiếp câu nữa, trong bài trên có sử dụng hàm :
timeGetTime():ý nghĩa của nó để lấy giờ hệ thông, vậy có hàm nào đặt được giờ hệ thống không bạn

BoCatTrang
22-06-2009, 16:03
Hi CrazyBabe!
Minh tên là Lăng, mình rất hứng thứ học lập trình game, chúng ta làm wen nhé, bạn có nhóm nào phát triển game ko? Cho mình tham gia với
Nick Yahoo: choem1001
Nick Skype: choem1001
Email: vuvanlang@gmail
Là bạn là con trai hay gái nhỉ? Nếu con trai thì tiện hơn !Hi`

killslove
22-09-2011, 10:49
up giùm bạn. có gì sang ủng hộ mình

spawn1590
17-10-2011, 18:13
uppppppppppppppppppppppppppppppppppppppp

onlyechi
11-11-2011, 16:32
tkssssssssssssssssssss!

onlyechi
11-11-2011, 16:33
tkssssssssssssssss!
!!!!!!

tiendolax
21-11-2011, 17:36
uppppppppppppppppppppppppppppp

jakiroo0o
23-10-2012, 11:57
Dùng cái DirectDrawSurface có sài được ba cái hiệu ứng Blending không nhỉ? Trường hợp không có thì chỉ cho tui xíu xíu cách lập trình cái hiệu ứng đó với nhá. Hay một manh mối gì đó càng tốt.