(Post 24/10/2008) Khi nói đến lập trình game
3D thường chúng ta nghĩ đến các ngôn ngữ lập trình VC++, C#, với các thư
viện lập trình như OpenGL hoặc DirectX. Vậy còn VB - một ngôn ngữ khá
thông dụng thì sao? Cũng được, ngay cả với Visual Basic 6.0, thông qua
bộ công cụ của 3DState. Bộ công cụ rất dễ sử dụng và miễn phí cho sinh
viên, bạn có thể tải về từ đây.
Bộ công cụ này cung cấp một số lượng lớn các hàm và thư
viện lập trình từ xử lý đối tượng 3D, tệp mô hình 3D (*.MD2, *.MD3,...)
các hàm xử lý bàn phím, chuột, khiến cho việc lập trình game 3D dễ dàng
hơn bao giờ hết.
Hãy xem ví dụ nạp một nhân vật hoạt hình 3D, sau đó dùng
bàn phím để điều khiển hoạt động của nhân vật. Ví dụ này gồm các thủ tục
xử lý sau:
- LoadWorld: thủ tục nạp file thế giới hay còn gọi
là file địa hình của trò chơi;
- LoadPlayer1: thủ tục nạp nhân vật 3D vào thế giới
game;
- DefineAnimations: thủ tục chuẩn bị và định nghĩa
các hành động của nhân vật 3D theo các phím được bấm;
- InitCamera: thủ tục làm việc với các máy quay phim
(camera) một kỹ thuật không thể thiếu với lập trình 3D;
- InitHardware: thủ tục làm việc với các thiết bị card
đồ họa và âm thanh;
- EnterWorldBegin: thủ tục chính để xử lý các hành
động của cả trò chơi, ở ví dụ này, nhân vật 3D sẽ được nạp vào thế giới
và người sử dụng dùng bàn phím máy tính để tương tác với nhân vật, khi
bấm các phím đã được gán trước nhân vật sẽ có hành động tương ứng như
đi lại, chạy, nhảy...
Các bạn có thể đọc thêm phần hướng dẫn của bộ công cụ
để hiểu thêm các hàm và thư viện sử dụng trong chương trình, ở đây tôi
chỉ giải thích sơ qua một số hàm thường dùng nhất khi lập trình game 3D
với bộ thư viện 3DSTATE:
1. Hàm nạp file thế giới:
lngw=STATE_engine_load_world(filename,path1,path2,world_mod);
Hàm này trả về một giá trị Long cho biết việc nạp file
thế giới có thành công hay không; trong đó:
- Tenfile: Chỉ cho chương trình biết tên file thế giới bạn đang muốn
nạp làm nền cho trò chơi;
- path1: Đường dẫn tới thư mục chứa file thế giới;
- path2: Đường dẫn tới thư mục chứa các hình ảnh tạo nên file thế giới;
2. Hàm nạp file mô hình (nhân vật 3D):
lngPlayer = STATE_object_create_from_file(TenFile)
Hàm này trả về một giá trị Long báo cho chương trình
biết việc nạp file mô hình có thành công hay không; trong đó: TenFile
là file mô hình có phần mở rộng *.MD2 hoặc *.MD3 (các loại file định dạng
mô hình Quake 2 hoặc Quake 3);
3. Hàm nạp Skin(áo ,quần , da, tóc,...) cho nhân
vật:
- lngSkin = STATE_bitmap_load(Bitmap1, Trans1)
- STATE_object_set_bitmap lngPlayer, lngSkin
Nhóm hàm này đi kèm với nhau để "mặc" cho nhân
vật "quần áo" và trang bị cho nhân vật "mầu da" đúng
với mô tả trong file ảnh Bitmap1 (chú ý Skin là ảnh jpg hoặc bmp).
4. Nhóm hàm xử lý camera
- lngViewCamera = STATE_camera_get_default_camera() hàm khởi tạo camera
mặc định của chương trình
- STATE_camera_set_object_to_chase lngViewCamera, lngPlayer hàm gắn camera
cho nhân vật 3D theo dạng bám sát;
- STATE_camera_set_chase_distance lngViewCamera, 400 hàm đặt khoảng cách
quan sát từ camera đến nhân vật là 400 điểm
- STATE_camera_set_location1 lngViewCamera, dblCameraPosition(0) hàm này
cực kỳ quan trọng, dùng trong việc cập nhật vị trí camera sau khi nhân
vật đã di chuyển khỏi vị trí ban đầu
5. Thủ tục hiển thị kết quả ra cửa sổ form:
STATE_engine_render Me.hwnd, lngViewCamera
Thủ tục này quan trọng nhất và không thể thiếu, các khâu
chuẩn bị đã xong chúng ta phải hiển thị kết quả lên form hiện tại Me.hwnd
với sự quan sát của camera được gán trong lngViewCamera.
Dưới đây là đoạn mã đơn giản hiển thị một thế giới, một
nhân vật 3D đứng nhún nhẩy, đoạn mã được trích ra từ ví dụ của bộ công
cụ:
-----Chương trình chính-------------
Option Explicit
Dim strCurrentAnimation As String
Dim lngChaseStyle As Long
Private Sub Form_Activate()
LoadWorld "ngoac.wld"
LoadPlayer1
InitCamera
InitHardware
EnterWorldBegin
End Sub
----Thủ tục nạp file thế giới---------
Private Sub LoadWorld(strWorldFileName As String)
STATE_engine_hide_log_window
Dim lngResult As Long
lngResult = STATE_engine_load_world(strWorldFileName, App.Path & "\..\..\Worlds",
App.Path & "\..\..\Worlds\Bitmaps", USER_DEFINED_BEHAVIOR)
If lngResult <> OK Then ExitOnError "Error loading world"
End Sub
---Thủ tục nạp nhân vật 3D------------
Private Sub LoadPlayer1()
Dim lngSkin, lngSkin1 As Long
lngPlayer = STATE_object_create_from_file(App.Path & "\..\..\Worlds\Models\player.md2")
If lngPlayer = 0 Then ExitOnError "Error loading
player"
lngSkin = STATE_bitmap_load(App.Path & "\..\..\Worlds\Models\skin.bmp",
-1)
If lngSkin = 0 Then ExitOnError "Error loading
player skin"
STATE_object_set_bitmap lngPlayer, lngSkin
STATE_object_move lngPlayer, WORLD_SPACE, 100, -100,
-100
STATE_object_rotate_z lngPlayer, 0, WORLD_SPACE
End Sub
---Thủ tục xử lý camera---------------
Private Sub InitCamera()
lngChaseStyle = CHASE_FLEXIBLE
lngViewCamera = STATE_camera_get_default_camera()
STATE_camera_set_chase_type lngViewCamera, lngChaseStyle
STATE_camera_set_object_to_chase lngViewCamera, lngPlayer
STATE_camera_set_chase_distance lngViewCamera, 400
End Sub
Private Sub InitHardware()
If (STATE_3D_card_set_window_mode = VR_ERROR) Then
If (STATE_3D_card_check_hardware_support = YES) Then
MsgBox "Failed to initialize 3D Acceleration.", vbOKOnly, "No
3D card detected"
End If
End If
End Sub
-------Vòng lặp chính xử lý các thao tác của trò
chơi-------------
Private Sub EnterWorldBegin()
Do While GetAsyncKeyState(vbKeyEscape) = 0
DoEvents
STATE_engine_render Me.hwnd, lngViewCamera
Loop
Unload Me
End Sub
------Xử lý lỗi----------------------
Public Sub ExitOnError(strReason As String)
MsgBox strReason, vbExclamation, "Error"
Unload Me
End Sub
-----Kết thúc trò chơi---------------
Private Sub Form_Unload(Cancel As Integer)
STATE_3D_card_use NO
STATE_engine_close
End
End Sub
Lưu ý: Để chạy được chương trình, các
bạn phải tải về bộ công cụ hỗ trợ lập trình miễn phí tại website http://www.3dstate.com
và cài vào máy tính. Sau đó mở file ví dụ tại thư mục như đường dẫn sau:
C:\Program Files\3DSTATE\Visual Basic 3D Developer Studio 6.0 (Student
Package)\SDK Samples\MD2demo\md2demo.vbp.
Nếu chưa chạy được thì các bạn vào phần add module của
Project và thêm tất cả module sẵn có của ví dụ vào như hình bên
Đã đến lúc chúng ta bắt tay vào việc, hãy tự viết cho
mình những game 3D thật hay nhé, chúc các bạn thành công.
Phạm Quang Vinh
(theo PC World VN) |