Danh mục

Trò chơi xếp hình với VB6

Số trang: 9      Loại file: pdf      Dung lượng: 0.00 B      Lượt xem: 11      Lượt tải: 0    
Thư viện của tui

Hỗ trợ phí lưu trữ khi tải xuống: 1,000 VND Tải xuống file đầy đủ (9 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Chương trình sẽ cắt một hình cho trước ra thành nhiều mảnh có hình dạng ngẫu nhiên, và người chơi sẽ phải ráp từng mảnh lại. Trò chơi thật đơn giản nhưng lập trình để tạo trò chơi này không đơn giản chút nào. Bài viết giới thiệu một chương trình như vậy được thực hiện với VB6. Tạo Activex control Tạo một Standard Project mới. Vào menu Project/Add Usercontrol để thêm một Usercontrol mới (đặt tên tùy thích, ở đây tôi đặt là ShapeControl, AutoRedraw=True). Để tạo ShapeControl (SC) có hình dạng đặc biệt cần dùng 4 hàm API:...
Nội dung trích xuất từ tài liệu:
Trò chơi xếp hình với VB6 Trò chơi xếp hình với VB6 Chương trình sẽ cắt một hình cho trước ra thành nhiều mảnh có hình dạng ngẫu nhiên, và người chơi sẽ phải ráp từng mảnh lại. Trò chơi thật đơn giản nhưng lập trình để tạo trò chơinày không đơn giản chút nào. Bài viết giới thiệu một chương trình như vậy được thực hiện vớiVB6.Tạo Activex controlTạo một Standard Project mới. Vào menu Project/Add Usercontrol để thêm một Usercontrol mới(đặt tên tùy thích, ở đây tôi đặt là ShapeControl, AutoRedraw=True). Để tạo ShapeControl (SC)có hình dạng đặc biệt cần dùng 4 hàm API: CreateRectRgn, CreateEllipseticRgn, CombineRgnvà SetWindowRgn. Khai báo các hàm trên trong SC. Khai báo thêm hàm DeleteObject dùng đểhủy đối tượng đã tạo để giải phóng bộ nhớ.Để thuận tiện cho việc tạo hình cho SC, ta sử dụng cấu trúc để lưu trữ dữ liệu các cạnh:Private Type CauTrucTop As LongBottom As LongLeft As LongRight As LongEnd TypeFunction sau tạo hình cho SC:Private Function CreateFormRegion(ScaleX As Single, ScaleYAs Single, OffsetX As Integer, OffsetY As Integer, DrawStyleAs CauTruc) As LongHình chữ nhật chính có tọa độ (22,22)-(77,77), hình ellipse cóbán kính lớn=22 và bán kính nhỏ=13 (H.1). Do hình ảnh chúngta muốn cắt có chiều rộng và chiều dài bất kì nên ta phải nhântỉ lệ này cho chiều dài, rộng thực của mỗi miếng hình nhỏ(bằng với chiều dài và chiều rộng của SC, do SC sẽ là mỗimiếng hình nhỏ).Các giá trị Top, Left, Right, Bottom trong CauTruc có thể nhận các giá trị -1, 0, 1. Nếu Top nhậngiá trị 1 có nghĩa là hình chữ nhật sẽ kết hợp với hình ellipse (H.2), nếu nhận giá trị 0 nghĩa làkhông có hình ellipse, còn giá trị -1 thì ellipse sẽ cắt hình chữ nhật (H.3) (tương tự cho Left,Right và Bottom). Bạn sẽ thấy cách qui định giá trị này rất hữu ích trong các bước sau.Sở dĩ khai báo Function CreateFormRegion là Private vì nếu bạn chuyển qua Public thì khi chạychương trình, VB sẽ báo lỗi là kiểu người dùng định nghĩa (CauTruc) không được làm đối số(chỉ khi nào bạn tạo ActiveX Control riêng và biên dịch thành *.ocx mới không gặp lỗi này). Dođó ta phải tạo 1 Sub có tính Public gọi Function này. Sub này sẽ trở thànhmột Method của SC.Public Sub DrawShape(vLeft As Long, vTop As Long, vRight As Long,vBottom As Long)Dim DrawStyle As CauTrucDim nRet As LongDrawStyle.Left = vLeftDrawStyle.Top = vTopDrawStyle.Right = vRightDrawStyle.Bottom = vBottomnRet = SetWindowRgn(UserControl.hwnd, CreateFormRegion(1, 1, 0, 0, DrawStyle), True)End SubBây giờ thêm các Property phục vụ cho việc đồ họa:Public Property get hWnd() as LonghWnd=Usercontrol.hWndEnd PropertyPublic Property get hDC() as LonghDC=Usercontrol.hDCEnd PropertyĐể di chuyển SC (không có TitleBar) dễ dàng, bạn phải capture chuột và mô phỏng việc nhấnvà rê chuột trái (khai báo thêm 2 API là ReleaseCapture và SendMessage ở phần khai báo cáchàm API):Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y AsSingle)ReleaseCaptureSendMessage UserControl.hwnd, &HA1, 2, 0&End SubNgoài ra, để có thêm nhiều sự kiện (Event) như MouseMove, MouseUp, Resize,... bạn khai báocác sự kiện này ở đầu code:Public (Các đối số)Và khi UserControl xảy ra sự kiện nào thì bạn báo hiệu (RaiseEvent) sự kiện đóPhần FormVấn đề kế tiếp là phải tạo các SC sao cho hợp lí vì các cạnh của SC (hay nói chính xác là cáchình ellipse) mang các giá trị ngẫu nhiên (nếu không, các SC sẽ có cùng hình dạng).Trước hếttạo một hàm trả về giá trị ngẫu nhiên cho các cạnh:Private Function NgauNhien() As LongRandomizeIf Rnd < 0.3333 ThenNgauNhien = -1ElseIf Rnd > 0.3333 And Rnd < 0.6666 ThenNgauNhien = 0ElseNgauNhien = 1End IfEnd FunctionHàm Rnd sẽ trả về một con số trong khoảng giá trị [0-1] và Randomize sẽ sinh một con số mớiphục vụ cho việc lấy Rnd. Nếu không dùng Randomize thì mỗi lần form Load, Rnd sẽ trả về cáccon số y hệt cũ.Trở lại vấn đề tạo các cạnh sao cho hợp lí. Mời bạn xem hình 4. Ở đây tôi lần lượt đánh dấu cáchình theo thứ tự Trái-Đỉnh-Phải-Đáy. Theo đó, hai SC xếp trên cùng hàng sẽ có Phải trước+Tráisau=0. Hai SC trên cùng cột sẽ có Đáy trên+Đỉnh dưới=0. Cách thuận tiện nhất là lưu các dữ liệunày vào mảng 2 chiều cấu trúc (mỗi phần tử mảng là 1 cấu trúc theo kiểu CauTruc), sau đó tạocác SC theo các phần tử này. Chúng ta khai báo lại kiểu CauTrucPrivate Type CauTrucTop as LongBottom as LongLeft as LongRight as LongEnd TypeDim a(100,100) As CauTruc mảng có tối đa 101*101 phần tửSau cùng là chia hình ra thành nhiều mảnh nhỏ (thực chất mỗi mảnh nhỏ là một SC) và dùnghàm BitBlt để copy vùng ảnh bên ảnh đích (ảnh cần cắt) qua SC.Private Declare Function BitBlt Lib gdi32 (ByVal hDestDC As Long, ByVal X As Long,ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long,ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As LongPr ...

Tài liệu được xem nhiều: