• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Lập trình DirectX 9 với VB.NET

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Tư 26/03/2008 10:25 pm

Tên bài viết: Lập trình DirectX 9 với VB.NET
Tác giả: ">tài liệu sưu tầm, hdn dịch lại :D
Cấp độ bài viết: Vừa
Tóm tắt: Sê-ri bài viết hướng dẫn sử dụng VB.NET để lập trình đồ họa với DirectX9


Download toàn bộ mã nguồn của bài viết:
SourceCode.rar
(462.97 KiB) Đã tải 3401 lần



Giới thiệu DirectX
DirectX là một bộ các thành phần được thiết kế để giúp lập trình viên có thể phát triển ứng dụng đa phương tiện trên nền Windows như game hay một số ứng dụng khác sử dụng đồ họa 2D, 3D.
Phiên bản DirectX mới nhất hiện giờ là phiên bản 10, nhưng yêu cầu cấu hình rất cao và chỉ được hỗ trợ trên Windows Vista, phiên bản phổ biến hiện tại là DirectX9, với DirectX9, bạn có thể dễ dàng phát triển ứng dụng 2D, 3D một cách nhanh chóng.
Những ngôn ngữ hỗ trợ DirectX9 gồm (trong bộ Visual Studio):
  • Microsoft Visual C#
  • Microsoft Visual Basic.NET
  • Microsoft Visual C++
Bộ thư viện lập trình DirectX được cung cấp bằng các gói DirectX SDK (DirectX Software Development Kit), bạn có thể tải DirectX SDK trên trang của Microsoft.
DirectX 9 bao gồm các thành phần:
DirectX Graphics
  • DirectDraw: Quản lý đồ họa 2D
  • Direct3D: Quản lý đồ họa 3D
Direct Input: Quản lý các đối tượng điều khiển (bàn phím, chuột, joystick,...)
Direct Music: Quản lý âm thanh, nhạc (nhạc nền,...)
Direct Play: Quản lý mạng (để thực hiện các thao tác truyền tải dữ liệu qua mạng, như game online)

DirectX 9 còn gọi là Managed DirectX (MDX) vì nó được xây dựng cho các ngôn ngữ "Managed" (như VB.NET, C#)
Sửa lần cuối bởi hdn vào ngày T.Tư 23/04/2008 1:54 pm với 4 lần sửa.


:|

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Tư 26/03/2008 10:38 pm

Cài đặt
Đầu tiên bạn phải tải bộ DirectX 9 SDK về, phiên bản mới nhất hiện tại là March2008 (mới phát hành vào tháng 3 năm 2008) dung lượng 442.1 MB nhưng không có source mẫu cho VB.NET (vẫn có thể dùng được với VB.NET):
http://www.microsoft.com/downloads/details.aspx?familyid=572BE8A6-263A-4424-A7FE-69CFF1A5B180&displaylang=en
Nếu không, bạn có thể tải bản cũ, có source mẫu kèm cho VB.NET, phát hành tháng 12/2002 (222.4 MB) và phải check Validation để down (hơi mệt 1 tí đối với win ko có bản quyền :)))
http://www.microsoft.com/downloads/details.aspx?FamilyID=124552ff-8363-47fd-8f3b-36c226e04c85&DisplayLang=en
Sau khi download xong, bạn tiến hành cài đặt.
Cài xong, bạn hãy kiểm tra xem VB.NET nhà bạn đã có thể sử dụng DirectX được chưa, bằng cách:
Tạo 1 Windows Application mới, trong cửa sổ Solution Explorer, click phải chuột chọn Add Reference
Hình ảnh

Tìm xem có thấy một lô những thư viện có : Microsoft.DirectX... không
Hình ảnh

Thường thì sẽ có =)) còn rủi ko có thì bạn phải cài lại DxSDK thôi :))
:|

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Năm 27/03/2008 12:10 pm

Bắt đầu với DirectDraw
Cơ bản nhất trong các thành phần của DirectX9: DirectDraw
Ta sử dụng DirectDraw (DD) để lập trình 2D.
Bắt đầu, bạn tạo 1 windows application mới, rồi add reference 2 cái thư viện Microsoft.DirectX và Microsoft.DirectX.DirectDraw vào
Hình ảnh
Hình ảnh

add xong thì cửa sổ Solution explorer nó sẽ ra thế này
Hình ảnh

rồi, vào code của file Form1.vb, gõ vô:

  1.  
  2. 'Báo cáo cho chương trình biết là ta sẽ dùng 2 thư viện này
  3. Imports Microsoft.DirectX
  4. Imports Microsoft.DirectX.DirectDraw
  5.  
  6.  


Ta cần thêm một số biến để quản lý cho DD

  1. Public dddevice As Device = Nothing 'Đối tượng Device cho DD
  2. Public psurface As Surface ' 2 cái surface (bề mặt)
  3. Public ssurface As Surface '
  4. Private clip As Clipper = Nothing
  5.  



Cái Device là để cho DD, 2 cái surface, 1 cái là primary surface và 1 cái là secondary surface. Primary surface là surface nằm trên, cái secondary nằm dưới (giống như 2 miếng giấy chồng lên nhau), những gì ta vẽ lên ssurface sẽ được hiển thị lên psurface để người sử dụng thấy.
Bây giờ vào Project properties, đặt Startup là Sub Main

  1. Public Shared Sub Main()
  2.     Dim GameForm As New form1( ) ' Đối tượng dùng để vẽ sẽ là Form1
  3.     Application.Exit( ) ' Tắt
  4. End Sub
  5.  
  6.  


Tại sub main, chúng ta khởi tạo 1 đối tượng của Form1 tên là GameForm, form này sẽ dùng để hiển thị tất cả những gì ta vẽ (nói chung nó là cửa sổ game :D)
Trong hàm dựng của class form1

  1. Public Sub New()
  2.     MyBase.New() ' Gọi hàm dựng của base class
  3.     InitializeComponent()
  4.  
  5.     Me.Show()
  6.     'Khởi tạo device
  7.     dddevice = Nothing
  8.     dddevice = New Device()
  9.     dddevice.SetCooperativeLevel(Me, CooperativeLevelFlags.FullscreenExclusive)
  10.     Init()
  11.     Gameloop()
  12. End Sub
  13.  
  14.  


Hàm Init để khởi tạo môi trường DirectX và gán môi trường đó vào Form1, hàm Gameloop() là MainLoop (vòng lặp chính - sẽ nói sau) của game.

  1. Public Sub Init( )
  2.     psurface = Nothing
  3.     ssurface = Nothing
  4.     Dim sdesc As New SurfaceDescription()
  5.     clip = New Clipper(dddevice)
  6.     clip.Window = Me
  7.     sdesc.SurfaceCaps.PrimarySurface = True
  8.     sdesc.SurfaceCaps.Flip = True
  9.     sdesc.SurfaceCaps.Complex = True
  10.     sdesc.BackBufferCount = 1
  11.     psurface = New Surface(sdesc, dddevice)
  12.     psurface.Clipper = clip
  13.     sdesc.Clear()
  14.     sdesc.SurfaceCaps.BackBuffer = True
  15.     ssurface = psurface.GetAttachedSurface(sdesc.SurfaceCaps)
  16. End Sub
  17.  
  18. Private Sub Gameloop( )
  19.     Do While Me.Created
  20.         '--------------Thực hiện lệnh----------------
  21.         If Not Me.Focused Then
  22.             Application.DoEvents( )
  23.         Else
  24.             ShowSurface( )
  25.             Application.DoEvents( )
  26.         End If
  27.         '--------------------------------------------
  28.     Loop
  29.     ending( )
  30. End Sub
  31.  
  32.  


MainLoop có nhiệm vụ là: thực hiện lặp lại khối lệnh nằm trong khu "Thực hiện lệnh" liên tục cho đến khi nào có điều kiện để kết thúc thì dừng.
Thủ tục ShowSurface để vẽ lại surface

  1. Public Sub ShowSurface()
  2.     ssurface.ColorFill(Color.White) 'Xóa bề mặt vừa vẽ (thực chất là tô màu trắng toàn bộ)
  3.     psurface.Flip(ssurface, FlipFlags.Wait) 'lật ssurface lên trên
  4. End Sub
  5.  
  6.  


Thủ tục Ending được gọi khi kết thúc mainloop, có nhiệm vụ hủy hết tất cả các đối tượng được tạo ở trên

  1. Public Sub ending()
  2.     dddevice.Dispose()
  3.     psurface.Dispose()
  4.     ssurface.Dispose()
  5.     clip.Dispose()
  6. End Sub
  7.  
  8.  


Bây giờ bạn có thể chạy thử chương trình, nếu muốn tắt chương trình bằng phim ESC (như các game thường thấy), bạn viết code cho sự kiện Key_Down của form

  1. Private Sub form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
  2.     If e.KeyCode = Keys.Escape Then
  3.         ending() 'Khi gặp phím ESC thì gọi thủ tục ending rồi tắt luôn
  4.         End
  5.     End If
  6. End Sub
  7.  
  8.  
:|

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Năm 27/03/2008 1:28 pm

Sự cố với Surface và khắc phục
Ở bài viết trên, ta đã tìm hiểu về surface, có một vấn đề ở đây. Đó là khi bạn minimize cửa sổ game rồi đưa lên lại, có thể nó sẽ đen thui, ko thấy gì nữa x_x , trong phần này, ta sẽ khắc phục vấn đề này.
Trong phần chương trình ở bài trước, ta sẽ thay đổi 1 tí và thêm 1 thủ tục GFocus
Thủ tục Init()

  1. Public Sub New( )
  2.     MyBase.New( )
  3.     InitializeComponent( )
  4.     Me.Show( )
  5.     AddHandler Me.GotFocus, AddressOf GFocus ' Thêm cái này
  6.     dddevice = Nothing
  7.     dddevice = New Device( )
  8.     dddevice.SetCooperativeLevel(Me, CooperativeLevelFlags.FullscreenExclusive)
  9.     Init()
  10.     GameLoop()
  11. End Sub
  12.  


Dòng lệnh vừa thêm vào: AddHandler Me.GotFocus, AddressOf GFocus để điều khiển sự kiện GotFocus của form, khi form mất focus, các surface sẽ mất, sau đó khi form lại nhận focus thì sẽ thực hiện thủ tục GFocus

  1.  
  2. Public Sub GFocus(ByVal sender As Object, ByVal e As System.EventArgs)
  3.     ending() 'Huỷ cái form cũ
  4.     Dim newform As New Form1() 'tạo lại form mới
  5. End Sub
  6.  
  7.  


Sau khi được nhận focus mới, form cũ sẽ bị huỷ và tạo lại 1 form mới.
Sửa trong ShowSurface() tí

  1. Public Sub ShowSurface()
  2.     Try
  3.         ssurface.ColorFill(Color.White)
  4.         psurface.Flip(ssurface, FlipFlags.Wait)
  5.         Catch e As Exception
  6.         Init()
  7.     End Try
  8. End Sub
  9.  
  10.  


Thêm khối try...end try vì khi tạo lại form, hàm init có thể sẽ sinh lỗi.
Rồi, giờ bạn chạy thử xem, thử thu cửa sổ game xuống taskbar rồi gọi nó lên lại xem ;) giờ thì không bị lỗi như trước nữa
:|

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Năm 27/03/2008 1:39 pm

Load hình vào surface
Bây giờ ta sẽ tìm hiểu cách để vẽ một hình ảnh lên màn hình bằng cách khởi tạo 1 surface, trên surface đó đã được gắng cái hình cần vẽ lên :D
Trong phần khai báo ssurface, psurface, ddevice, bạn thêm vào 1 cái surface nữa tên charsurface



Thủ tục Init thêm vào đoạn :

  1. sdesc.Clear()
  2. sdesc.SurfaceCaps.OffScreenPlain = True
  3. charsurface = New Surface("gametitle.bmp", sdesc, dddevice)
  4.  


  1.  
  2. Public Sub Init( )
  3.     psurface = Nothing
  4.     ssurface = Nothing
  5.     Dim sdesc As New SurfaceDescription()
  6.     clip = New Clipper(dddevice)
  7.     clip.Window = Me
  8.     sdesc.SurfaceCaps.PrimarySurface = True
  9.     sdesc.SurfaceCaps.Flip = True
  10.     sdesc.SurfaceCaps.Complex = True
  11.     sdesc.BackBufferCount = 1
  12.     psurface = New Surface(sdesc, dddevice)
  13.     psurface.Clipper = clip
  14.     sdesc.Clear()
  15.     sdesc.SurfaceCaps.BackBuffer = True
  16.     ssurface = psurface.GetAttachedSurface(sdesc.SurfaceCaps)
  17.     sdesc.Clear()
  18.     sdesc.SurfaceCaps.OffScreenPlain = True
  19.     charsurface = New Surface("gametitle.bmp", sdesc, dddevice) 'Load file gametitle.bmp vào charsurface
  20. End Sub
  21.  


Đoạn code thêm vào có nhiệm vụ, xoá sdesc đi, lấy file gametitle.bmp từ trên đĩa cứng "dán" vào charsurface và đưa charsurface lên sdesc.
(sdesc là đối tượng quản lý các surface)
Trong thủ tục ShowSurface(), ta sẽ vẽ những thứ ta cần tại đây

  1. Public Sub ShowSurface()
  2.     Try
  3.         ssurface.ColorFill(Color.White)
  4.         ssurface.DrawFast(150, 150, charsurface, DrawFastFlags.DoNotWait) 'vẽ charsurface ra
  5.         ssurface.ForeColor = Color.Black
  6.         ssurface.DrawText(540, 565, "CaulacboVB", False) 'In lên màn hình dòng chữ CaulacboVB ở toạ độ (540,565), chữ màu đen
  7.         psurface.Flip(ssurface, FlipFlags.Wait)
  8.     Catch ex As SurfaceLostException
  9.         Init()
  10.     End Try
  11. End Sub
  12.  
:|

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Năm 27/03/2008 2:05 pm

Diễn hoạt (Animation)
Cái chữ animation là làm cho hình ảnh chuyển động, nôm na là thế, dịch ra tiếng việt nên chọn chữ diễn hoạt cho nó gọn, nhưng chữ đó hơi "xấu" :D
Trong bài trên, ta đã biết cách vẽ một hình ảnh ra màn hình, trong bài này, ta sẽ vẽ một hình ảnh chuyển động lên màn hình.
Ở đoạn load hình trong thủ tục Init, bạn sửa lại tên file là: character.bmp
Hình ảnh
image8.gif (bạn phải dùng paint hoặc photoshop lưu file này lại thành character.bmp - DirectDraw dùng file BMP)

File character.bmp này, bạn thấy nó có nhiều hình giống nhau mô tả việc di chuyển của 1 thằng cha có râu :)), ta sẽ load hình này và vẽ từng khúc (frame) của nó, mỗi khúc có kích thước là 141x250 (file này tương đương 4 khúc của hoạt động)
Hình ảnh
Mỗi khúc vẽ ra sẽ như thế này

Thay đổi vị trí vẽ liên tục trong 1 khoảng thời gian ngắng thì sẽ có cảm giác là thằng này đang bước đi thật (cái này thì ai cũng biết, kĩ thuật hoạt hình cơ bản)
Để xác định được 4 khúc của hình, ta dùng đối tượng Rectangle

  1. Private frames(4) As Rectangle
  2. Private charsurface As Surface
  3. Private frm4act As Integer = 0
  4.  
  5.  


Viết thủ tục createFrame để xác định vùng nào cần vẽ của frame nào

  1. Public Sub createframes()
  2.         Dim x As Integer
  3.         For x = 0 To 3
  4.                 frames(x) = New Rectangle(141 * x, 0, 141, 250)
  5.         Next
  6. End Sub
  7.  


đối tượng Rectangle có tham số khởi tạo là (x, y, width, height), mỗi frame ta sẽ vẽ ra có kích thước 141x250 tương đương width=141, height=250, vị trí x=141*x để mỗi frame, chương trình sẽ lấy vị trí khớp cho nó, y=0 là vì, nếu ta lấy giá trị y khác 0, vùng được vẽ ra (viền đỏ) sẽ bị cắt hình.
Hình ảnh
y=0

Hình ảnh
y khác 0

Giờ ta sẽ vẽ nó ra, sửa thủ tục ShowSurface thành thế này:

  1. Public Sub ShowSurface()
  2.         Try
  3.                 ssurface.ColorFill(Color.Red)
  4.                 ssurface.DrawFast(100, 300, charsurface, frames(frm4act), DrawFastFlags.DoNotWait)
  5.         Catch ex As SurfaceLostException
  6.                 Init()
  7.         End Try
  8.         psurface.Flip(ssurface, FlipFlags.Wait)
  9. End Sub
  10.  


Vẽ charsurface ra với kích thước của frames(frm4act), vị trí 100:300
frm4act là 1 cái biến thôi, nó cho biết frame hiện tại là frame nào, bây giờ nếu chạy thì ta sẽ chưa thấy nó chuyển động, mục đích của ta là khi nhấn phím mũi tên, thằng râu này nó mới hoạt động, bằng cách tăng giảm giá trị của frm4act.

  1. Private Sub form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
  2.         If e.KeyCode = Keys.Right Then
  3.                 frm4act = frm4act + 1
  4.                 if frm4act > 3 then 'Nếu frm4act vượt quá 3 thì
  5.                         frm4act = 0 ' cho nó quay về 0
  6.                 End If
  7.                 ShowSurface( )
  8.         End if
  9.         If e.KeyCode = Keys.Escape Then
  10.                 ending()
  11.                 End
  12.         End If
  13. End Sub
  14.  


Giờ test nào, khi nhấn phím mũi tên sang phải, bạn sẽ thấy thằng râu chạy (chỉ hoạt hình thôi), nhưng nó chạy mà ko lết tới trước đc tí nào cả :)), nếu muốn nó chạy tới, bạn thêm 1 biến x4act để lưu toạ độ x cho nó.

  1. Private x4act As Integer = 100


lệnh vẽ ở thủ tục Showsurface cũng thay đổi như thế này

  1. ssurface.DrawFast(x4act, 300, charsurface, frames(frm4act), DrawFastFlags.DoNotWait)


vẽ thằng râu ra với toạ độ x4act:300
sự kiện keyDown sửa lại

  1. Private Sub form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
  2.         If e.KeyCode = Keys.Right Then
  3.                 frm4act = frm4act + 1
  4.                 x4act += 5 ' cho thằng râu chạy tới (thay đổi toạ độ x của nó)
  5.                 if frm4act > 3 then
  6.                         frm4act = 0
  7.                 End If
  8.         End If
  9.         ShowSurface( )
  10.         End if
  11.         If e.KeyCode = Keys.Escape Then
  12.                 ending()
  13.                 End
  14.         End If
  15. End Sub
  16.  


Giờ chạy thử xem, thằng râu đã chạy được rồi đấy :D
Nhưng vẫn còn cái nền màu xám khó chịu, ở bài sau, ta sẽ tìm hiểu cách bỏ cái nền đó.
:|

vbthathay
Bài viết: 2
Ngày tham gia: T.Tư 09/04/2008 9:37 am

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi vbthathay » T.Ba 22/04/2008 1:14 pm

tiếp phần sau đi anh ơi
hay đấy !

hieutq
Bài viết: 2
Ngày tham gia: T.Sáu 18/04/2008 10:40 am

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hieutq » T.Ba 22/04/2008 5:19 pm

Mới vào nghề nên đọc hơi khó hỉu tí nhưng thây hay đây.
Tiếp bài kế tiếp đi U
Nếu được up cái Code cho mọi người được kô U

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Tư 23/04/2008 11:58 am

mình vẫn đang dịch tiếp :D dạo này gần thi học kì nên hơi bận
Ok, đã có code, up ở ngay trên đầu bài
Sửa lần cuối bởi hdn vào ngày T.Tư 23/04/2008 1:55 pm với 1 lần sửa.
:|

Hình đại diện của người dùng
THE LAST LEAF
VIP
VIP
Bài viết: 60
Ngày tham gia: T.Ba 24/05/2005 9:32 am
Đến từ:
Liên hệ:

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi THE LAST LEAF » T.Tư 23/04/2008 12:07 pm

Bài viết rất hay! Cố gắng phát huy tiếp nhé chú Huy dốt net :D

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Tư 23/04/2008 1:44 pm

ặc, em đã đổi tên rồi đấy nhá :D


Trong suốt
Ở những bài trước, ta đã biết cách load và vẽ một hình từ file lên màn hình, hoạt hình, tuy nhiên những hình ảnh vẫn bị dính cái nền xám, bài này ta sẽ tìm cách xử chúng :D
Nguyên tắc để bỏ cái màu nền xám kia đi là ta đặt thuộc tính ColorKey cho nó, khi ta vẽ một ảnh lên màn hình, với thuộc tính ColorKey để chỉ định màu của cái nền, thì khi vẽ ra, máy sẽ xử lý bỏ cái nền đó đi.
Giờ ta sẽ khai báo một biến làm ColorKey

Mã: Chọn hết

  1. Private ck As ColorKey

Thủ tục Init bây giờ sửa lại:

Mã: Chọn hết

  1.  
  2.  Public Sub Init( )
  3.  
  4. psurface = Nothing
  5. ssurface = Nothing
  6. Dim sdesc As New SurfaceDescription()
  7. clip = New Clipper(dddevice)
  8. clip.Window = targetform
  9. sdesc.SurfaceCaps.PrimarySurface = True
  10. sdesc.SurfaceCaps.Flip = True
  11. sdesc.SurfaceCaps.Complex = True
  12. sdesc.BackBufferCount = 1
  13. psurface = New Surface(sdesc, dddevice)
  14. psurface.Clipper = clip
  15. sdesc.Clear()
  16. sdesc.SurfaceCaps.BackBuffer = True
  17. ssurface = psurface.GetAttachedSurface(sdesc.SurfaceCaps)
  18. sdesc.Clear()
  19. sdesc.SurfaceCaps.OffScreenPlain = True
  20. ck.ColorSpaceHighValue = RGB(153, 153, 153)
  21. ck.ColorSpaceLowValue = RGB(153, 153, 153)
  22. charsurface = New Surface("character.bmp", sdesc, dddevice) 'initialize new surface
  23. charsurface.SetColorKey(ColorKeyFlags.SourceDraw, ck) 'set the color key for the surface
  24.  
  25. End Sub
  26.  

không có gì đặc biệt, chỉ có khúc này:

Mã: Chọn hết

  1.  
  2. ck.ColorSpaceHighValue = RGB(153, 153, 153)
  3. ck.ColorSpaceLowValue = RGB(153, 153, 153)
  4.  

ColorSpaceHighValue và ColorSpaceLowValue, 2 giá trị này nếu khác nhau thì ảnh sẽ mờ mờ trong trong kiểu như gương, đây là khoảng trong suốt mà ta có thể tùy biến, ở đây ta muốn làm mất luôn cái nền màu xám, vì thế nên ta cho 2 giá trị giống nhau, đều là (153, 153, 153) (đây là mã màu của màu xám trong hệ RGB)
Sau đó ta gán thuộc tính ColorKey của Surface với ck.

Mã: Chọn hết

  1. charsurface.SetColorKey(ColorKeyFlags.SourceDraw, ck)

Bây giờ, ColorKey đã được gán vào cho surface, nhưng vẽ ra thì vẫn chưa thấy mất cái nền, đó là vì ở dòng lệnh vẽ hình, ta vẫn chưa cho nó biết là ta vẽ cái hình ra theo colorKey, bạn hãy sửa thủ tục ShowSurface() thành thế này:

Mã: Chọn hết

  1.  
  2.  Public Sub ShowSurface()
  3. Try
  4. ssurface.ColorFill(Color.Red)
  5.  
  6. ssurface.DrawFast(x4act, 100, charsurface, frames(frm4act), DrawFastFlags.SourceColorKey) 'Vẽ ra, giờ có thêm tham số DrawFastFlags.SourceColorKey tức là vẽ có xài ColorKey
  7.  
  8. Catch ex As SurfaceLostException
  9. Init()
  10. End Try
  11.  
  12. psurface.Flip(ssurface, FlipFlags.Wait)
  13. End Sub
  14.  

Xong! giờ bạn chạy thử xem nào.
:|

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Tư 23/04/2008 5:18 pm

Hình nền
Trong phần này, ta sẽ vẽ một hình nền (background) nằm ở phía sau "thằng râu" ở các bài trên, khi "thằng râu" bước đi thì cái hình nền cũng sẽ trượt theo, tạo cảm giác là nó đang bước đi thật (giống kiểu của game mario - gọi là platform game)
Đầu tiên, ta cần khởi tạo thêm:

Mã: Chọn hết

  1.  
  2. Private backrect As Rectangle
  3. Private backsurface As Surface = Nothing
  4.  
  5. Private xaxis as Integer
  6.  

giống như khi vẽ "thằng râu", bạn sẽ có một rectangle làm giới hạn cho khung nhìn, một surface để đưa hình làm nền vào và một biến xaxis để lưu vị trí của nền.
Sau đó ta viết thủ tục Background() để khởi tạo background

Mã: Chọn hết

  1.  
  2. Private Sub Background()
  3. Dim sdesc As New SurfaceDescription()
  4. sdesc.SurfaceCaps.OffScreenPlain = True
  5. backsurface = New Surface("background.bmp", sdesc, dddevice)
  6. backrect.Size = New Size(800, 600)
  7. End Sub
  8.  

và gọi thủ tục Background() ở cuối thủ tục Init()
Trong đoạn code trên, ta khởi tạo một surface để chứa hình nền, hình sẽ được load từ file background.bmp (có trong cùng thư mục chứa mã nguồn, hoặc bạn có thể download ở đây)
Background.rar
File background.bmp
(135.2 KiB) Đã tải 665 lần

và khởi tạo một rectangle có kích thước 800x600 (kích thước màn hình game), khi vẽ ta sẽ chỉ vẽ một khung chừng đó thôi.
[Còn tiếp...]
:|

gatoi_it
Thành viên trung thành
Thành viên trung thành
Bài viết: 207
Ngày tham gia: T.Tư 26/03/2008 6:10 pm
Đến từ: Quê cha đất tổ
Been thanked: 4 time
Liên hệ:

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi gatoi_it » T.Bảy 24/05/2008 5:24 pm

Anh cho em hỏi mấy câu sau:
1. Khi khai báo clip:

Mã: Chọn hết

  1. Private clip As Clipper = Nothing

rồi sử dụng trong:

Mã: Chọn hết

  1. clip = New Clipper(dddevice)
  2. clip.Window = Me
  3. 'some code
  4. psurface.Clipper = clip
  5.  

Có tác dụng gì?
2. Dòng lệnh:

Mã: Chọn hết

  1. sdesc.SurfaceCaps.PrimarySurface = True
  2. sdesc.SurfaceCaps.Flip = True
  3. sdesc.SurfaceCaps.Complex = True


Mã: Chọn hết

  1. sdesc.SurfaceCaps.BackBuffer = True
  2. ssurface = psurface.GetAttachedSurface(sdesc.SurfaceCaps)

Có công dụng gì?
3. Cái DrawFastFlags.DoNotWait để làm gì? Vẽ không cần đợi à?
4. Làm thế nào để vẽ trong chế độ Window?
Cảm ơn! :)
XFARM.CC

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Bảy 24/05/2008 5:48 pm

4. Vẽ trong chế độ window? chẳng phải là đang vẽ lên form đấy sao?
1. Clipper có tác dụng giữ lại sprite khi nó ra khỏi phạm vi màn hình, DirectX7 không hỗ trợ chức năng này nên khi chỉ 1 phần của sprite ra khỏi phạm vi màn hình nó sẽ biến mất, clip có tác dụng giữ nó lại.
2. sdesc (SurfaceDecription) tạm hiểu là đối tượng định nghĩa/định hình cho surface, ở dòng lệnh trên, ta "nói" cho chương trình biết:
sdesc.SurfaceCaps.PrimarySurface = True => kích hoạt primary surface
sdesc.SurfaceCaps.Flip = True => kích hoạt tính năng flip (khả năng lật qua lật lại giữa các surface)
sdesc.SurfaceCaps.Complex = True => định nghĩa kiểu "surface phức tạp", các surface con có thể gắng vào surface ban đầu nhờ kiểu này
sdesc.SurfaceCaps.BackBuffer = True => bộ đệm cho surface, giúp cho việc vẽ/flip ổn định hơn
ssurface = psurface.GetAttachedSurface(sdesc.SurfaceCaps) => ssurface là surface con của psurface
3. Thực ra đây là một tham số khi vẽ bằng DirectDraw, ít có tài liệu nói rõ về vấn đề này (hoặc có thể là mình tìm ko ra :D), theo thực nghiệm bạn sẽ hiểu hơn về các thông số này, chất lượng hình ảnh tùy thuộc vào các thông số này.
:|

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi 1045007 » CN 27/07/2008 4:32 pm

Thế OpenGL hdn có biết không? nếu biết post lên cho anh em xem luôn đi :D Hõm rày tim thằng DirectX này muốn mệt ai dè trong 4r có hết. :)) :)) :))
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

giongto35
Thành viên danh dự
Thành viên danh dự
Bài viết: 194
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
Been thanked: 1 time
Liên hệ:

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi giongto35 » CN 27/07/2008 5:30 pm

anh ấy biết hết á , nhưng cái nào cũng 1 tí thui :)) . OGL xài vật vả lắm , dễ thì dễ nhưng hỗ trợ ko bằng dx đâu , load model phải mất chục dòng code :D
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » CN 27/07/2008 7:30 pm

quả thực thì cái món gì mỗ cũng nhai qua 1 tí cho biết, openGL cũng biết, cũng có down 1 mớ tut về, đợi up lên nhé (nhưng mà dùng với VB6), với .NET thì có thể tham quan: ExoEngine
:|

Hình đại diện của người dùng
Fr0z3n
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 51
Ngày tham gia: T.Tư 30/04/2008 7:15 am
Liên hệ:

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi Fr0z3n » T.Hai 28/07/2008 2:30 am

anh có tut về DirectInput ko anh :| tut cho em coi :D

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi hdn » T.Hai 28/07/2008 11:27 am

:|

kien_it
Bài viết: 4
Ngày tham gia: T.Tư 24/12/2008 4:03 pm

Re: Lập trình DirectX 9 với VB.NET

Gửi bàigửi bởi kien_it » T.Ba 05/05/2009 9:25 am

Anh ơi post bài tiếp đi anh hay quá trời anh à =D>


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.4 khách