Rất nhiều nhà lập trình thích làm những trò chơi hành động thực. Vì vậy những hình ảnh tĩnh sẽ không thể làm cho họ có hứng thú. Sử dụng những kỹ thuật hoạt hình đơn giản sau đây có thể tạo ra những hình ảnh chuyển động : · Tạo ảo giác về sự chuyển động bằng cách ghi một loạt hình ảnh liên tiếp biểu diễn những thay dổi vị trí từ từ của đối tượng cần biểu diễn, rồi hiển thị lại các hình ảnh đó đủ nhanh sao cho mắt cảm thấy hình ảnh chuyển động tự nhiên không bị giật. · Về đồ hoạ, kỹ thuật hoạt hình đạt được bằng một vài cách tuỳ thuôc vào ngôn ngữ lập trình và môi trường làm việc. - Thứ nhất là vẽ một hình ảnh, sau đó xóa đi và vẽ lại hình ảnh đó ở vị trí khác một chút so với vị trí trước. - Hoạt hình được tạo ra trong thời gian thực (trong đó mỗi frame được tạo ra như là một khung nhìn) và trong cả thời gian mô phỏng. - Để tạo được thứ tự hoạt ảnh thành công, các hình ảnh phải thay thế nhau một cách đủ nhanh để đánh lừa con mắt người xem khi xem những hình ảnh liên tục, ít nhất là 14 frame mỗi giây. Đối với những ứng dụng tạo trò chơi, ta chỉ cần từ 6 – 10 frame / s để tiết kiệm tiền và thời gian xử lý của CPU. Phạm vi tốt nhất cho kỹ thuật hoạt hình chất lượng là từ 14 – 30 frame /s. Ví dụ: · Để tạo ra một hoạt ảnh đơn giản, ta cần ít nhất hai hình ảnh khác nhau. A = B = Cách đơn giản để hiển thị hình ảnh này cần thực hiện qua các bước sau: - Xoá ngoài màn hình - Vẽ hình ảnh A lên màn hình - Cập nhật hình ảnh thực - Delay vài ms để người quan sát nắm được hình ảnh. Nếu ta dùng kỹ thuật hoạt hình 10 frame / s thì thời gian delay là 1000/10=100 ms - Lặp lại bước 1 nhưng ở bước 2 ta thay hình ảnh A bằng hình ảnh B. · Đối với hành động của đối tượng hoạt hoạ quá phức tạp, ví dụ như người đang chạy, các frame liên tiếp cho kỹ thuật này là 10 frame hoặc hơn. Điều đó tương đương với cần 10 file hình ảnh. Vì thấ có thể gặp một vấn đề là quản lý file. Để giảm bớt số lượng file hình ảnh, ta hợp chúng lại thành một hình ảnh. · Ta có thể tạo hoạt ảnh đơn giản bằng cách chia hình ảnh trên thành 4 phần và vẽ mỗi phần đó lên màn hình từ trái sang phải. Sau đây là đoạn chương trình: // sample.rc #include "windows.h" 100 BITMAP ninja.bmp // replace to startup.c LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam) { HDC hDC, hMemDC; HBITMAP hBitmap; int nCnt; switch(message) { case WM_LBUTTONDOWN: hDC = GetDC(hWnd); hBitmap = LoadBitmap(g_hInst, MAKEINTRESOURCE(100)); hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hBitmap); ReleaseDC(hWnd,hDC); for(nCnt=0; nCnt<4; nCnt++) { PatBlt(hOffscreebDC, 0, 0, 240, 320, WHITENESS); TransparentImage(hOffscreenDC,nCnt*4,0,46,57,hMemDC,nCnt*46,0,46,57, RGB(255,0,255)); Sleep(100); UpdateDisplay(hWnd); } DeleteDC(hMemDC); DeleteObject(hBitmap); break; case WM_KEYDOWN: DestroyWindow(hWnd); break; case WM_CREATE: InitOffscreen(240, 320); break; case WM_DESTROY: DeinitOffscreen(); PostQuitMessage(0); break; default: DefWindowProc(hWnd, message, uParam, lParam); } return 0; } · Bước tiếp theo, ta cần điều khiển vị trí đối tượng trên màn hình. Giả sử ta gọi đối đó là GAME OBJECT hoặc SPRITE OBJECT. Để điều khiển vị trí của đối tượng, ta cần lưu lại vị trí hiện tại của nó. - Ta cần một kiểu dữ liệu POINT trong Win32 SDK. Kiểu dữ liệu POINT gồm hai thành phần: x và y. Kiểu này được khai báo như sau : typedef _tagPOINT { int x; int y; } POINT; - Một kiểu dữ liệu nữa cần sử dụng là kiểu SIZE, giống như kiểu POINT nó cũng có hai thành phần cx và cy typedef _tagSIZE { int cx; int cy; } SIZE; - Ta sẽ sử dụng hai kiểu trên để điều khiển các đối tượng trong trò chơi. Dùng thêm một biến là bộ đếm các frame. Nó được sử dụng để điều khiển hành động của các đối tượng. · Ta cần tạo ra Screen Saver như một chương trình và để đối tượng chuyển động trên nó. Vị trí bắt đầu là ngẫu nhiên. · Kế hoạch chương trình: - Tạo các biến vị trí và tải nguồn ảnh vào một biến toàn cục - Tạo vòng lặp của 10 đối tượng - Xoá màn hình OffScreen - Di chuyển các đối tượng bằng cách thay đổi các biến vị trí - Cập nhật bộ đếm các frame - Vẽ đối tượng vào vị trí của nó - Nếu vị trí ở ngoài màn hình thì ngẫu nhiên bắt đàu một vị trí mới. - Sau khi kết thúc vòng lặp thì cập nhật màn hình thực - Thời gian delay là 50 ms để người quan sát nắm được hình ảnh - Bắt đầu vòng lặp - Huỷ bỏ ảnh được tải lên Sau đây là đoạn chương trình: // sample.rc #include "windows.h" 100 BITMAP ninja.bmp // replace to startup.c #DEFINE TRASNCOLOR RGB(255,0,255) sattic HBITMAP hObjBitmap; static POINT ObjPosition[10]; static int nFrameCounter[10]; static SIZE ObjSize; static void FirstInit(void) { int nCount; InitOffscreen(240, 320); hObjBitmap = LoadBitmap(g_hInst, MAKEINTRESOURCE(100)); ObjSize.cx = 40; ObjSize.cy = 57; for(nCount=0; nCount<10; nCount++) { ObjPosition[nCount].x = -(Random() % 100); ObjPosition[nCount].y = Random() % (320 - ObjSize.cy); nFrameCounter[nCount] = 0; } } static void Deinit(void) { DeinitOffscreen(); DeleteObject(hObjBitmap); } static void RenderFrame(HWND hWnd) { HDC hDC, hMemDC; int nCnt, x, y, frameno; hDC = GetDC(hWnd); hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hObjBitmap); ReleaseDC(hWnd,hDC); PatBlt(hOffscreebDC, 0, 0, 240, 320, WHITENESS); for(nCnt=0; nCnt<10; nCnt++) { x = ObjPosition[nCnt].x; y = ObjPosition[nCnt].y; frameno = nFrameCounter[nCnt] * ObjSize.cx; TransparentImage(hOffscreenDC,x,y,ObjSize.cx,ObjSize.cy,hMemDC,frameno,0,ObjSize.cx,ObjSize.cy, TRASNCOLOR); ObjPosition[nCnt].x += 4; if(ObjPosition[nCnt].x + ObjSize[nCnt] > 240) ObjPosition[nCount].x = -(Random() % 100); nFrameCounter[nCnt]++; if(nFrameCounter[nCnt] > 4) nFrameCounter[nCnt] = 0; } UpdateDisplay(hWnd); DeleteDC(hMemDC); } LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam) { switch(message) { case WM_TIMER: RenerFrame(hWnd); break; case WM_KEYDOWN: DestroyWindow(hWnd); break; case WM_CREATE: FirstInit(); SetTimer(hWnd,1,50,0); break; case WM_DESTROY: Deinit(); PostQuitMessage(0); break; default: DefWindowProc(hWnd, message, uParam, lParam); } return 0; } KienDN – ThuyNT DohoaVietNam.com
--Bài viết của Finallegend khá hay. --Finallgend có muốn tham gia vào nhóm VietNam-Maker không vậy ::) .
ồ cái nay khá hay đấy .1 cách dựng hình kiểm image ready đúng ko :) cứ xoá , vẽ rồi lại xoá , vẽ , Bạn tự viết tất cả hay đọc được từ đâu vậy Nếu mà bạn tự viết tất thì có vẻ bạn là một dân chuyên nghiệp trong đồ hoạ phải không
::) Ông ráng post thêm một bài này bên hàng xóm Thảo Luận Chung cho mod bên đó nó mừng cái. Bên đấy có mấy tay lão làng. Họ sẽ mổ xẻ bài của ông ra, vạch là tìm sâu, đảm bảo không dưới 5 lỗi. Nhờ đó box bên đấy sẽ active hơn. Cảm ơn đã post một bài có nhiều giá trị.
ổng có đưa web cuối bài đó, bộ mù à anh heo ơi, cho em link down engine hge gì đó với, anh giải thích hộ em cái nì với, hic tại ko ai bàn về statement hết for (<statement1> ; <expression> ;<statement2>) <statement3> ex: { for (i=0; i<=9; i+=1) list = i+1; } anh giải thích cặn kẽ cái nì được ko, nó có nói sơ wa mà đọc ko hiểu. có mấy cái em hiểu rùi nhưng tiện thể post lun, nhờ anh đấy random(x) Returns a random real number between 0 and x. The number is always smaller than x. abs(x) Returns the absolute value of x. sign(x) Returns the sign of x (-1, 0 or 1). round(x) Returns x rounded to the nearest integer. floor(x) Returns the floor of x, that is, x rounded down to an integer. ceil(x) Returns the ceiling of x, that is, x rounded up to an integer. frac(x) Returns the fractional part of x, that is, the part behind the decimal dot. sqrt(x) Returns the square root of x. x must be non-negative. sqr(x) Returns x*x. power(x,n) Returns x to the power n. exp(x) Returns e to the power x. ln(x) Returns the natural logarithm of x. log2(x) Returns the log base 2 of x. log10(x) Returns the log base 10 of x. logn(n,x) Returns the log base n of x. sin(x) Returns the sine of x (x in radians). cos(x) Returns the cosine of x (x in radians). tan(x) Returns the tangent of x (x in radians). arcsin(x) Returns the inverse sine of x. arccos(x) Returns the inverse cosine of x. arctan(x) Returns the inverse tangent of x. arctan2(y,x) Calculates arctan(Y/X), and returns an angle in the correct quadrant. degtorad(x) Converts degrees to radians. radtodeg(x) Converts radians to degrees. min(val1,val2,val3,...) Returns the minimum of the values. The function can have up to 16 arguments. They must either be all real or all strings. max(val1,val2,val3,...) Returns the maximum of the values. The function can have up to 16 arguments. They must either be all real or all strings. mean(val1,val2,val3,...) Returns the average of the values. The function can have up to 16 arguments. They must all be real values. point_distance(x1,y1,x2,y2) Returns the distance between point (x1,y1) and point (x2,y2). point_direction(x1,y1,x2,y2) Returns the direction from point (x1,y1) toward point (x2,y2) in degrees. lengthdir_x(len,dir) Returns the horizontal x-component of the vector determined by the indicated length and direction. lengthdir_y(len,dir) Returns the vertical y-component of the vector determined by the indicated length and direction. is_real(x) Returns whether x is a real value (as opposed to a string). is_string(x) Returns whether x is a string (as opposed to a real value).
for (<statement1> ; <expression> ;<statement2>) <statement3> ex: { for (i=0; i<=9; i+=1) list = i+1; } Câu lệnh for cơ bản + ví dụ Giải thích cái gì đây 3
Chú cứ tưởng tượng có có 2 thèng. Một thèng hít đất, một thèng đếm. i = 0 : Khi thèng hít đất hít được cái đầu tiên thèng đếm ghi lại 0. i += 1: Khi nó hít được thêm một cái thì thèng đếm cộng thêm 1, nghĩa là cái thứ 2 thì nó ghi lại 1, cái thứ 3 thì nó ghi lại 2, v.v... i <= 9: Khi thèng ghi lại ghi đến số 9 thì ngưng không hít nữa. Trong quá trình thực hiện hít đất thì có những chuyện khác xảy ra: { list = i+1; } Vậy thôi. Mấy cái sau thuộc về Toán học, giải thích hết mớ đó thì có mà đến sáng mai. Thôi chú tự dịch đi.
còn mấy cái dưới, ko ai giải thích dùm à, mau đi mấy đại ca ơi, làm ơn nhanh cho em nhờ , dịch rùi nhưng đọc ko hiểu mới chết, được cái nào hay cái đó đi huynh
abs -> lấy giá trị tuyệt đối của x sign -> lấy dấu của x round -> làm tròn ựa zubachi nói quá đúng, làm xong đống này chit cha lun tự dịch đi, kêu là ở bên aus mà không biết tiếng Anh à
Mà ông VD đã học lập trình chút nào chưa đấy? Nếu chưa thì đi học đi là hiểu được 90% liền. (hình như là ông khoe ông có thể viết code thì phải! thế thì chắc là cố tình hỏi để sparm rồi!)
dạ em còn dở lắm đâu dám khoe khoang gì mấy anh làm ơn giải thích dùm em lệnh if then else được ko hu hu em ko biết gì hết còn mấy cái này nữa for (<statement1> ; <expression> ;<statement2>) <statement3> ex: { for (i=0; i<=9; i+=1) list = i+1; } anh giải thích cặn kẽ cái nì được ko, nó có nói sơ wa mà đọc ko hiểu. có mấy cái em hiểu rùi nhưng tiện thể post lun, nhờ anh đấy random(x) Returns a random real number between 0 and x. The number is always smaller than x. abs(x) Returns the absolute value of x. sign(x) Returns the sign of x (-1, 0 or 1). round(x) Returns x rounded to the nearest integer. floor(x) Returns the floor of x, that is, x rounded down to an integer. ceil(x) Returns the ceiling of x, that is, x rounded up to an integer. frac(x) Returns the fractional part of x, that is, the part behind the decimal dot. sqrt(x) Returns the square root of x. x must be non-negative. sqr(x) Returns x*x. power(x,n) Returns x to the power n. exp(x) Returns e to the power x. ln(x) Returns the natural logarithm of x. log2(x) Returns the log base 2 of x. log10(x) Returns the log base 10 of x. logn(n,x) Returns the log base n of x. sin(x) Returns the sine of x (x in radians). cos(x) Returns the cosine of x (x in radians). tan(x) Returns the tangent of x (x in radians). arcsin(x) Returns the inverse sine of x. arccos(x) Returns the inverse cosine of x. arctan(x) Returns the inverse tangent of x. arctan2(y,x) Calculates arctan(Y/X), and returns an angle in the correct quadrant. degtorad(x) Converts degrees to radians. radtodeg(x) Converts radians to degrees. min(val1,val2,val3,...) Returns the minimum of the values. The function can have up to 16 arguments. They must either be all real or all strings. max(val1,val2,val3,...) Returns the maximum of the values. The function can have up to 16 arguments. They must either be all real or all strings. mean(val1,val2,val3,...) Returns the average of the values. The function can have up to 16 arguments. They must all be real values. point_distance(x1,y1,x2,y2) Returns the distance between point (x1,y1) and point (x2,y2). point_direction(x1,y1,x2,y2) Returns the direction from point (x1,y1) toward point (x2,y2) in degrees. lengthdir_x(len,dir) Returns the horizontal x-component of the vector determined by the indicated length and direction. lengthdir_y(len,dir) Returns the vertical y-component of the vector determined by the indicated length and direction. is_real(x) Returns whether x is a real value (as opposed to a string). is_string(x) Returns whether x is a string (as opposed to a real value).
T__T thì tại vì VĐ quá đáng mà....T__T.. tui thế là tui die cho hết nói luôn... ken sao hiền dễ sợ zậy... huh... mà topic này sáo quá, cchs ra luôn.
trời ơi, ko biết mới hỏi mà trời, trời ngó xuống mà coi ông ken10 bạo ngược nà, ko biết hỏi cũng ko cho, viết bài dài cũng chém, ngắn cũng chém, nói chúng ngắn dài hay dở ổng chém tuốt. hic hic hic hic mà sao 2 tuần mới hết 1 cảnh cáo, bên muonline bị chém có 1 tuần là hết à,
.. bên MUOnline bị chém 1 tuần là hết là 1 tuần không được dùng nick, 7 ngày sau nó thả .. thích vậy thì kêu ken chém thêm 1 phát là đủ để bị GOV 7 ngày Đây là ken chém 2 phát nhưng mà vẫn còn để cho đường sống, tức là trong 2 tuần kia thì vẫn vào gamevn post bài được. Tức là ken vẫn còn hiền hơn máy chém bên đó :p
ai nói thế nó chém 1 nhát nhưng tui vẫn vào nick đó được mà, chắc lộn box nèo rùi phải ken10 hiền ghê lun ha ha ha, hiền như quỉ sa tăng vậy đoá
Ken 10 cho hỏi một cái ,muồn chuyển một game từ vt qua hệ chuyên dung thì phải làm sao (ps2 chẳng hạn.) Cơ hội làm việc tại gameslost .công ti game của pháp. GFX 2D “BASIC” GAMELOFT TEST 1) CREATING A “SEAL” SPRITE IN ISOMETRIC VIEW: Here is a 3D counter-strike “SEAL” character: The goal of this test is to create an isometric “sprite” of 32X32 pixels and in 16 colors, drawing inspiration from the above character ONLY for the general appearance. The lines must be clear, with each pixel in its place, and this should not be a reduction of a Photoshop drawing, with anti-alias (looking like a small photo). Mục đích của phần test này là tạo ra một isometric “sprite”, kích cỡ 32 x 32 pixels, 16 màu; CHỈ lấy cảm hứng từ nhân vật trên đây để xây dựng diện mạo chung cho nhân vật của bạn. Nét vẽ phải rõ ràng, với từng pixel đúng vị trí; và không nên là hình được thu giảm bằng Photoshop với anti-alias (trông giống một hình thu nhỏ). You should particularly accentuate the effects of perspective (isometric view) and relief (light, contrast). The sprite should appear to be in relief, with a clean, darker outline (like most video game sprites). The colors should be fresh and fairly saturated. The goal of this test is also to make a “cute” and rather sweet character, with a fairly large head, as in the following example: Bạn nên đặc biệt nhấn mạnh hiệu ứng phối cảnh (theo góc độ isometric) và phần làm nổi bật (ánh sáng, sự tương phản). “Sprite” phải nổi bật, với đường viền ngoài sắc sảo và đậm nét (giống như hầu hết các sprite trong video game). Màu sắc phải tươi và ít hòa màu trắng. Ngoài ra, mục tiêu của phần test này cũng nhằm tạo ra một nhân vật linh hoạt và khá dễ thương, có cái đầu khá to giống như ví dụ sau đây: 2) RACE ANIMATION: When you have created the sprite with pixels, you must produce a short race animation, using the same character. This time, the isometric view is not necessary. You can represent the character in profile. The number of animation frames is limited to 6. In the end, you should have an animated gif of 32X32 pixels, still in 16 colors. The animation should loop round on itself. Khi bạn đã tạo ra phần sprite có pixels rồi, thì việc kế tiếp là tạo ra 1 hình chuyển động chạy khoảng cách ngắn, sử dụng cùng một nhân vật trên. Lần này thì góc độ isometric không cần thiết. Bạn có thể hiển thị nhân vật theo mặt nghiêng. Số lượng khung (frame) chuyển động tối đa là 6 khung. Kết quả cuối cùng bạn nên có là 1 hình động dạng GIF, kích cỡ 32 x 32 pixels, vẫn với 16 màu. Vật thể sẽ chuyển động lặp đi lặp lại không ngừng. 3) DRAWN ILLUSTRATION: Create an illustration of a female Amazon warrior (pencil sketch in color or black-and-white) >> This must not be a static view. She should be in a guarding position or in action. She should also be very sexy (to be submitted in .jpg format) troop. Bạn hãy vẽ tranh minh họa một nữ chiến binh Amazon (nữ chiến binh trong truyện cổ), vẽ bằng bút chì, màu hoặc trắng đen. Hình vẽ này không nên đặt trong góc nhìn tĩnh. Nhân vật này nên được vẽ trong tư thế phòng thủ hoặc đang làm nhiệm vụ nào đó. Nữ chiến binh này trông phải gợi cảm (format dưới dạng .jpg). 4) CREATING A LOGO: Produce a rough draft “SEAL FORCE” logo (pencil sketch), then create a color pixel presentation (like the sprite, with no anti-alias, etc.) of around 100X50 pixels. Bạn hãy phác thảo logo của “SEAL FORCE” (seal force: binh lính đặc công) bằng viết chì. Sau đó, bạn tạo ra 1 bản vẽ pixel màu (tương tự như “sprite” của phần 1, không có anti-alias, v.v...) với kích thước khoảng 100 x 50 pixels. ALL WORK SHOULD BE SUBMITTED IN BMP OR GIF format (except the rough logo and the Amazon illustration which should be in jpg format of any size). Tất cả kết quả phải được format dạng BMP hoặc GIF (ngoại trừ logo và hình nữ chiến binh Amazon được format dạng JPG với kích thước tùy ý). Thanks, and good luck! Cám ơn nhiều và chúc bạn may mắn! Đăy là bài test để được nhận vào làm ,lương khá cao đó.
finallengend <- kiếm cái ps2 development kit về coi, chẳng có cách nào khác phải ngồi port từng dòng lệnh <- trên lý thuyết Cái gameloft ( chứ không phải gamelost ) là com phát triển chuyên nghiệp cho mobile <- ông nào muốn vào phải nghĩ đấy